• Dimitri Sivanich's avatar
    [IA64] disable irq's and check need_resched before safe_halt · 71416bea
    Dimitri Sivanich authored
    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: default avatarDimitri Sivanich <sivanich@sgi.com>
    Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
    71416bea
process.c 22.1 KB