diff options
| -rw-r--r-- | arch/x86/include/asm/msr.h | 2 | ||||
| -rw-r--r-- | arch/x86/include/asm/tsc.h | 8 | ||||
| -rw-r--r-- | arch/x86/kernel/tsc.c | 2 |
3 files changed, 8 insertions, 4 deletions
diff --git a/arch/x86/include/asm/msr.h b/arch/x86/include/asm/msr.h index 46be2fa7ac26..c2a812ebde89 100644 --- a/arch/x86/include/asm/msr.h +++ b/arch/x86/include/asm/msr.h | |||
| @@ -108,9 +108,7 @@ static __always_inline unsigned long long __native_read_tsc(void) | |||
| 108 | { | 108 | { |
| 109 | DECLARE_ARGS(val, low, high); | 109 | DECLARE_ARGS(val, low, high); |
| 110 | 110 | ||
| 111 | rdtsc_barrier(); | ||
| 112 | asm volatile("rdtsc" : EAX_EDX_RET(val, low, high)); | 111 | asm volatile("rdtsc" : EAX_EDX_RET(val, low, high)); |
| 113 | rdtsc_barrier(); | ||
| 114 | 112 | ||
| 115 | return EAX_EDX_VAL(val, low, high); | 113 | return EAX_EDX_VAL(val, low, high); |
| 116 | } | 114 | } |
diff --git a/arch/x86/include/asm/tsc.h b/arch/x86/include/asm/tsc.h index 38ae163cc91b..9cd83a8e40d5 100644 --- a/arch/x86/include/asm/tsc.h +++ b/arch/x86/include/asm/tsc.h | |||
| @@ -34,6 +34,8 @@ static inline cycles_t get_cycles(void) | |||
| 34 | 34 | ||
| 35 | static __always_inline cycles_t vget_cycles(void) | 35 | static __always_inline cycles_t vget_cycles(void) |
| 36 | { | 36 | { |
| 37 | cycles_t cycles; | ||
| 38 | |||
| 37 | /* | 39 | /* |
| 38 | * We only do VDSOs on TSC capable CPUs, so this shouldnt | 40 | * We only do VDSOs on TSC capable CPUs, so this shouldnt |
| 39 | * access boot_cpu_data (which is not VDSO-safe): | 41 | * access boot_cpu_data (which is not VDSO-safe): |
| @@ -42,7 +44,11 @@ static __always_inline cycles_t vget_cycles(void) | |||
| 42 | if (!cpu_has_tsc) | 44 | if (!cpu_has_tsc) |
| 43 | return 0; | 45 | return 0; |
| 44 | #endif | 46 | #endif |
| 45 | return (cycles_t)__native_read_tsc(); | 47 | rdtsc_barrier(); |
| 48 | cycles = (cycles_t)__native_read_tsc(); | ||
| 49 | rdtsc_barrier(); | ||
| 50 | |||
| 51 | return cycles; | ||
| 46 | } | 52 | } |
| 47 | 53 | ||
| 48 | extern void tsc_init(void); | 54 | extern void tsc_init(void); |
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 2ef80e301925..424093b157d3 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c | |||
| @@ -55,7 +55,7 @@ u64 native_sched_clock(void) | |||
| 55 | rdtscll(this_offset); | 55 | rdtscll(this_offset); |
| 56 | 56 | ||
| 57 | /* return the value in ns */ | 57 | /* return the value in ns */ |
| 58 | return cycles_2_ns(this_offset); | 58 | return __cycles_2_ns(this_offset); |
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | /* We need to define a real function for sched_clock, to override the | 61 | /* We need to define a real function for sched_clock, to override the |
