]> err.no Git - linux-2.6/commitdiff
softlockup: fix false positives on nohz if CPU is 100% idle for more than 60 seconds
authorIngo Molnar <mingo@elte.hu>
Mon, 12 May 2008 13:43:53 +0000 (15:43 +0200)
committerIngo Molnar <mingo@elte.hu>
Fri, 30 May 2008 12:15:02 +0000 (14:15 +0200)
Fix (probably theoretical only) rq->clock update bug:
in tick_nohz_update_jiffies() [which is called on all irq
entry on all cpus where the irq entry hits an idle cpu] we
call touch_softlockup_watchdog() before we update jiffies.
That works fine most of the time when idle timeouts are within
60 seconds. But when an idle timeout is beyond 60 seconds,
jiffies is updated with a jump of more than 60 seconds,
which causes a jump in cpu-clock of more than 60 seconds,
triggering a false positive.

Reported-by: David Miller <davem@davemloft.net>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
kernel/time/tick-sched.c

index b854a895591efe4f1d40f522d079fe1de0cf256e..28abad66fc8e56ade236e07d94d08ef29534786e 100644 (file)
@@ -133,8 +133,6 @@ void tick_nohz_update_jiffies(void)
        if (!ts->tick_stopped)
                return;
 
-       touch_softlockup_watchdog();
-
        cpu_clear(cpu, nohz_cpu_mask);
        now = ktime_get();
        ts->idle_waketime = now;
@@ -142,6 +140,8 @@ void tick_nohz_update_jiffies(void)
        local_irq_save(flags);
        tick_do_update_jiffies64(now);
        local_irq_restore(flags);
+
+       touch_softlockup_watchdog();
 }
 
 void tick_nohz_stop_idle(int cpu)