Files
android_kernel_xiaomi_sm8450/arch/x86/kernel
Linus Torvalds b6e61eef4f x86: Fix serialization in pit_expect_msb()
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: Linus Torvalds <torvalds@linux-foundation.org>
Reported-by: "Tan, Wei Chong" <wei.chong.tan@intel.com>
Tested-by: "Tan, Wei Chong" <wei.chong.tan@intel.com>
LKML-Reference: <B28277FD4E0F9247A3D55704C440A140D5D683F3@pgsmsx504.gar.corp.intel.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
2009-08-10 19:56:57 +02:00
..
2009-03-15 07:03:15 +01:00
2009-06-15 15:20:40 +02:00
2009-03-13 11:57:22 +01:00
2009-04-07 13:36:36 +02:00
2009-08-09 01:08:42 -07:00
2009-06-18 18:40:18 -04:00
2009-06-17 21:35:10 -07:00
2008-12-12 11:08:42 +01:00
2009-02-10 13:13:23 +01:00
2009-02-23 00:08:11 +01:00
2009-06-16 19:47:28 -07:00
2009-03-21 16:57:04 +05:30
2009-02-09 12:16:05 +01:00
2009-06-11 23:31:52 +02:00
2009-03-21 16:55:45 +05:30
2009-01-02 17:46:24 +01:00
2009-02-23 00:08:11 +01:00
2009-01-20 17:14:28 +01:00
2009-06-15 12:40:03 +02:00
2009-07-14 16:25:05 +02:00
2009-06-07 12:22:15 +02:00
2009-03-21 16:56:37 +05:30
2009-06-11 23:31:52 +02:00
2009-06-11 23:31:52 +02:00
2008-10-22 22:55:23 -07:00
2009-02-23 00:08:11 +01:00
2009-03-21 16:55:24 +05:30
2009-02-17 17:52:44 +01:00
2009-08-05 10:20:29 +02:00