aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-x86/system.h
diff options
context:
space:
mode:
authorAndi Kleen <ak@suse.de>2008-01-30 07:32:38 -0500
committerIngo Molnar <mingo@elte.hu>2008-01-30 07:32:38 -0500
commitfde1b3fa947c2512e3715962ebb1d3a6a9b9bb7d (patch)
tree48ad640f75034747187f98fa0040897639376fb6 /include/asm-x86/system.h
parent2a10e7c41254941cac87be1eccdcb6379ce097f5 (diff)
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 <ak@suse.de> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'include/asm-x86/system.h')
-rw-r--r--include/asm-x86/system.h13
1 files changed, 13 insertions, 0 deletions
diff --git a/include/asm-x86/system.h b/include/asm-x86/system.h
index 6c7d1fda4995..39474f2957a3 100644
--- a/include/asm-x86/system.h
+++ b/include/asm-x86/system.h
@@ -5,6 +5,7 @@
5#include <asm/segment.h> 5#include <asm/segment.h>
6#include <asm/cpufeature.h> 6#include <asm/cpufeature.h>
7#include <asm/cmpxchg.h> 7#include <asm/cmpxchg.h>
8#include <asm/nops.h>
8 9
9#include <linux/kernel.h> 10#include <linux/kernel.h>
10#include <linux/irqflags.h> 11#include <linux/irqflags.h>
@@ -395,5 +396,17 @@ void default_idle(void);
395#define set_mb(var, value) do { var = value; barrier(); } while (0) 396#define set_mb(var, value) do { var = value; barrier(); } while (0)
396#endif 397#endif
397 398
399/*
400 * Stop RDTSC speculation. This is needed when you need to use RDTSC
401 * (or get_cycles or vread that possibly accesses the TSC) in a defined
402 * code region.
403 *
404 * (Could use an alternative three way for this if there was one.)
405 */
406static inline void rdtsc_barrier(void)
407{
408 alternative(ASM_NOP3, "mfence", X86_FEATURE_MFENCE_RDTSC);
409 alternative(ASM_NOP3, "lfence", X86_FEATURE_LFENCE_RDTSC);
410}
398 411
399#endif 412#endif