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().