mm: handle read faults under the VMA lock
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 6 Oct 2023 19:53:17 +0000 (20:53 +0100)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 18 Oct 2023 21:34:14 +0000 (14:34 -0700)
Most file-backed faults are already handled through ->map_pages(), but if
we need to do I/O we'll come this way.  Since filemap_fault() is now safe
to be called under the VMA lock, we can handle these faults under the VMA
lock now.

Link: https://lkml.kernel.org/r/20231006195318.4087158-6-willy@infradead.org
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Suren Baghdasaryan <surenb@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/memory.c

index be9469a294136a4bc4f94b64db81d8598de0b78d..ada461b82a75b2ad3f5eecfe25cd63e7fe412370 100644 (file)
@@ -4617,10 +4617,9 @@ static vm_fault_t do_read_fault(struct vm_fault *vmf)
                        return ret;
        }
 
-       if (vmf->flags & FAULT_FLAG_VMA_LOCK) {
-               vma_end_read(vmf->vma);
-               return VM_FAULT_RETRY;
-       }
+       ret = vmf_can_call_fault(vmf);
+       if (ret)
+               return ret;
 
        ret = __do_fault(vmf);
        if (unlikely(ret & (VM_FAULT_ERROR | VM_FAULT_NOPAGE | VM_FAULT_RETRY)))