Skip to contentSkip to conversation

userfaultfd-mark-uffd_wp-regardless-of-vm_write-flag.patch removed from -mm tree

merged Andrew Morton 1 participant 1 message Apr 22, 2022

lore
Share & tools
lore

Andrew Morton

author tree notice Applied
#0 lore raw

The patch titled
Subject: userfaultfd: mark uffd_wp regardless of VM_WRITE flag
has been removed from the -mm tree. Its filename was
userfaultfd-mark-uffd_wp-regardless-of-vm_write-flag.patch

This patch was dropped because it was merged into mainline or a subsystem tree

------------------------------------------------------
From: Nadav Amit <[email protected]>
Subject: userfaultfd: mark uffd_wp regardless of VM_WRITE flag

When a PTE is set by UFFD operations such as UFFDIO_COPY, the PTE is currently only marked as write-protected if the VMA has VM_WRITE flag set. This seems incorrect or at least would be unexpected by the users.

Consider the following sequence of operations that are being performed on a certain page:

mprotect(PROT_READ)
UFFDIO_COPY(UFFDIO_COPY_MODE_WP)
mprotect(PROT_READ|PROT_WRITE)

At this point the user would expect to still get UFFD notification when the page is accessed for write, but the user would not get one, since the PTE was not marked as UFFD_WP during UFFDIO_COPY.

Fix it by always marking PTEs as UFFD_WP regardless on the write-permission in the VMA flags.

Fixes 292924b26024 ("userfaultfd: wp: apply _PAGE_UFFD_WP bit")
Cc Axel Rasmussen <[email protected]>
Cc Mike Rapoport <[email protected]>
Cc Andrea Arcangeli <[email protected]>

---

 mm/userfaultfd.c |   15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)
mm/userfaultfd.c renamed from mm/userfaultfd.c~userfaultfd-mark-uffd_wp-regardless-of-vm_write-flag +9 -6
@@ -72,12 +72,15 @@ int mfill_atomic_install_pte(struct mm_s
 	_dst_pte = pte_mkdirty(_dst_pte);
 	if (page_in_cache && !vm_shared)
 		writable = false;
-	if (writable) {
-		if (wp_copy)
-			_dst_pte = pte_mkuffd_wp(_dst_pte);
-		else
-			_dst_pte = pte_mkwrite(_dst_pte);
-	}
+
+	/*
+	 * Always mark a PTE as write-protected when needed, regardless of
+	 * VM_WRITE, which the user might change.
+	 */
+	if (wp_copy)
+		_dst_pte = pte_mkuffd_wp(_dst_pte);
+	else if (writable)
+		_dst_pte = pte_mkwrite(_dst_pte);
 
 	dst_pte = pte_offset_map_lock(dst_mm, dst_pmd, dst_addr, &ptl);
 

_

Patches currently in -mm which might be from [email protected] are

mm-mprotect-use-mmu_gather.patch mm-mprotect-do-not-flush-when-not-required-architecturally.patch mm-avoid-unnecessary-flush-on-change_huge_pmd.patch