• Adam Litke's avatar
    hugetlb: close a difficult to trigger reservation race · ac09b3a1
    Adam Litke authored
    A hugetlb reservation may be inadequately backed in the event of racing
    allocations and frees when utilizing surplus huge pages.  Consider the
    following series of events in processes A and B:
     A) Allocates some surplus pages to satisfy a reservation
     B) Frees some huge pages
     A) A notices the extra free pages and drops hugetlb_lock to free some of
        its surplus pages back to the buddy allocator.
     B) Allocates some huge pages
     A) Reacquires hugetlb_lock and returns from gather_surplus_huge_pages()
    Avoid this by commiting the reservation after pages have been allocated but
    before dropping the lock to free excess pages.  For parity, release the
    reservation in return_unused_surplus_pages().
    This patch also corrects the cpuset_mems_nr() error path in
    hugetlb_acct_memory().  If the cpuset check fails, uncommit the
    reservation, but also be sure to return any surplus huge pages that may
    have been allocated to back the failed reservation.
    Thanks to Andy Whitcroft for discovering this.
    Signed-off-by: default avatarAdam Litke <agl@us.ibm.com>
    Cc: Mel Gorman <mel@csn.ul.ie>
    Cc: Andy Whitcroft <apw@shadowen.org>
    Cc: Dave Hansen <haveblue@us.ibm.com>
    Cc: William Lee Irwin III <wli@holomorphy.com>
    Cc: Andy Whitcroft <apw@shadowen.org>
    Cc: Mel Gorman <mel@csn.ul.ie>
    Cc: David Gibson <david@gibson.dropbear.id.au>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>