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);
 	}