diff --git a/mm/hugetlb.c b/mm/hugetlb.c index b67ba647ec43f417cf00236656b41fc42b8c6828..090da344e4b79e855c7860a61b199a2aa9addfe0 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -2384,6 +2384,8 @@ int dissolve_free_huge_page(struct page *page) if (!folio_ref_count(folio)) { struct hstate *h = folio_hstate(folio); + bool adjust_surplus = false; + if (!available_huge_pages(h)) goto out; @@ -2406,7 +2408,9 @@ int dissolve_free_huge_page(struct page *page) goto retry; } - remove_hugetlb_folio(h, folio, false); + if (h->surplus_huge_pages_node[folio_nid(folio)]) + adjust_surplus = true; + remove_hugetlb_folio(h, folio, adjust_surplus); h->max_huge_pages--; spin_unlock_irq(&hugetlb_lock); @@ -2426,7 +2430,7 @@ int dissolve_free_huge_page(struct page *page) rc = hugetlb_vmemmap_restore(h, &folio->page); if (rc) { spin_lock_irq(&hugetlb_lock); - add_hugetlb_folio(h, folio, false); + add_hugetlb_folio(h, folio, adjust_surplus); h->max_huge_pages++; goto out; }