From d95ca82a5de955f2d17731d40deb55ebb9832131 Mon Sep 17 00:00:00 2001 From: Vinayak Menon Date: Thu, 31 Dec 2020 17:42:11 +0530 Subject: [PATCH] mm: skip speculative path for non-anonymous COW faults anon_vma_prepare should not called in speculative page fault path. But a non-anonymous private COW page without anon_vma can enter it on a write. Fix it. Change-Id: I107b793392ba436fbe0f07f93f67767eaf1446e6 Signed-off-by: Vinayak Menon --- mm/memory.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mm/memory.c b/mm/memory.c index 2396e1608770..d11962ec85fb 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -4260,7 +4260,11 @@ int __handle_speculative_fault(struct mm_struct *mm, unsigned long address, * because vm_next and vm_prev must be safe. This can't be guaranteed * in the speculative path. */ - if (unlikely(vma_is_anonymous(vmf.vma) && !vmf.vma->anon_vma)) + if (unlikely((vma_is_anonymous(vmf.vma) && !vmf.vma->anon_vma) || + (!vma_is_anonymous(vmf.vma) && + !(vmf.vma->vm_flags & VM_SHARED) && + (vmf.flags & FAULT_FLAG_WRITE) && + !vmf.vma->anon_vma))) return VM_FAULT_RETRY; vmf.vma_flags = READ_ONCE(vmf.vma->vm_flags);