diff --git a/sys/amd64/amd64/intr_machdep.c b/sys/amd64/amd64/intr_machdep.c index 3dc1361ea9f7..9e151ff9ed33 100644 --- a/sys/amd64/amd64/intr_machdep.c +++ b/sys/amd64/amd64/intr_machdep.c @@ -390,13 +390,13 @@ intr_execute_handlers(struct intsrc *isrc, struct trapframe *frame) isrc->is_pic->pic_disable_source(isrc, PIC_EOI); else isrc->is_pic->pic_eoi_source(isrc); - critical_exit(); /* Schedule the ithread if needed. */ if (thread) { error = intr_event_schedule_thread(ie); KASSERT(error == 0, ("bad stray interrupt")); } + critical_exit(); td->td_intr_nesting_level--; } #endif diff --git a/sys/i386/i386/intr_machdep.c b/sys/i386/i386/intr_machdep.c index a07ee77ed58c..b1d8db9f662e 100644 --- a/sys/i386/i386/intr_machdep.c +++ b/sys/i386/i386/intr_machdep.c @@ -391,13 +391,13 @@ intr_execute_handlers(struct intsrc *isrc, struct trapframe *frame) isrc->is_pic->pic_disable_source(isrc, PIC_EOI); else isrc->is_pic->pic_eoi_source(isrc); - critical_exit(); /* Schedule the ithread if needed. */ if (thread) { error = intr_event_schedule_thread(ie); KASSERT(error == 0, ("bad stray interrupt")); } + critical_exit(); td->td_intr_nesting_level--; } #endif diff --git a/sys/ia64/ia64/interrupt.c b/sys/ia64/ia64/interrupt.c index 5460c59428ba..5d30566e8b98 100644 --- a/sys/ia64/ia64/interrupt.c +++ b/sys/ia64/ia64/interrupt.c @@ -441,7 +441,6 @@ ia64_dispatch_intr(void *frame, u_int vector) thread = 1; } } - critical_exit(); if (thread) { ia64_intr_mask((void *)(uintptr_t)vector); @@ -449,6 +448,7 @@ ia64_dispatch_intr(void *frame, u_int vector) KASSERT(error == 0, ("%s: impossible stray", __func__)); } else ia64_intr_eoi((void *)(uintptr_t)vector); + critical_exit(); #endif } diff --git a/sys/powerpc/powerpc/intr_machdep.c b/sys/powerpc/powerpc/intr_machdep.c index 7daaf232c068..7653347579f3 100644 --- a/sys/powerpc/powerpc/intr_machdep.c +++ b/sys/powerpc/powerpc/intr_machdep.c @@ -280,7 +280,6 @@ powerpc_dispatch_intr(u_int vector, struct trapframe *tf) sched = 1; } } - critical_exit(); if (sched) { PIC_MASK(pic, i->irq); @@ -289,6 +288,7 @@ powerpc_dispatch_intr(u_int vector, struct trapframe *tf) __func__)); } else PIC_EOI(pic, i->irq); + critical_exit(); #endif return; diff --git a/sys/sparc64/sparc64/intr_machdep.c b/sys/sparc64/sparc64/intr_machdep.c index aa9a38a020de..735b4c0f230f 100644 --- a/sys/sparc64/sparc64/intr_machdep.c +++ b/sys/sparc64/sparc64/intr_machdep.c @@ -286,7 +286,6 @@ intr_execute_handlers(void *cookie) } if (!thread) intr_enable_eoi(iv); - critical_exit(); /* Schedule a heavyweight interrupt process. */ if (thread) @@ -295,6 +294,7 @@ intr_execute_handlers(void *cookie) error = EINVAL; else error = 0; + critical_exit(); if (error == EINVAL) #else if (intr_event_handle(iv->iv_event, NULL) != 0)