• Mukesh Ojha's avatar
    time: Fix extra sleeptime injection when suspend fails · f473e5f4
    Mukesh Ojha authored
    Currently, there exists a corner case assuming when there is
    only one clocksource e.g RTC, and system failed to go to
    suspend mode. While resume rtc_resume() injects the sleeptime
    as timekeeping_rtc_skipresume() returned 'false' (default value
    of sleeptime_injected) due to which we can see mismatch in
    timestamps.
    
    This issue can also come in a system where more than one
    clocksource are present and very first suspend fails.
    
    Success case:
    ------------
                                            {sleeptime_injected=false}
    rtc_suspend() => timekeeping_suspend() => timekeeping_resume() =>
    
    (sleeptime injected)
     rtc_resume()
    
    Failure case:
    ------------
             {failure in sleep path} {sleeptime_injected=false}
    rtc_suspend()     =>          rtc_resume()
    
    {sleeptime injected again which was not required as the suspend failed}
    
    Fix this by handling the boolean logic properly.
    
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Miroslav Lichvar <mlichvar@redhat.com>
    Cc: Richard Cochran <richardcochran@gmail.com>
    Cc: Prarit Bhargava <prarit@redhat.com>
    Cc: Stephen Boyd <sboyd@kernel.org>
    Originally-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarMukesh Ojha <mojha@codeaurora.org>
    Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
    f473e5f4
timekeeping.c 66.6 KB