• J
    time: x86: Fix race switching from vsyscall to non-vsyscall clock · a939e817
    John Stultz 提交于
    When switching from a vsyscall capable to a non-vsyscall capable
    clocksource, there was a small race, where the last vsyscall
    gettimeofday before the switch might return a invalid time value
    using the new non-vsyscall enabled clocksource values after the
    switch is complete.
    
    This is due to the vsyscall code checking the vclock_mode once
    outside of the seqcount protected section. After it reads the
    vclock mode, it doesn't re-check that the sampled clock data
    that is obtained in the seqcount critical section still matches.
    
    The fix is to sample vclock_mode inside the protected section,
    and as long as it isn't VCLOCK_NONE, return the calculated
    value. If it has changed and is now VCLOCK_NONE, fall back
    to the syscall gettime calculation.
    
    v2:
      * Cleanup checks as suggested by tglx
      * Also fix same issue present in gettimeofday path
    
    CC: Andy Lutomirski <luto@amacapital.net>
    CC: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: NJohn Stultz <john.stultz@linaro.org>
    a939e817
vclock_gettime.c 5.8 KB