From owner-svn-src-all@FreeBSD.ORG Tue Jun 9 18:18:42 2009 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0FB501065670; Tue, 9 Jun 2009 18:18:42 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id F041F8FC1D; Tue, 9 Jun 2009 18:18:41 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n59IIfCU079697; Tue, 9 Jun 2009 18:18:41 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n59IIfD5079688; Tue, 9 Jun 2009 18:18:41 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <200906091818.n59IIfD5079688@svn.freebsd.org> From: Marcel Moolenaar Date: Tue, 9 Jun 2009 18:18:41 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r193847 - in head/sys/arm: arm at91 include mv sa11x0 xscale/i80321 xscale/i8134x xscale/ixp425 xscale/pxa X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 09 Jun 2009 18:18:42 -0000 Author: marcel Date: Tue Jun 9 18:18:41 2009 New Revision: 193847 URL: http://svn.freebsd.org/changeset/base/193847 Log: Pass the previously returned IRQ back to arm_get_next_irq() so that the implementation can guarantee forward progress in the event of a stuck interrupt or interrupt storm. This is especially critical for fast interrupt handlers, as they can cause a hard hang in that case. When first called, arm_get_next_irq() is passed -1. Obtained from: Juniper Networks, Inc. Modified: head/sys/arm/arm/intr.c head/sys/arm/at91/at91.c head/sys/arm/include/intr.h head/sys/arm/mv/ic.c head/sys/arm/sa11x0/sa11x0_irqhandler.c head/sys/arm/xscale/i80321/i80321.c head/sys/arm/xscale/i8134x/i81342.c head/sys/arm/xscale/ixp425/ixp425.c head/sys/arm/xscale/pxa/pxa_icu.c Modified: head/sys/arm/arm/intr.c ============================================================================== --- head/sys/arm/arm/intr.c Tue Jun 9 17:21:47 2009 (r193846) +++ head/sys/arm/arm/intr.c Tue Jun 9 18:18:41 2009 (r193847) @@ -120,7 +120,8 @@ arm_handler_execute(struct trapframe *fr int i; PCPU_INC(cnt.v_intr); - while ((i = arm_get_next_irq()) != -1) { + i = -1; + while ((i = arm_get_next_irq(i)) != -1) { intrcnt[intrcnt_tab[i]]++; event = intr_events[i]; if (intr_event_handle(event, frame) != 0) { Modified: head/sys/arm/at91/at91.c ============================================================================== --- head/sys/arm/at91/at91.c Tue Jun 9 17:21:47 2009 (r193846) +++ head/sys/arm/at91/at91.c Tue Jun 9 18:18:41 2009 (r193847) @@ -702,9 +702,8 @@ arm_mask_irq(uintptr_t nb) } int -arm_get_next_irq() +arm_get_next_irq(int last __unused) { - int status; int irq; Modified: head/sys/arm/include/intr.h ============================================================================== --- head/sys/arm/include/intr.h Tue Jun 9 17:21:47 2009 (r193846) +++ head/sys/arm/include/intr.h Tue Jun 9 18:18:41 2009 (r193847) @@ -56,7 +56,7 @@ #include -int arm_get_next_irq(void); +int arm_get_next_irq(int); void arm_mask_irq(uintptr_t); void arm_unmask_irq(uintptr_t); void arm_setup_irqhandler(const char *, int (*)(void*), void (*)(void*), Modified: head/sys/arm/mv/ic.c ============================================================================== --- head/sys/arm/mv/ic.c Tue Jun 9 17:21:47 2009 (r193846) +++ head/sys/arm/mv/ic.c Tue Jun 9 18:18:41 2009 (r193847) @@ -137,7 +137,7 @@ static devclass_t mv_ic_devclass; DRIVER_MODULE(ic, mbus, mv_ic_driver, mv_ic_devclass, 0, 0); int -arm_get_next_irq(void) +arm_get_next_irq(int last __unused) { int irq; Modified: head/sys/arm/sa11x0/sa11x0_irqhandler.c ============================================================================== --- head/sys/arm/sa11x0/sa11x0_irqhandler.c Tue Jun 9 17:21:47 2009 (r193846) +++ head/sys/arm/sa11x0/sa11x0_irqhandler.c Tue Jun 9 18:18:41 2009 (r193847) @@ -108,7 +108,7 @@ static uint32_t sa11x0_irq_mask = 0xffff extern vm_offset_t saipic_base; int -arm_get_next_irq() +arm_get_next_irq(int last __unused) { int irq; Modified: head/sys/arm/xscale/i80321/i80321.c ============================================================================== --- head/sys/arm/xscale/i80321/i80321.c Tue Jun 9 17:21:47 2009 (r193846) +++ head/sys/arm/xscale/i80321/i80321.c Tue Jun 9 18:18:41 2009 (r193847) @@ -240,7 +240,7 @@ i80321_iintsrc_read(void) } int -arm_get_next_irq() +arm_get_next_irq(int last __unused) { int irq; Modified: head/sys/arm/xscale/i8134x/i81342.c ============================================================================== --- head/sys/arm/xscale/i8134x/i81342.c Tue Jun 9 17:21:47 2009 (r193846) +++ head/sys/arm/xscale/i8134x/i81342.c Tue Jun 9 18:18:41 2009 (r193847) @@ -295,7 +295,7 @@ arm_unmask_irq(uintptr_t nb) } int -arm_get_next_irq(void) +arm_get_next_irq(int last __unused) { uint32_t val; val = intpnd0_read() & intr_enabled0; Modified: head/sys/arm/xscale/ixp425/ixp425.c ============================================================================== --- head/sys/arm/xscale/ixp425/ixp425.c Tue Jun 9 17:21:47 2009 (r193846) +++ head/sys/arm/xscale/ixp425/ixp425.c Tue Jun 9 18:18:41 2009 (r193847) @@ -202,7 +202,7 @@ ixp435_irq_read(void) } int -arm_get_next_irq(void) +arm_get_next_irq(int last __unused) { uint32_t irq; Modified: head/sys/arm/xscale/pxa/pxa_icu.c ============================================================================== --- head/sys/arm/xscale/pxa/pxa_icu.c Tue Jun 9 17:21:47 2009 (r193846) +++ head/sys/arm/xscale/pxa/pxa_icu.c Tue Jun 9 18:18:41 2009 (r193847) @@ -128,7 +128,7 @@ static devclass_t pxa_icu_devclass; DRIVER_MODULE(pxaicu, pxa, pxa_icu_driver, pxa_icu_devclass, 0, 0); int -arm_get_next_irq() +arm_get_next_irq(int last __unused) { int irq;