• Thomas Gleixner's avatar
    NOHZ: restart tick device from irq_enter() · fb02fbc1
    Thomas Gleixner authored
    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: default avatarElias Oltmanns <eo@nebensachen.de>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Tested-by: default avatarElias Oltmanns <eo@nebensachen.de>
    fb02fbc1
tick-broadcast.c 14.2 KB