• Rafael J. Wysocki's avatar
    timekeeping: Make it safe to use the fast timekeeper while suspended · 060407ae
    Rafael J. Wysocki authored
    Theoretically, ktime_get_mono_fast_ns() may be executed after
    timekeeping has been suspended (or before it is resumed) which
    in turn may lead to undefined behavior, for example, when the
    clocksource read from timekeeping_get_ns() called by it is
    not accessible at that time.
    
    Prevent that from happening by setting up a dummy readout base for
    the fast timekeeper during timekeeping_suspend() such that it will
    always return the same number of cycles.
    
    After the last timekeeping_update() in timekeeping_suspend() the
    clocksource is read and the result is stored as cycles_at_suspend.
    The readout base from the current timekeeper is copied onto the
    dummy and the ->read pointer of the dummy is set to a routine
    unconditionally returning cycles_at_suspend.  Next, the dummy is
    passed to update_fast_timekeeper().
    
    Then, ktime_get_mono_fast_ns() will work until the subsequent
    timekeeping_resume() and the proper readout base for the fast
    timekeeper will be restored by the timekeeping_update() called
    right after clearing timekeeping_suspended.
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    Acked-by: default avatarJohn Stultz <john.stultz@linaro.org>
    Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    060407ae
timekeeping.c 50.5 KB