Oh my dear. The ground may open and swallow me. This crappy piece of optimisation in xnintr_edge_shirq_handler() I introduced both to 2.4 and (sadly) the 2.3.x stable series cannot work. It must stay as it used to: --- ksrc/nucleus/intr.c (revision 2871) +++ ksrc/nucleus/intr.c (working copy) @@ -296,15 +296,15 @@ static void xnintr_edge_shirq_handler(un s |= ret; if (code == XN_ISR_HANDLED) { - if (!(end = (intr->next))) - end = shirq->handlers; + end = NULL; xnstat_counter_inc( &intr->stat[xnsched_cpu(sched)].hits); xnstat_runtime_lazy_switch(sched, &intr->stat[xnsched_cpu(sched)].account, start); start = xnstat_runtime_now(); - } + } else if (code == XN_ISR_NONE && end == NULL) + end = intr; if (counter++ > MAX_EDGEIRQ_COUNTER) break; (that's for 2.3.x) Once "end" is moved forward to the next handler in the chain, the loop termination condition "intr==end" will trigger on the immediately following round, even if there are still events pending. Utterly broken. Philippe, please quickly apply -- and don't tell anyone who did this. Jan