diff options
author | Mike Kravetz <mike.kravetz@oracle.com> | 2015-06-10 10:10:11 +1000 |
---|---|---|
committer | Stephen Rothwell <sfr@canb.auug.org.au> | 2015-06-10 10:10:11 +1000 |
commit | 7bd23d29041e6709cbb8f1a1b8d5398876104462 (patch) | |
tree | ef5c285f2857f94ee58a6927cfe8fb833f879aca /mm | |
parent | 0d8e58163f57a04445f7ecf72ec56dfa2737586c (diff) |
mm/hugetlb: handle races in alloc_huge_page and hugetlb_reserve_pages
Reserve count adjustments need to take into account hugetlbfs min_size
reservation pools
Signed-off-by: Mike 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: Andrew Morton <akpm@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/hugetlb.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 009c7225c9bc..75c0eef52c5d 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -1594,8 +1594,10 @@ static struct page *alloc_huge_page(struct vm_area_struct *vma, * the reservation count added in hugetlb_reserve_pages * no longer applies. */ - hugepage_subpool_put_pages(spool, 1); - hugetlb_acct_memory(h, -1); + long rsv_adjust; + + rsv_adjust = hugepage_subpool_put_pages(spool, 1); + hugetlb_acct_memory(h, -rsv_adjust); } return page; @@ -3725,8 +3727,11 @@ int hugetlb_reserve_pages(struct inode *inode, * the subpool and reserve counts modified above * based on the difference. */ - hugepage_subpool_put_pages(spool, chg - add); - hugetlb_acct_memory(h, -(chg - ret)); + long rsv_adjust; + + rsv_adjust = hugepage_subpool_put_pages(spool, + chg - add); + hugetlb_acct_memory(h, -rsv_adjust); } } return 0; |