• Naoya Horiguchi's avatar
    mm: hugetlb: fix hugepage memory leak caused by wrong reserve count · a88c7695
    Naoya Horiguchi authored
    When dequeue_huge_page_vma() in alloc_huge_page() fails, we fall back on
    alloc_buddy_huge_page() to directly create a hugepage from the buddy
    allocator.
    
    In that case, however, if alloc_buddy_huge_page() succeeds we don't
    decrement h->resv_huge_pages, which means that successful
    hugetlb_fault() returns without releasing the reserve count.  As a
    result, subsequent hugetlb_fault() might fail despite that there are
    still free hugepages.
    
    This patch simply adds decrementing code on that code path.
    
    I reproduced this problem when testing v4.3 kernel in the following situation:
     - the test machine/VM is a NUMA system,
     - hugepage overcommiting is enabled,
     - most of hugepages are allocated and there's only one free hugepage
       which is on node 0 (for example),
     - another program, which calls set_mempolicy(MPOL_BIND) to bind itself to
       node 1, tries to allocate a hugepage,
     - the allocation should fail but the reserve count is still hold.
    Signed-off-by: default avatarNaoya Horiguchi <n-horiguchi@ah.jp.nec.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Dave Hansen <dave.hansen@intel.com>
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: Hillf Danton <hillf.zj@alibaba-inc.com>
    Cc: Mike Kravetz <mike.kravetz@oracle.com>
    Cc: <stable@vger.kernel.org> [3.16+]
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    a88c7695
hugetlb.c 118 KB