• Peter Xu's avatar
    mm/userfaultfd: fix uffd-wp special cases for fork() · 8f34f1ea
    Peter Xu authored
    We tried to do something similar in b569a176 ("userfaultfd: wp: drop
    _PAGE_UFFD_WP properly when fork") previously, but it's not doing it all
    right..  A few fixes around the code path:
    
    1. We were referencing VM_UFFD_WP vm_flags on the _old_ vma rather
       than the new vma.  That's overlooked in b569a176, so it won't work
       as expected.  Thanks to the recent rework on fork code
       (7a4830c3), we can easily get the new vma now, so switch the
       checks to that.
    
    2. Dropping the uffd-wp bit in copy_huge_pmd() could be wrong if the
       huge pmd is a migration huge pmd.  When it happens, instead of using
       pmd_uffd_wp(), we should use pmd_swp_uffd_wp().  The fix is simply to
       handle them separately.
    
    3. Forget to carry over uffd-wp bit for a write migration huge pmd
       entry.  This also happens in copy_huge_pmd(), where we converted a
       write huge migration entry into a read one.
    
    4. In copy_nonpresent_pte(), drop uffd-wp if necessary for swap ptes.
    
    5. In copy_present_page() when COW is enforced when fork(), we also
       need to pass over the uffd-wp bit if VM_UFFD_WP is armed on the new
       vma, and when the pte to be copied has uffd-wp bit set.
    
    Remove the comment in copy_present_pte() about this.  It won't help a huge
    lot to only comment there, but comment everywhere would be an overkill.
    Let's assume the commit messages would help.
    
    [peterx@redhat.com: fix a few thp pmd missing uffd-wp bit]
      Link: https://lkml.kernel.org/r/20210428225030.9708-4-peterx@redhat.com
    
    Link: https://lkml.kernel.org/r/20210428225030.9708-3-peterx@redhat.com
    Fixes: b569a176 ("userfaultfd: wp: drop _PAGE_UFFD_WP properly when fork")
    Signed-off-by: default avatarPeter Xu <peterx@redhat.com>
    Cc: Jerome Glisse <jglisse@redhat.com>
    Cc: Mike Rapoport <rppt@linux.vnet.ibm.com>
    Cc: Alexander Viro <viro@zeniv.linux.org.uk>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Axel Rasmussen <axelrasmussen@google.com>
    Cc: Brian Geffon <bgeffon@google.com>
    Cc: "Dr . David Alan Gilbert" <dgilbert@redhat.com>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Joe Perches <joe@perches.com>
    Cc: Kirill A. Shutemov <kirill@shutemov.name>
    Cc: Lokesh Gidra <lokeshgidra@google.com>
    Cc: Mike Kravetz <mike.kravetz@oracle.com>
    Cc: Mina Almasry <almasrymina@google.com>
    Cc: Oliver Upton <oupton@google.com>
    Cc: Shaohua Li <shli@fb.com>
    Cc: Shuah Khan <shuah@kernel.org>
    Cc: Stephen Rothwell <sfr@canb.auug.org.au>
    Cc: Wang Qing <wangqing@vivo.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    8f34f1ea
huge_memory.c 87.4 KB