From 056afafb0bccea6a356f80f4253ffcd3ef4a1f8d Mon Sep 17 00:00:00 2001 From: Laurent Dufour Date: Mon, 5 Nov 2018 18:43:01 +0100 Subject: [PATCH] mm: don't do swap readahead during speculative page fault Vinayak Menon faced a panic because one thread was page faulting a page in swap, while another one was mprotecting a part of the VMA leading to a VMA split. This raise a panic in swap_vma_readahead() because the VMA's boundaries were not more matching the faulting address. To avoid this, if the page is not found in the swap, the speculative page fault is aborted to retry a regular page fault. Signed-off-by: Laurent Dufour --- mm/memory.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/mm/memory.c b/mm/memory.c index 9dd5ffeb1f7e..720dc9a1b99f 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -3139,6 +3139,16 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) lru_cache_add_anon(page); swap_readpage(page, true); } + } else if (vmf->flags & FAULT_FLAG_SPECULATIVE) { + /* + * Don't try readahead during a speculative page fault as + * the VMA's boundaries may change in our back. + * If the page is not in the swap cache and synchronous read + * is disabled, fall back to the regular page fault mechanism. + */ + delayacct_clear_flag(DELAYACCT_PF_SWAPIN); + ret = VM_FAULT_RETRY; + goto out; } else { page = swapin_readahead(entry, GFP_HIGHUSER_MOVABLE, vmf); -- 2.19.1