|
@@ -710,7 +710,16 @@ static cycle_t read_tsc(struct clocksource *cs)
|
|
|
#ifdef CONFIG_X86_64
|
|
|
static cycle_t __vsyscall_fn vread_tsc(void)
|
|
|
{
|
|
|
- cycle_t ret = (cycle_t)vget_cycles();
|
|
|
+ cycle_t ret;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Surround the RDTSC by barriers, to make sure it's not
|
|
|
+ * speculated to outside the seqlock critical section and
|
|
|
+ * does not cause time warps:
|
|
|
+ */
|
|
|
+ rdtsc_barrier();
|
|
|
+ ret = (cycle_t)vget_cycles();
|
|
|
+ rdtsc_barrier();
|
|
|
|
|
|
return ret >= __vsyscall_gtod_data.clock.cycle_last ?
|
|
|
ret : __vsyscall_gtod_data.clock.cycle_last;
|