While sending interrupts to a cpu to repeatedly wake a thread, on occasion that 
thread will take a full timer tick cycle (4002 usec in my case) to wakeup.

The problem concerns a race condition in the code around the safe_halt() call 
in the default_idle() routine.  Setting 'nohalt' on the kernel command line 
causes the long wakeups to disappear.

void
default_idle (void)
{
        local_irq_enable();
        while (!need_resched()) {
-->             if (can_do_pal_halt)
-->                     safe_halt();
                else

A timer tick could arrive between the check for !need_resched and the actual 
call to safe_halt() (which does a pal call to PAL_HALT_LIGHT).  By the time the 
timer tick completes, a thread that might now need to run could get held up for 
as long as a timer tick waiting for the halted cpu.

I'm proposing that we disable irq's and check need_resched again before calling 
safe_halt().  Does anyone see any problem with this approach?


Signed-off-by: Dimitri Sivanich <[EMAIL PROTECTED]>

Index: linux/arch/ia64/kernel/process.c
===================================================================
--- linux.orig/arch/ia64/kernel/process.c       2007-08-02 15:05:56.427236082 
-0500
+++ linux/arch/ia64/kernel/process.c    2007-08-06 19:42:20.147944967 -0500
@@ -198,9 +198,13 @@ default_idle (void)
 {
        local_irq_enable();
        while (!need_resched()) {
-               if (can_do_pal_halt)
-                       safe_halt();
-               else
+               if (can_do_pal_halt) {
+                       local_irq_disable();
+                       if (!need_resched()) {
+                               safe_halt();
+                       }
+                       local_irq_enable();
+               } else
                        cpu_relax();
        }
 }
-
To unsubscribe from this list: send the line "unsubscribe linux-ia64" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to