The attached program should execute the following command line within a fraction of a second. time ./ping_pong -c 10000 Running on SMP and the 2.6.0-test9 kernel, it takes about 10000 * 1/HZ seconds. Running this command with maxcpus=1 the command finishes in fraction of a second. Under SMP the signal delivery isn't kicking the task if its in the run state on the other CPU. The following patch has been tested and seems to fix the problem. I'm confident about the change to sched.c actualy fixes a cut and paste bug. The change to signal.c IS needed to fix the problem, but I'm not sure there isn't a better way. Please have take a look --mgross diff -urN -X dontdiff linux-2.6.0-test9/kernel/sched.c /opt/linux-2.6.0-test9/kernel/sched.c --- linux-2.6.0-test9/kernel/sched.c 2003-10-25 11:44:29.000000000 -0700 +++ /opt/linux-2.6.0-test9/kernel/sched.c 2003-11-06 13:04:03.628116240 -0800 @@ -626,13 +626,13 @@ } success = 1; } -#ifdef CONFIG_SMP - else - if (unlikely(kick) && task_running(rq, p) && (task_cpu(p) != smp_processor_id())) - smp_send_reschedule(task_cpu(p)); -#endif p->state = TASK_RUNNING; } +#ifdef CONFIG_SMP + else + if (unlikely(kick) && task_running(rq, p) && (task_cpu(p) != smp_processor_id())) + smp_send_reschedule(task_cpu(p)); +#endif task_rq_unlock(rq, &flags); return success; diff -urN -X dontdiff linux-2.6.0-test9/kernel/signal.c /opt/linux-2.6.0-test9/kernel/signal.c --- linux-2.6.0-test9/kernel/signal.c 2003-10-25 11:43:27.000000000 -0700 +++ /opt/linux-2.6.0-test9/kernel/signal.c 2003-11-06 12:18:22.000000000 -0800 @@ -555,6 +555,9 @@ wake_up_process_kick(t); return; } + if (t->state == TASK_RUNNING ) + wake_up_process_kick(t); + } /*