Commit 78c346ca authored by Matthew Wilcox (Oracle)'s avatar Matthew Wilcox (Oracle) Committed by Tong Tiangen
Browse files

mm: handle COW faults under the VMA lock

mainline inclusion
from mainline-v6.7-rc1
commit 4de8c93a4751e10737b6af65db42c743228c67a6
category: other
bugzilla: https://gitee.com/openeuler/kernel/issues/I8K7C7

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4de8c93a4751e10737b6af65db42c743228c67a6

--------------------------------

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.

Link: https://lkml.kernel.org/r/20231006195318.4087158-5-willy@infradead.org


Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: default avatarSuren Baghdasaryan <surenb@google.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarTong Tiangen <tongtiangen@huawei.com>
parent 4ec04321
Loading
Loading
Loading
Loading
+5 −7
Original line number Diff line number Diff line
@@ -4625,13 +4625,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_can_call_fault(vmf);
	if (!ret)
		ret = vmf_anon_prepare(vmf);
	if (ret)
		return ret;

	vmf->cow_page = alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma, vmf->address);
	if (!vmf->cow_page)