• Linus Torvalds's avatar
    x86: Fix serialization in pit_expect_msb() · b6e61eef
    Linus Torvalds authored
    Wei Chong Tan reported a fast-PIT-calibration corner-case:
    
    | pit_expect_msb() is vulnerable to SMI disturbance corner case
    | in some platforms which causes /proc/cpuinfo to show wrong
    | CPU MHz value when quick_pit_calibrate() jumps to success
    | section.
    
    I think that the real issue isn't even an SMI - but the fact
    that in the very last iteration of the loop, there's no
    serializing instruction _after_ the last 'rdtsc'. So even in
    the absense of SMI's, we do have a situation where the cycle
    counter was read without proper serialization.
    
    The last check should be done outside the outer loop, since
    _inside_ the outer loop, we'll be testing that the PIT has
    the right MSB value has the right value in the next iteration.
    
    So only the _last_ iteration is special, because that's the one
    that will not check the PIT MSB value any more, and because the
    final 'get_cycles()' isn't serialized.
    
    In other words:
    
     - I'd like to move the PIT MSB check to after the last
       iteration, rather than in every iteration
    
     - I think we should comment on the fact that it's also a
       serializing instruction and so 'fences in' the TSC read.
    
    Here's a suggested replacement.
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Reported-by: default avatar"Tan, Wei Chong" <wei.chong.tan@intel.com>
    Tested-by: default avatar"Tan, Wei Chong" <wei.chong.tan@intel.com>
    LKML-Reference: <B28277FD4E0F9247A3D55704C440A140D5D683F3@pgsmsx504.gar.corp.intel.com>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    b6e61eef
tsc.c 23.1 KB