Date: Mon, 04 Jun 2001 10:00:25 +1000 (EST) From: peter.jeremy@alcatel.com.au To: FreeBSD-gnats-submit@freebsd.org Subject: alpha/27866: Fast interrupts handled via interrupt threads Message-ID: <200106040000.f5400PU71784@gsmx07.alcatel.com.au>
next in thread | raw e-mail | index | archive | help
>Number: 27866
>Category: alpha
>Synopsis: Fast interrupts handled via interrupt threads
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: freebsd-alpha
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Sun Jun 03 17:10:00 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator: Peter Jeremy
>Release: FreeBSD 5.0-CURRENT alpha
>Organization:
Alcatel Australia Limited
>Environment:
5.0-CURRENT from around 25th May
>Description:
`Fast' interrupts can be handled synchronously by calling
the bus and device interrupt handler directly from
/sys/alpha/alpha/interrupt.c:alpha_dispatch_intr(), whereas
other interrupts are scheduled as interrupt threads.
Unfortunately, the test for fast interrupts in interrupt.c
incorrectly uses INTR_FAST instead of IH_FAST, so fast
interrupts aren't detected. This significantly increases
latencies for fast interrupts and can lead to SILO overflows.
This was detected by some code I added to determine what was
contributing to sio interrupt latencies. I discovered that
the `fast interrupt found' probe was not being triggered.
>How-To-Repeat:
Code inspection: If alpha_setup_intr() is called with
INTR_FAST specified in <flags>, this will be passed onto
ithread_add_handler() where it will be mapped to
(IH_FAST | IH_EXCLUSIVE) in (struct intrhand).ih_flags.
When the interrupt occurs, alpha_dispatch_intr() tests
(struct intrhand).ih_flags against INTR_FAST and so fails
to detect that it is a fast interrupt.
>Fix:
[This fix has been tested on my Multia, but the following is
a re-type of the fix]
Index: interrupt.c
===================================================================
RCS file: /home/CVSROOT/src/sys/alpha/alpha/interrupt.c,v
retrieving revision 1.52
diff -u -r1.52 interrupt.c
--- interrupt.c 2001/05/15 23:22:17 1.52
+++ interrupt.c 2001/06/03 23:41:17
@@ -434,7 +434,7 @@
* that this means that any fast interrupt handler must be MP safe.
*/
ih = TAILQ_FIRST(&ithd->it_handlers);
- if ((ih->ih_flags & INTR_FAST) != 0) {
+ if ((ih->ih_flags & IH_FAST) != 0) {
ih->ih_handler(ih->ih_argument);
return;
}
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-alpha" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200106040000.f5400PU71784>
