diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-05-24 10:20:00 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-05-24 10:20:00 -0700 |
commit | eb90d81d03c0917b0fd629f6342554a3b58ea52c (patch) | |
tree | 4e12232420fa4111937ccd079675ea495d248538 /include | |
parent | d3c5f8b93febadf62da9a4b39a2dca8e66a4da40 (diff) | |
parent | b1979a5fda7869a790f4fd83fb06c78498d26ba1 (diff) | |
download | linux-3.10-eb90d81d03c0917b0fd629f6342554a3b58ea52c.tar.gz linux-3.10-eb90d81d03c0917b0fd629f6342554a3b58ea52c.tar.bz2 linux-3.10-eb90d81d03c0917b0fd629f6342554a3b58ea52c.zip |
Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-tip
* 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-tip:
x86: prevent PGE flush from interruption/preemption
x86: use explicit copy in vdso_gettimeofday()
namespacecheck: automated fixes
x86/xen: fix arbitrary_virt_to_machine()
x86: don't read maxlvt before checking if APIC is mapped
x86: disable TSC for sched_clock() when calibration failed
x86: distangle user disabled TSC from unstable
x86: fix setup of cyc2ns in tsc_64.c
Diffstat (limited to 'include')
-rw-r--r-- | include/asm-x86/tlbflush.h | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/include/asm-x86/tlbflush.h b/include/asm-x86/tlbflush.h index 0c0674d9425..35c76ceb9f4 100644 --- a/include/asm-x86/tlbflush.h +++ b/include/asm-x86/tlbflush.h @@ -22,12 +22,23 @@ static inline void __native_flush_tlb(void) static inline void __native_flush_tlb_global(void) { - unsigned long cr4 = read_cr4(); + unsigned long flags; + unsigned long cr4; + /* + * Read-modify-write to CR4 - protect it from preemption and + * from interrupts. (Use the raw variant because this code can + * be called from deep inside debugging code.) + */ + raw_local_irq_save(flags); + + cr4 = read_cr4(); /* clear PGE */ write_cr4(cr4 & ~X86_CR4_PGE); /* write old PGE again and flush TLBs */ write_cr4(cr4); + + raw_local_irq_restore(flags); } static inline void __native_flush_tlb_single(unsigned long addr) |