• Mike Kravetz's avatar
    hugetlb: fix vma lock handling during split vma and range unmapping · 131a79b4
    Mike Kravetz authored
    Patch series "hugetlb: fixes for new vma lock series".
    
    In review of the series "hugetlb: Use new vma lock for huge pmd sharing
    synchronization", Miaohe Lin pointed out two key issues:
    
    1) There is a race in the routine hugetlb_unmap_file_folio when locks
       are dropped and reacquired in the correct order [1].
    
    2) With the switch to using vma lock for fault/truncate synchronization,
       we need to make sure lock exists for all VM_MAYSHARE vmas, not just
       vmas capable of pmd sharing.
    
    These two issues are addressed here.  In addition, having a vma lock
    present in all VM_MAYSHARE vmas, uncovered some issues around vma
    splitting.  Those are also addressed.
    
    [1] https://lore.kernel.org/linux-mm/01f10195-7088-4462-6def-909549c75ef4@huawei.com/
    
    
    This patch (of 3):
    
    The hugetlb vma lock hangs off the vm_private_data field and is specific
    to the vma.  When vm_area_dup() is called as part of vma splitting, the
    vma lock pointer is copied to the new vma.  This will result in issues
    such as double freeing of the structure.  Update the hugetlb open vm_ops
    to allocate a new vma lock for the new vma.
    
    The routine __unmap_hugepage_range_final unconditionally unset VM_MAYSHARE
    to prevent subsequent pmd sharing.  hugetlb_vma_lock_free attempted to
    anticipate this by checking both VM_MAYSHARE and VM_SHARED.  However, if
    only VM_MAYSHARE was set we would miss the free.  With the introduction of
    the vma lock, a vma can not participate in pmd sharing if vm_private_data
    is NULL.  Instead of clearing VM_MAYSHARE in __unmap_hugepage_range_final,
    free the vma lock to prevent sharing.  Also, update the sharing code to
    make sure vma lock is indeed a condition for pmd sharing. 
    hugetlb_vma_lock_free can then key off VM_MAYSHARE and not miss any vmas.
    
    Link: https://lkml.kernel.org/r/20221005011707.514612-1-mike.kravetz@oracle.com
    Link: https://lkml.kernel.org/r/20221005011707.514612-2-mike.kravetz@oracle.com
    Fixes: "hugetlb: add vma based lock for pmd sharing"
    Signed-off-by: default avatarMike Kravetz <mike.kravetz@oracle.com>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
    Cc: Axel Rasmussen <axelrasmussen@google.com>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: Davidlohr Bueso <dave@stgolabs.net>
    Cc: James Houghton <jthoughton@google.com>
    Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
    Cc: Miaohe Lin <linmiaohe@huawei.com>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Mina Almasry <almasrymina@google.com>
    Cc: Muchun Song <songmuchun@bytedance.com>
    Cc: Naoya Horiguchi <naoya.horiguchi@linux.dev>
    Cc: Pasha Tatashin <pasha.tatashin@soleen.com>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Prakash Sangappa <prakash.sangappa@oracle.com>
    Cc: Sven Schnelle <svens@linux.ibm.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    131a79b4
hugetlb.c 205 KB