• Adam Litke's avatar
    hugetlb: fix pool resizing corner case · 6b0c880d
    Adam Litke authored
    When shrinking the size of the hugetlb pool via the nr_hugepages sysctl, we
    are careful to keep enough pages around to satisfy reservations.  But the
    calculation is flawed for the following scenario:
    Action                          Pool Counters (Total, Free, Resv)
    ======                          =============
    Set pool to 1 page              1 1 0
    Map 1 page MAP_PRIVATE          1 1 0
    Touch the page to fault it in   1 0 0
    Set pool to 3 pages             3 2 0
    Map 2 pages MAP_SHARED          3 2 2
    Set pool to 2 pages             2 1 2 <-- Mistake, should be 3 2 2
    Touch the 2 shared pages        2 0 1 <-- Program crashes here
    The last touch above will terminate the process due to lack of huge pages.
    This patch corrects the calculation so that it factors in pages being used
    for private mappings.  Andrew, this is a standalone fix suitable for
    mainline.  It is also now corrected in my latest dynamic pool resizing
    patchset which I will send out soon.
    Signed-off-by: default avatarAdam Litke <agl@us.ibm.com>
    Acked-by: default avatarKen Chen <kenchen@google.com>
    Cc: David Gibson <david@gibson.dropbear.id.au>
    Cc: Badari Pulavarty <pbadari@us.ibm.com>
    Cc: William Lee Irwin III <wli@holomorphy.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>