• Peter Xu's avatar
    mm/hugetlb: fix uffd-wp bit lost when unsharing happens · 0f230bc2
    Peter Xu authored
    When we try to unshare a pinned page for a private hugetlb, uffd-wp bit
    can get lost during unsharing.
    
    When above condition met, one can lose uffd-wp bit on the privately mapped
    hugetlb page.  It allows the page to be writable even if it should still be
    wr-protected.  I assume it can mean data loss.
    
    This should be very rare, only if an unsharing happened on a private
    hugetlb page with uffd-wp protected (e.g.  in a child which shares the
    same page with parent with UFFD_FEATURE_EVENT_FORK enabled).
    
    When I wrote the reproducer (provided in the last patch) I needed to
    use the newest gup_test cmd introduced by David to trigger it because I
    don't even know another way to do a proper RO longerm pin.
    
    Besides that, it needs a bunch of other conditions all met:
    
            (1) hugetlb being mapped privately,
            (2) userfaultfd registered with WP and EVENT_FORK,
            (3) the user app fork()s, then,
            (4) RO longterm pin onto a wr-protected anonymous page.
    
    If it's not impossible to hit in production I'd say extremely rare.
    
    Link: https://lkml.kernel.org/r/20230417195317.898696-3-peterx@redhat.com
    Fixes: 166f3ecc ("mm/hugetlb: hook page faults for uffd write protection")
    Signed-off-by: default avatarPeter Xu <peterx@redhat.com>
    Reported-by: default avatarMike Kravetz <mike.kravetz@oracle.com>
    Reviewed-by: default avatarDavid Hildenbrand <david@redhat.com>
    Reviewed-by: default avatarMike Kravetz <mike.kravetz@oracle.com>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Axel Rasmussen <axelrasmussen@google.com>
    Cc: Mika Penttilä <mpenttil@redhat.com>
    Cc: Nadav Amit <nadav.amit@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    0f230bc2
hugetlb.c 210 KB