• P
    hugetlb/userfaultfd: forbid huge pmd sharing when uffd enabled · c1991e07
    Peter Xu 提交于
    Huge pmd sharing could bring problem to userfaultfd.  The thing is that
    userfaultfd is running its logic based on the special bits on page table
    entries, however the huge pmd sharing could potentially share page table
    entries for different address ranges.  That could cause issues on
    either:
    
     - When sharing huge pmd page tables for an uffd write protected range,
       the newly mapped huge pmd range will also be write protected
       unexpectedly, or,
    
     - When we try to write protect a range of huge pmd shared range, we'll
       first do huge_pmd_unshare() in hugetlb_change_protection(), however
       that also means the UFFDIO_WRITEPROTECT could be silently skipped for
       the shared region, which could lead to data loss.
    
    While at it, a few other things are done altogether:
    
     - Move want_pmd_share() from mm/hugetlb.c into linux/hugetlb.h, because
       that's definitely something that arch code would like to use too
    
     - ARM64 currently directly check against
       CONFIG_ARCH_WANT_HUGE_PMD_SHARE when trying to share huge pmd. Switch
       to the want_pmd_share() helper.
    
     - Move vma_shareable() from huge_pmd_share() into want_pmd_share().
    
    [peterx@redhat.com: fix build with !ARCH_WANT_HUGE_PMD_SHARE]
      Link: https://lkml.kernel.org/r/20210310185359.88297-1-peterx@redhat.com
    
    Link: https://lkml.kernel.org/r/20210218231202.15426-1-peterx@redhat.comSigned-off-by: NPeter Xu <peterx@redhat.com>
    Reviewed-by: NMike Kravetz <mike.kravetz@oracle.com>
    Reviewed-by: NAxel Rasmussen <axelrasmussen@google.com>
    Tested-by: NNaresh Kamboju <naresh.kamboju@linaro.org>
    Cc: Adam Ruprecht <ruprecht@google.com>
    Cc: Alexander Viro <viro@zeniv.linux.org.uk>
    Cc: Alexey Dobriyan <adobriyan@gmail.com>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Anshuman Khandual <anshuman.khandual@arm.com>
    Cc: Cannon Matthews <cannonmatthews@google.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Chinwen Chang <chinwen.chang@mediatek.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: "Dr . David Alan Gilbert" <dgilbert@redhat.com>
    Cc: Huang Ying <ying.huang@intel.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Jann Horn <jannh@google.com>
    Cc: Jerome Glisse <jglisse@redhat.com>
    Cc: Kirill A. Shutemov <kirill@shutemov.name>
    Cc: Lokesh Gidra <lokeshgidra@google.com>
    Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>
    Cc: Michael Ellerman <mpe@ellerman.id.au>
    Cc: "Michal Koutn" <mkoutny@suse.com>
    Cc: Michel Lespinasse <walken@google.com>
    Cc: Mike Rapoport <rppt@linux.vnet.ibm.com>
    Cc: Mina Almasry <almasrymina@google.com>
    Cc: Nicholas Piggin <npiggin@gmail.com>
    Cc: Oliver Upton <oupton@google.com>
    Cc: Shaohua Li <shli@fb.com>
    Cc: Shawn Anastasio <shawn@anastas.io>
    Cc: Steven Price <steven.price@arm.com>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    c1991e07
hugetlb.c 157.9 KB