On Tue, Sep 26, 2023 at 10:25 PM Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> wrote: > > If the page is not currently present in the page tables, we need to call > the page fault handler to find out which page we're supposed to COW, > so we need to both check that there is already an anon_vma and that the > fault handler doesn't need the mmap_lock. > > Signed-off-by: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> > --- > mm/memory.c | 12 +++++------- > 1 file changed, 5 insertions(+), 7 deletions(-) > > diff --git a/mm/memory.c b/mm/memory.c > index 0f3da4889230..02231a9394ed 100644 > --- a/mm/memory.c > +++ b/mm/memory.c > @@ -4639,13 +4639,11 @@ static vm_fault_t do_cow_fault(struct vm_fault *vmf) > struct vm_area_struct *vma = vmf->vma; > vm_fault_t ret; > > - if (vmf->flags & FAULT_FLAG_VMA_LOCK) { > - vma_end_read(vma); > - return VM_FAULT_RETRY; > - } > - > - if (unlikely(anon_vma_prepare(vma))) > - return VM_FAULT_OOM; > + ret = vmf_maybe_unlock_vma(vmf); > + if (!ret) > + ret = vmf_anon_prepare(vmf); Same comment as in [PATCH 2/6]. If we reach here with FAULT_FLAG_VMA_LOCK then vma->anon_vma will not be NULL unless we change lock_vma_under_rcu(). > + if (ret) > + return ret; > > vmf->cow_page = alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma, vmf->address); > if (!vmf->cow_page) > -- > 2.40.1 >