From 98ffe67db7125d4628f80eb0f0657b2bdf2235b7 Mon Sep 17 00:00:00 2001 From: Andi Kleen Date: Wed, 30 Jan 2008 13:32:38 +0100 Subject: [PATCH] x86: introduce rdtsc_barrier() rdtsc_barrier() is a new barrier primitive that stops RDTSC speculation to avoid races with timer interrupts on other CPUs. It expands either to LFENCE (for Intel CPUs) or MFENCE (for AMD CPUs) which stops RDTSC on all currently known microarchitectures that implement SSE. On CPUs without SSE there is generally no RDTSC speculation. [ mingo@elte.hu: renamed it to rdtsc_barrier() and made it x86-only ] Signed-off-by: Andi Kleen Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner --- include/asm-x86/system.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/include/asm-x86/system.h b/include/asm-x86/system.h index 6c7d1fda49954..39474f2957a3c 100644 --- a/include/asm-x86/system.h +++ b/include/asm-x86/system.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -395,5 +396,17 @@ void default_idle(void); #define set_mb(var, value) do { var = value; barrier(); } while (0) #endif +/* + * Stop RDTSC speculation. This is needed when you need to use RDTSC + * (or get_cycles or vread that possibly accesses the TSC) in a defined + * code region. + * + * (Could use an alternative three way for this if there was one.) + */ +static inline void rdtsc_barrier(void) +{ + alternative(ASM_NOP3, "mfence", X86_FEATURE_MFENCE_RDTSC); + alternative(ASM_NOP3, "lfence", X86_FEATURE_LFENCE_RDTSC); +} #endif -- 2.39.5