• Liam R. Howlett's avatar
    mm: start tracking VMAs with maple tree · d4af56c5
    Liam R. Howlett authored
    Start tracking the VMAs with the new maple tree structure in parallel with
    the rb_tree.  Add debug and trace events for maple tree operations and
    duplicate the rb_tree that is created on forks into the maple tree.
    
    The maple tree is added to the mm_struct including the mm_init struct,
    added support in required mm/mmap functions, added tracking in kernel/fork
    for process forking, and used to find the unmapped_area and checked
    against what the rbtree finds.
    
    This also moves the mmap_lock() in exit_mmap() since the oom reaper call
    does walk the VMAs.  Otherwise lockdep will be unhappy if oom happens.
    
    When splitting a vma fails due to allocations of the maple tree nodes,
    the error path in __split_vma() calls new->vm_ops->close(new).  The page
    accounting for hugetlb is actually in the close() operation,  so it
    accounts for the removal of 1/2 of the VMA which was not adjusted.  This
    results in a negative exit value.  To avoid the negative charge, set
    vm_start = vm_end and vm_pgoff = 0.
    
    There is also a potential accounting issue in special mappings from
    insert_vm_struct() failing to allocate, so reverse the charge there in
    the failure scenario.
    
    Link: https://lkml.kernel.org/r/20220906194824.2110408-9-Liam.Howlett@oracle.comSigned-off-by: default avatarLiam R. Howlett <Liam.Howlett@Oracle.com>
    Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
    Tested-by: default avatarYu Zhao <yuzhao@google.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: David Howells <dhowells@redhat.com>
    Cc: Davidlohr Bueso <dave@stgolabs.net>
    Cc: SeongJae Park <sj@kernel.org>
    Cc: Sven Schnelle <svens@linux.ibm.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Will Deacon <will@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    d4af56c5
fork.c 80.4 KB