On Tue, May 2, 2023 at 7:28 AM Matthew Wilcox <willy@xxxxxxxxxxxxx> wrote: > > On Mon, May 01, 2023 at 10:50:24AM -0700, Suren Baghdasaryan wrote: > > migration_entry_wait does not need VMA lock, therefore it can be dropped > > before waiting. Introduce VM_FAULT_VMA_UNLOCKED to indicate that VMA > > lock was dropped while in handle_mm_fault(). > > Note that once VMA lock is dropped, the VMA reference can't be used as > > there are no guarantees it was not freed. > > How about we introduce: > > void vmf_end_read(struct vm_fault *vmf) > { > if (!vmf->vma) > return; > vma_end_read(vmf->vma); > vmf->vma = NULL; > } > > Now we don't need a new flag, and calling vmf_end_read() is idempotent. > > Oh, argh, we create the vmf too late. We really need to hoist the > creation of vm_fault to the callers of handle_mm_fault(). Yeah, unfortunately vmf does not propagate all the way up to do_user_addr_fault which needs to know that we dropped the lock. >