• John Stultz's avatar
    time: Fix ktime_get_raw() incorrect base accumulation · 0bcdc098
    John Stultz authored
    In comqit fc6eead7 ("time: Clean up CLOCK_MONOTONIC_RAW time
    handling"), the following code got mistakenly added to the update of the
    raw timekeeper:
    
     /* Update the monotonic raw base */
     seconds = tk->raw_sec;
     nsec = (u32)(tk->tkr_raw.xtime_nsec >> tk->tkr_raw.shift);
     tk->tkr_raw.base = ns_to_ktime(seconds * NSEC_PER_SEC + nsec);
    
    Which adds the raw_sec value and the shifted down raw xtime_nsec to the
    base value.
    
    But the read function adds the shifted down tk->tkr_raw.xtime_nsec value
    another time, The result of this is that ktime_get_raw() users (which are
    all internal users) see the raw time move faster then it should (the rate
    at which can vary with the current size of tkr_raw.xtime_nsec), which has
    resulted in at least problems with graphics rendering performance.
    
    The change tried to match the monotonic base update logic:
    
     seconds = (u64)(tk->xtime_sec + tk->wall_to_monotonic.tv_sec);
     nsec = (u32) tk->wall_to_monotonic.tv_nsec;
     tk->tkr_mono.base = ns_to_ktime(seconds * NSEC_PER_SEC + nsec);
    
    Which adds the wall_to_monotonic.tv_nsec value, but not the
    tk->tkr_mono.xtime_nsec value to the base.
    
    To fix this, simplify the tkr_raw.base accumulation to only accumulate the
    raw_sec portion, and do not include the tkr_raw.xtime_nsec portion, which
    will be added at read time.
    
    Fixes: fc6eead7 ("time: Clean up CLOCK_MONOTONIC_RAW time handling")
    Reported-and-tested-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
    Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: Prarit Bhargava <prarit@redhat.com>
    Cc: Kevin Brodsky <kevin.brodsky@arm.com>
    Cc: Richard Cochran <richardcochran@gmail.com>
    Cc: Stephen Boyd <stephen.boyd@linaro.org>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: Miroslav Lichvar <mlichvar@redhat.com>
    Cc: Daniel Mentz <danielmentz@google.com>
    Link: http://lkml.kernel.org/r/1503701824-1645-1-git-send-email-john.stultz@linaro.org
    0bcdc098
timekeeping.c 64.6 KB