Hi. I'm investigating preempt patch for 2.4 kernel. (MIPS part of preempt-kernel-rml-2.4.26-pre5-1.patch seems a bit old. I'm looking Jun Sun's 030304-b.preempt-mips.patch). The patch contains following block (end of arch/mips/kernel/irq.c:do_IRQ()): if (softirq_pending(cpu)) do_softirq(); + +#if defined(CONFIG_PREEMPT) + for(;;) { + preempt_enable_no_resched(); + if (preempt_is_disabled() || !need_resched()) + break; + + db_assert(intr_off()); + db_assert(!in_interrupt()); + + preempt_disable(); + __sti(); + preempt_schedule(); + __cli(); + } +#endif + return 1; } Q1. What is purpose of this block? (To decrease latency? But other archs (and 2.6 MIPS kernel) do not have block like this...) Q2. If an interrupt happened between __sti() and __cli(), and the interrupt handler raise softirq, the softirq handler will not be called soon (because do_softirq() immediately return if preempt disabled). So we must check softirq_pending again after this block? Thank you. --- Atsushi Nemoto