From ad425b2849343eea8fc65b825a9e8055fd547aa2 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Mon, 12 May 2008 21:21:15 +0200 Subject: [PATCH] --- yaml --- r: 97301 b: refs/heads/master c: b1979a5fda7869a790f4fd83fb06c78498d26ba1 h: refs/heads/master i: 97299: 256d4d8f365ab76948fa851387a725e878e279b2 v: v3 --- [refs] | 2 +- trunk/include/asm-x86/tlbflush.h | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 0a2e2bc069ce..4ae49cbc0970 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a1289643adb6272c04db9399653ae195072c482a +refs/heads/master: b1979a5fda7869a790f4fd83fb06c78498d26ba1 diff --git a/trunk/include/asm-x86/tlbflush.h b/trunk/include/asm-x86/tlbflush.h index 0c0674d94255..35c76ceb9f40 100644 --- a/trunk/include/asm-x86/tlbflush.h +++ b/trunk/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)