mm: prevent do_swap_page from handling page faults under VMA lock
authorSuren Baghdasaryan <surenb@google.com>
Mon, 27 Feb 2023 17:36:25 +0000 (09:36 -0800)
committerAndrew Morton <akpm@linux-foundation.org>
Thu, 6 Apr 2023 03:03:00 +0000 (20:03 -0700)
Due to the possibility of do_swap_page dropping mmap_lock, abort fault
handling under VMA lock and retry holding mmap_lock.  This can be handled
more gracefully in the future.

Link: https://lkml.kernel.org/r/20230227173632.3292573-27-surenb@google.com
Signed-off-by: Suren Baghdasaryan <surenb@google.com>
Reviewed-by: Laurent Dufour <laurent.dufour@fr.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/memory.c

index 10d497a..70f4b12 100644 (file)
@@ -3697,6 +3697,11 @@ vm_fault_t do_swap_page(struct vm_fault *vmf)
        if (!pte_unmap_same(vmf))
                goto out;
 
+       if (vmf->flags & FAULT_FLAG_VMA_LOCK) {
+               ret = VM_FAULT_RETRY;
+               goto out;
+       }
+
        entry = pte_to_swp_entry(vmf->orig_pte);
        if (unlikely(non_swap_entry(entry))) {
                if (is_migration_entry(entry)) {