summaryrefslogtreecommitdiff
path: root/sys/powerpc
diff options
context:
space:
mode:
authorPaolo Pisati <piso@FreeBSD.org>2007-05-31 19:25:35 +0000
committerPaolo Pisati <piso@FreeBSD.org>2007-05-31 19:25:35 +0000
commit3401f2c1dfdb11f0c83a8394c7c14b2c69cb1f63 (patch)
tree970cc806d49c2592d85b73107b989311f414b03f /sys/powerpc
parentbba4862c6482ae036365342c54e10864922f4c74 (diff)
Notes
Diffstat (limited to 'sys/powerpc')
-rw-r--r--sys/powerpc/powerpc/intr_machdep.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/sys/powerpc/powerpc/intr_machdep.c b/sys/powerpc/powerpc/intr_machdep.c
index f4931473bbb8..287df911232a 100644
--- a/sys/powerpc/powerpc/intr_machdep.c
+++ b/sys/powerpc/powerpc/intr_machdep.c
@@ -198,7 +198,7 @@ intr_handle(u_int irq)
struct ppc_intr *i;
struct intr_event *ie;
struct intr_handler *ih;
- int error, sched;
+ int error, sched, ret;
i = ppc_intrs[irq];
if (i == NULL)
@@ -216,6 +216,7 @@ intr_handle(u_int irq)
* Execute all fast interrupt handlers directly without Giant. Note
* that this means that any fast interrupt handler must be MP safe.
*/
+ ret = 0;
sched = 0;
critical_enter();
TAILQ_FOREACH(ih, &ie->ie_handlers, ih_next) {
@@ -225,7 +226,15 @@ intr_handle(u_int irq)
}
CTR4(KTR_INTR, "%s: exec %p(%p) for %s", __func__,
ih->ih_filter, ih->ih_argument, ih->ih_name);
- ih->ih_filter(ih->ih_argument);
+ ret = ih->ih_filter(ih->ih_argument);
+ /*
+ * Wrapper handler special case: see
+ * i386/intr_machdep.c::intr_execute_handlers()
+ */
+ if (!sched) {
+ if (ret == FILTER_SCHEDULE_THREAD)
+ sched = 1;
+ }
}
critical_exit();