diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2008-10-17 10:01:23 +0200 |
---|---|---|
committer | Thomas Gleixner <tglx@apollo.(none)> | 2008-10-17 18:13:38 +0200 |
commit | fb02fbc14d17837b4b7b02dbb36142c16a7bf208 (patch) | |
tree | 9df1d069c5612047c38a9f6d6dc801ee0369ae3c /kernel/time/clockevents.c | |
parent | c34bec5a44e9486597d78e7a686b2f9088a0564c (diff) | |
download | kernel_samsung_smdk4412-fb02fbc14d17837b4b7b02dbb36142c16a7bf208.zip kernel_samsung_smdk4412-fb02fbc14d17837b4b7b02dbb36142c16a7bf208.tar.gz kernel_samsung_smdk4412-fb02fbc14d17837b4b7b02dbb36142c16a7bf208.tar.bz2 |
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>
Diffstat (limited to 'kernel/time/clockevents.c')
0 files changed, 0 insertions, 0 deletions