• Xunlei Pang's avatar
    time: Fix a bug in timekeeping_suspend() with no persistent clock · 264bb3f7
    Xunlei Pang authored
    When there's no persistent clock, normally
    timekeeping_suspend_time should always be zero, but this can
    break in timekeeping_suspend().
    
    At T1, there was a system suspend, so old_delta was assigned T1.
    After some time, one time adjustment happened, and xtime got the
    value of T1-dt(0s<dt<2s). Then, there comes another system
    suspend soon after this adjustment, obviously we will get a
    small negative delta_delta, resulting in a negative
    timekeeping_suspend_time.
    
    This is problematic, when doing timekeeping_resume() if there is
    no nonstop clocksource for example, it will hit the else leg and
    inject the improper sleeptime which is the wrong logic.
    
    So, we can solve this problem by only doing delta related code
    when the persistent clock is existent. Actually the code only
    makes sense for persistent clock cases.
    Signed-off-by: default avatarXunlei Pang <pang.xunlei@linaro.org>
    Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: http://lkml.kernel.org/r/1427945681-29972-18-git-send-email-john.stultz@linaro.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    264bb3f7
timekeeping.c 54.9 KB