diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-06-25 12:30:33 +0200 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-06-25 12:30:33 +0200 |
commit | 48cf937f48f68bd1e61f37c6357dbff5adb95532 (patch) | |
tree | d9e2368a419adc2c11691be2842c66213bec5a42 /include/asm-x86/tlbflush.h | |
parent | fce39665abb71d01d74ac74eb13dd69a799dfc2f (diff) | |
parent | 543cf4cb3fe6f6cae3651ba918b9c56200b257d0 (diff) | |
download | talos-op-linux-48cf937f48f68bd1e61f37c6357dbff5adb95532.tar.gz talos-op-linux-48cf937f48f68bd1e61f37c6357dbff5adb95532.zip |
Merge branch 'linus' into x86/i8259
Diffstat (limited to 'include/asm-x86/tlbflush.h')
-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 0c0674d94255..35c76ceb9f40 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) |