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 <vinmenon@codeaurora.org>
This commit is contained in:
Vinayak Menon 2020-12-31 17:42:11 +05:30
commit d95ca82a5d

View file

@ -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);