NOHZ: restart tick device from irq_enter()
authorThomas Gleixner <tglx@linutronix.de>
Fri, 17 Oct 2008 08:01:23 +0000 (10:01 +0200)
committerThomas Gleixner <tglx@apollo.(none)>
Fri, 17 Oct 2008 16:13:38 +0000 (18:13 +0200)
commitfb02fbc14d17837b4b7b02dbb36142c16a7bf208
tree9df1d069c5612047c38a9f6d6dc801ee0369ae3c
parentc34bec5a44e9486597d78e7a686b2f9088a0564c
NOHZ: restart tick device from irq_enter()

We did not restart the tick device from irq_enter() to avoid double
reprogramming and extra events in the return immediate to idle case.

But long lasting softirqs can lead to a situation where jiffies become
stale:

idle()
  tick stopped (reprogrammed to next pending timer)
  halt()
   interrupt
     jiffies updated from irq_enter()
     interrupt handler
     softirq function 1 runs 20ms
     softirq function 2 arms a 10ms timer with a stale jiffies value
     jiffies updated from irq_exit()
     timer wheel has now an already expired timer
     (the one added in function 2)
     timer fires and timer softirq runs

This was discovered when debugging a timer problem which happend only
when the ath5k driver is active. The debugging proved that there is a
softirq function running for more than 20ms, which is a bug by itself.

To solve this we restart the tick timer right from irq_enter(), but do
not go through the other functions which are necessary to return from
idle when need_resched() is set.

Reported-by: Elias Oltmanns <eo@nebensachen.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Elias Oltmanns <eo@nebensachen.de>
kernel/time/tick-broadcast.c
kernel/time/tick-internal.h
kernel/time/tick-sched.c