diff -urN linux.orig/kernel/context.c linux.diff/kernel/context.c --- linux.orig/kernel/context.c Fri Jan 11 15:29:58 2002 +++ linux.diff/kernel/context.c Mon Jan 14 16:44:28 2002 @@ -93,11 +93,17 @@ for (;;) { set_task_state(curtask, TASK_INTERRUPTIBLE); add_wait_queue(&context_task_wq, &wait); - if (TQ_ACTIVE(tq_context)) + if (spin_is_locked(&tqueue_lock) || TQ_ACTIVE(tq_context)) set_task_state(curtask, TASK_RUNNING); - schedule(); + else + schedule(); remove_wait_queue(&context_task_wq, &wait); run_task_queue(&tq_context); + while (TQ_ACTIVE(tq_context)) { + if (current->need_resched) + schedule(); + run_task_queue(&tq_context); + } wake_up(&context_task_done); if (signal_pending(curtask)) { while (waitpid(-1, (unsigned int *)0, __WALL|WNOHANG) > 0) diff -urN linux.orig/kernel/softirq.c linux.diff/kernel/softirq.c --- linux.orig/kernel/softirq.c Fri Jan 11 15:29:58 2002 +++ linux.diff/kernel/softirq.c Mon Jan 14 16:44:28 2002 @@ -354,6 +354,7 @@ data = p->data; wmb(); p->sync = 0; + smp_mb(); if (f) f(data); }