]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mm/userfaultfd: don't consider uffd-wp bit of writable migration entries
authorDavid Hildenbrand <david@redhat.com>
Wed, 5 Apr 2023 16:02:36 +0000 (18:02 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 5 Apr 2023 23:02:57 +0000 (16:02 -0700)
If we end up with a writable migration entry that has the uffd-wp bit set,
we already messed up: the source PTE/PMD was writable, which means we
could have modified the page without notifying uffd first.  Setting the
uffd-wp bit always implies converting migration entries to !writable
migration entries.

Commit 8f34f1eac382 ("mm/userfaultfd: fix uffd-wp special cases for
fork()") documents that "3.  Forget to carry over uffd-wp bit for a write
migration huge pmd entry", but it doesn't really say why that should be
relevant.

So let's remove that code to avoid hiding an eventual underlying issue (in
the future, we might want to warn when creating writable migration entries
that have the uffd-wp bit set -- or even better when turning a PTE
writable that still has the uffd-wp bit set).

This now matches the handling for hugetlb migration entries in
hugetlb_change_protection().

In copy_huge_pmd()/copy_nonpresent_pte()/copy_hugetlb_page_range(), we
still transfer the uffd-bit also for writable migration entries, but
simply because we have unified handling for "writable" and
"readable-exclusive" migration entries, and we care about transferring the
uffd-wp bit for the latter.

Link: https://lkml.kernel.org/r/20230405160236.587705-3-david@redhat.com
Signed-off-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
Cc: Muhammad Usama Anjum <usama.anjum@collabora.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/huge_memory.c
mm/mprotect.c

index 06499c9856b87b881cdf57d7883df21e17f9fc20..01043caae4b9ca506c9b2d2d8e8ee7aaf345b9b0 100644 (file)
@@ -1845,8 +1845,6 @@ int change_huge_pmd(struct mmu_gather *tlb, struct vm_area_struct *vma,
                        newpmd = swp_entry_to_pmd(entry);
                        if (pmd_swp_soft_dirty(*pmd))
                                newpmd = pmd_swp_mksoft_dirty(newpmd);
-                       if (pmd_swp_uffd_wp(*pmd))
-                               newpmd = pmd_swp_mkuffd_wp(newpmd);
                } else {
                        newpmd = *pmd;
                }
index b9da9a5f87fe9290cc5f38ce1e45c27e4c750ef3..53308a5ccf9242363a753b3bf04a8719b72444dc 100644 (file)
@@ -223,8 +223,6 @@ static long change_pte_range(struct mmu_gather *tlb,
                                newpte = swp_entry_to_pte(entry);
                                if (pte_swp_soft_dirty(oldpte))
                                        newpte = pte_swp_mksoft_dirty(newpte);
-                               if (pte_swp_uffd_wp(oldpte))
-                                       newpte = pte_swp_mkuffd_wp(newpte);
                        } else if (is_writable_device_private_entry(entry)) {
                                /*
                                 * We do not preserve soft-dirtiness. See