• Stuart Hayes's avatar
    hrtimer: Prevent all reprogramming if hang detected · 3d8b2f5e
    Stuart Hayes authored
    commit 6c6c0d5a upstream.
    
    If the last hrtimer interrupt detected a hang it sets hang_detected=1
    and programs the clock event device with a delay to let the system
    make progress.
    
    If hang_detected == 1, we prevent reprogramming of the clock event
    device in hrtimer_reprogram() but not in hrtimer_force_reprogram().
    
    This can lead to the following situation:
    
    hrtimer_interrupt()
       hang_detected = 1;
       program ce device to Xms from now (hang delay)
    
    We have two timers pending:
       T1 expires 50ms from now
       T2 expires 5s from now
    
    Now T1 gets canceled, which causes hrtimer_force_reprogram() to be
    invoked, which in turn programs the clock event device to T2 (5
    seconds from now).
    
    Any hrtimer_start after that will not reprogram the hardware due to
    hang_detected still being set. So we effectivly block all timers until
    the T2 event fires and cleans up the hang situation.
    
    Add a check for hang_detected to hrtimer_force_reprogram() which
    prevents the reprogramming of the hang delay in the hardware
    timer. The subsequent hrtimer_interrupt will resolve all outstanding
    issues.
    
    [ tglx: Rewrote subject and changelog and fixed up the comment in
      	hrtimer_force_reprogram() ]
    Signed-off-by: default avatarStuart Hayes <stuart.w.hayes@gmail.com>
    Link: http://lkml.kernel.org/r/53602DC6.2060101@gmail.comSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    3d8b2f5e
hrtimer.c 47.7 KB