diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 32b7ee895315cf25880cd9e30d6c4babc4d9f924..a0a051f9ec293aaa6580ef5f475328b865d6e19e 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -2054,6 +2054,7 @@ int dissolve_free_huge_page(struct page *page) if (!page_count(page)) { struct page *head = compound_head(page); struct hstate *h = page_hstate(head); + bool adjust_surplus = false; if (h->free_huge_pages - h->resv_huge_pages == 0) goto out; @@ -2076,7 +2077,9 @@ int dissolve_free_huge_page(struct page *page) goto retry; } - remove_hugetlb_page(h, head, false); + if (h->surplus_huge_pages_node[page_to_nid(head)]) + adjust_surplus = true; + remove_hugetlb_page(h, head, adjust_surplus); h->max_huge_pages--; spin_unlock_irq(&hugetlb_lock); @@ -2102,7 +2105,7 @@ int dissolve_free_huge_page(struct page *page) update_and_free_page(h, head, false); } else { spin_lock_irq(&hugetlb_lock); - add_hugetlb_page(h, head, false); + add_hugetlb_page(h, head, adjust_surplus); h->max_huge_pages++; spin_unlock_irq(&hugetlb_lock); }