aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mm/hugetlb.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index 3737d82f5225..93ea46a0fba4 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -372,11 +372,19 @@ retry:
372 resv_huge_pages += delta; 372 resv_huge_pages += delta;
373 ret = 0; 373 ret = 0;
374free: 374free:
375 /* Free the needed pages to the hugetlb pool */
375 list_for_each_entry_safe(page, tmp, &surplus_list, lru) { 376 list_for_each_entry_safe(page, tmp, &surplus_list, lru) {
377 if ((--needed) < 0)
378 break;
376 list_del(&page->lru); 379 list_del(&page->lru);
377 if ((--needed) >= 0) 380 enqueue_huge_page(page);
378 enqueue_huge_page(page); 381 }
379 else { 382
383 /* Free unnecessary surplus pages to the buddy allocator */
384 if (!list_empty(&surplus_list)) {
385 spin_unlock(&hugetlb_lock);
386 list_for_each_entry_safe(page, tmp, &surplus_list, lru) {
387 list_del(&page->lru);
380 /* 388 /*
381 * The page has a reference count of zero already, so 389 * The page has a reference count of zero already, so
382 * call free_huge_page directly instead of using 390 * call free_huge_page directly instead of using
@@ -384,10 +392,9 @@ free:
384 * unlocked which is safe because free_huge_page takes 392 * unlocked which is safe because free_huge_page takes
385 * hugetlb_lock before deciding how to free the page. 393 * hugetlb_lock before deciding how to free the page.
386 */ 394 */
387 spin_unlock(&hugetlb_lock);
388 free_huge_page(page); 395 free_huge_page(page);
389 spin_lock(&hugetlb_lock);
390 } 396 }
397 spin_lock(&hugetlb_lock);
391 } 398 }
392 399
393 return ret; 400 return ret;