diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/hugetlb.c | 17 |
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; |
374 | free: | 374 | free: |
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; |