2013-04-11 18:00:16

by Boris Ostrovsky

[permalink] [raw]
Subject: [PATCH RESEND] mm/x86: Flush lazy MMU when DEBUG_PAGEALLOC is set

When CONFIG_DEBUG_PAGEALLOC is set page table updates made by
kernel_map_pages() are not made visible (via TLB flush) immediately if lazy
MMU is on. In environments that support lazy MMU (e.g. Xen) this may lead
to fatal page faults, for example, when zap_pte_range() needs to allocate
pages in __tlb_remove_page() -> tlb_next_batch().

Signed-off-by: Boris Ostrovsky <[email protected]>
---
arch/x86/mm/pageattr.c | 2 ++
1 file changed, 2 insertions(+)

diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index 091934e..2ccbe0b 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -1413,6 +1413,8 @@ void kernel_map_pages(struct page *page, int numpages, int enable)
* but that can deadlock->flush only current cpu:
*/
__flush_tlb_all();
+
+ arch_flush_lazy_mmu_mode();
}

#ifdef CONFIG_HIBERNATION
--
1.8.1.4


Subject: [tip:x86/urgent] x86/mm: Flush lazy MMU when DEBUG_PAGEALLOC is set

Commit-ID: 26564600c9e88c6572a5e6ef5ae9121907edfb7f
Gitweb: http://git.kernel.org/tip/26564600c9e88c6572a5e6ef5ae9121907edfb7f
Author: Boris Ostrovsky <[email protected]>
AuthorDate: Thu, 11 Apr 2013 13:59:52 -0400
Committer: Ingo Molnar <[email protected]>
CommitDate: Fri, 12 Apr 2013 07:19:19 +0200

x86/mm: Flush lazy MMU when DEBUG_PAGEALLOC is set

When CONFIG_DEBUG_PAGEALLOC is set page table updates made by
kernel_map_pages() are not made visible (via TLB flush)
immediately if lazy MMU is on. In environments that support lazy
MMU (e.g. Xen) this may lead to fatal page faults, for example,
when zap_pte_range() needs to allocate pages in
__tlb_remove_page() -> tlb_next_batch().

Signed-off-by: Boris Ostrovsky <[email protected]>
Cc: [email protected]
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Ingo Molnar <[email protected]>
---
arch/x86/mm/pageattr.c | 2 ++
1 file changed, 2 insertions(+)

diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index 7896f71..fb4e73e 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -1413,6 +1413,8 @@ void kernel_map_pages(struct page *page, int numpages, int enable)
* but that can deadlock->flush only current cpu:
*/
__flush_tlb_all();
+
+ arch_flush_lazy_mmu_mode();
}

#ifdef CONFIG_HIBERNATION