• Mike Kravetz's avatar
    mm/hugetlb: document the reserve map/region tracking routines · 1dd308a7
    Mike Kravetz authored
    While working on hugetlbfs fallocate support, I noticed the following race
    in the existing code.  It is unlikely that this race is hit very often in
    the current code.  However, if more functionality to add and remove pages
    to hugetlbfs mappings (such as fallocate) is added the likelihood of
    hitting this race will increase.
    
    alloc_huge_page and hugetlb_reserve_pages use information from the reserve
    map to determine if there are enough available huge pages to complete the
    operation, as well as adjust global reserve and subpool usage counts.  The
    order of operations is as follows:
    
    - call region_chg() to determine the expected change based on reserve map
    - determine if enough resources are available for this operation
    - adjust global counts based on the expected change
    - call region_add() to update the reserve map
    
    The issue is that reserve map could change between the call to region_chg
    and region_add.  In this case, the counters which were adjusted based on
    the output of region_chg will not be correct.
    
    In order to hit this race today, there must be an existing shared hugetlb
    mmap created with the MAP_NORESERVE flag.  A page fault to allocate a huge
    page via this mapping must occur at the same another task is mapping the
    same region without the MAP_NORESERVE flag.
    
    The patch set does not prevent the race from happening.  Rather, it adds
    simple functionality to detect when the race has occurred.  If a race is
    detected, then the incorrect counts are adjusted.
    
    Review comments pointed out the need for documentation of the existing
    region/reserve map routines.  This patch set also adds documentation in
    this area.
    
    This patch (of 3):
    
    This is a documentation only patch and does not modify any code.
    Descriptions of the routines used for reserve map/region tracking are
    added.
    Signed-off-by: default avatarMike Kravetz <mike.kravetz@oracle.com>
    Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
    Cc: Davidlohr Bueso <dave@stgolabs.net>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Luiz Capitulino <lcapitulino@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    1dd308a7
hugetlb.c 105 KB