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

mm: handle write faults to RO pages under the VMA lock

mainline inclusion
from mainline-v6.7-rc1
commit 4a68fef16df9d88d528094116f8bbd2dbfa62089
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=4a68fef16df9d88d528094116f8bbd2dbfa62089

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

I think this is a pretty rare occurrence, but for consistency handle
faults with the VMA lock held the same way that we handle other faults
with the VMA lock held.

Link: https://lkml.kernel.org/r/20231006195318.4087158-7-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 83f90f21
Loading
Loading
Loading
Loading
+6 −7
Original line number Diff line number Diff line
@@ -3304,10 +3304,9 @@ static vm_fault_t wp_pfn_shared(struct vm_fault *vmf)
		vm_fault_t ret;

		pte_unmap_unlock(vmf->pte, vmf->ptl);
		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;

		vmf->flags |= FAULT_FLAG_MKWRITE;
		ret = vma->vm_ops->pfn_mkwrite(vmf);
@@ -3331,10 +3330,10 @@ static vm_fault_t wp_page_shared(struct vm_fault *vmf, struct folio *folio)
		vm_fault_t tmp;

		pte_unmap_unlock(vmf->pte, vmf->ptl);
		if (vmf->flags & FAULT_FLAG_VMA_LOCK) {
		tmp = vmf_can_call_fault(vmf);
		if (tmp) {
			folio_put(folio);
			vma_end_read(vmf->vma);
			return VM_FAULT_RETRY;
			return tmp;
		}

		tmp = do_page_mkwrite(vmf, folio);