I found some points during schedule when interrupts are off for long periods . These two patches seem to help. One enables interrupts inside schedule() , so that interrupts are enabled after each need-resched loop, then disabled again before __schedule() is called.
The other patch enabled interrupt before calling up on kernel_sem ..This one could use some thinking over. I did this cause up() is very expensive on ARM , and combined with the looping above interrupts can stay off for a long time .. Daniel Index: linux-2.6.10/kernel/sched.c =================================================================== --- linux-2.6.10.orig/kernel/sched.c 2005-02-08 22:32:48.000000000 +0000 +++ linux-2.6.10/kernel/sched.c 2005-02-08 22:33:58.000000000 +0000 @@ -3038,9 +3038,10 @@ send_sig(SIGUSR2, current, 1); } do { + local_irq_disable(); __schedule(); + local_irq_enable(); // TODO: do sti; ret } while (unlikely(test_thread_flag(TIF_NEED_RESCHED))); - local_irq_enable(); // TODO: do sti; ret } EXPORT_SYMBOL(schedule); Index: linux-2.6.10/lib/kernel_lock.c =================================================================== --- linux-2.6.10.orig/lib/kernel_lock.c 2005-02-08 18:16:30.000000000 +0000 +++ linux-2.6.10/lib/kernel_lock.c 2005-02-08 22:53:09.000000000 +0000 @@ -114,7 +114,9 @@ void __lockfunc __release_kernel_lock(void) { + local_irq_enable(); up(&kernel_sem); + local_irq_disable(); } /* - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/