diff options
| -rw-r--r-- | arch/x86/include/asm/tlbflush.h | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/arch/x86/include/asm/tlbflush.h b/arch/x86/include/asm/tlbflush.h index b519da4fc03c..f9b48ce152eb 100644 --- a/arch/x86/include/asm/tlbflush.h +++ b/arch/x86/include/asm/tlbflush.h | |||
| @@ -345,15 +345,17 @@ static inline void invalidate_user_asid(u16 asid) | |||
| 345 | */ | 345 | */ |
| 346 | static inline void __native_flush_tlb(void) | 346 | static inline void __native_flush_tlb(void) |
| 347 | { | 347 | { |
| 348 | invalidate_user_asid(this_cpu_read(cpu_tlbstate.loaded_mm_asid)); | ||
| 349 | /* | 348 | /* |
| 350 | * If current->mm == NULL then we borrow a mm which may change | 349 | * Preemption or interrupts must be disabled to protect the access |
| 351 | * during a task switch and therefore we must not be preempted | 350 | * to the per CPU variable and to prevent being preempted between |
| 352 | * while we write CR3 back: | 351 | * read_cr3() and write_cr3(). |
| 353 | */ | 352 | */ |
| 354 | preempt_disable(); | 353 | WARN_ON_ONCE(preemptible()); |
| 354 | |||
| 355 | invalidate_user_asid(this_cpu_read(cpu_tlbstate.loaded_mm_asid)); | ||
| 356 | |||
| 357 | /* If current->mm == NULL then the read_cr3() "borrows" an mm */ | ||
| 355 | native_write_cr3(__native_read_cr3()); | 358 | native_write_cr3(__native_read_cr3()); |
| 356 | preempt_enable(); | ||
| 357 | } | 359 | } |
| 358 | 360 | ||
| 359 | /* | 361 | /* |
