diff options
| -rw-r--r-- | arch/x86/include/asm/tlbflush.h | 6 | ||||
| -rw-r--r-- | arch/x86/mm/pageattr.c | 6 |
2 files changed, 11 insertions, 1 deletions
diff --git a/arch/x86/include/asm/tlbflush.h b/arch/x86/include/asm/tlbflush.h index 323a313947e0..d760611cfc35 100644 --- a/arch/x86/include/asm/tlbflush.h +++ b/arch/x86/include/asm/tlbflush.h | |||
| @@ -453,6 +453,12 @@ static inline void __native_flush_tlb_one_user(unsigned long addr) | |||
| 453 | */ | 453 | */ |
| 454 | static inline void __flush_tlb_all(void) | 454 | static inline void __flush_tlb_all(void) |
| 455 | { | 455 | { |
| 456 | /* | ||
| 457 | * This is to catch users with enabled preemption and the PGE feature | ||
| 458 | * and don't trigger the warning in __native_flush_tlb(). | ||
| 459 | */ | ||
| 460 | VM_WARN_ON_ONCE(preemptible()); | ||
| 461 | |||
| 456 | if (boot_cpu_has(X86_FEATURE_PGE)) { | 462 | if (boot_cpu_has(X86_FEATURE_PGE)) { |
| 457 | __flush_tlb_global(); | 463 | __flush_tlb_global(); |
| 458 | } else { | 464 | } else { |
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index 62bb30b4bd2a..a1004dec98ea 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c | |||
| @@ -2309,9 +2309,13 @@ void __kernel_map_pages(struct page *page, int numpages, int enable) | |||
| 2309 | 2309 | ||
| 2310 | /* | 2310 | /* |
| 2311 | * We should perform an IPI and flush all tlbs, | 2311 | * We should perform an IPI and flush all tlbs, |
| 2312 | * but that can deadlock->flush only current cpu: | 2312 | * but that can deadlock->flush only current cpu. |
| 2313 | * Preemption needs to be disabled around __flush_tlb_all() due to | ||
| 2314 | * CR3 reload in __native_flush_tlb(). | ||
| 2313 | */ | 2315 | */ |
| 2316 | preempt_disable(); | ||
| 2314 | __flush_tlb_all(); | 2317 | __flush_tlb_all(); |
| 2318 | preempt_enable(); | ||
| 2315 | 2319 | ||
| 2316 | arch_flush_lazy_mmu_mode(); | 2320 | arch_flush_lazy_mmu_mode(); |
| 2317 | } | 2321 | } |
