• Stephen Boyd's avatar
    ARM: sched_clock: Load cycle count after epoch stabilizes · 336ae118
    Stephen Boyd authored
    There is a small race between when the cycle count is read from
    the hardware and when the epoch stabilizes. Consider this
    scenario:
    
     CPU0                           CPU1
     ----                           ----
     cyc = read_sched_clock()
     cyc_to_sched_clock()
                                     update_sched_clock()
                                      ...
                                      cd.epoch_cyc = cyc;
      epoch_cyc = cd.epoch_cyc;
      ...
      epoch_ns + cyc_to_ns((cyc - epoch_cyc)
    
    The cyc on cpu0 was read before the epoch changed. But we
    calculate the nanoseconds based on the new epoch by subtracting
    the new epoch from the old cycle count. Since epoch is most likely
    larger than the old cycle count we calculate a large number that
    will be converted to nanoseconds and added to epoch_ns, causing
    time to jump forward too much.
    
    Fix this problem by reading the hardware after the epoch has
    stabilized.
    
    Cc: Russell King <linux@arm.linux.org.uk>
    Signed-off-by: default avatarStephen Boyd <sboyd@codeaurora.org>
    Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
    336ae118
sched_clock.c 4.9 KB