• David Hildenbrand's avatar
    mm/userfaultfd: don't consider uffd-wp bit of writable migration entries · 27da93d8
    David Hildenbrand authored
    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 8f34f1ea ("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.comSigned-off-by: default avatarDavid Hildenbrand <david@redhat.com>
    Reviewed-by: default avatarPeter Xu <peterx@redhat.com>
    Cc: Muhammad Usama Anjum <usama.anjum@collabora.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    27da93d8
mprotect.c 23.8 KB