The condition statement in default_idle had the conjunctions backwards. Instead of && it had || so the idle thread would never be preempted. Signed-off-by: Steven Rostedt Index: linux-2.6.16-rt23/arch/x86_64/kernel/process.c =================================================================== --- linux-2.6.16-rt23.orig/arch/x86_64/kernel/process.c 2006-05-26 10:41:30.000000000 -0400 +++ linux-2.6.16-rt23/arch/x86_64/kernel/process.c 2006-05-26 10:41:44.000000000 -0400 @@ -120,9 +120,9 @@ void default_idle(void) clear_thread_flag(TIF_POLLING_NRFLAG); smp_mb__after_clear_bit(); - while (!need_resched() || !need_resched_delayed()) { + while (!need_resched() && !need_resched_delayed()) { local_irq_disable(); - if (!need_resched() || !need_resched_delayed()) + if (!need_resched() && !need_resched_delayed()) safe_halt(); else local_irq_enable(); --