mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-09-10 20:29:56 -04:00
mm/hugetlb: keep max_huge_pages when dissolving surplus folios
dissolve_free_hugetlb_folio() can remove a free folio as surplus when its
node has surplus pages. In that case remove_hugetlb_folio() decrements
both nr_huge_pages and surplus_huge_pages, leaving the persistent pool
size unchanged.
Updating max_huge_pages as if a persistent folio had been removed can
therefore corrupt the persistent pool target and underflow it when
max_huge_pages is zero. Keep max_huge_pages unchanged for surplus folios,
including the vmemmap restoration rollback path.
Link: https://lore.kernel.org/20260814083027.1419487-1-xialonglong2025@163.com
Fixes: cb402bbdab ("mm/hugetlb: fix surplus pages in dissolve_free_huge_page()")
Assisted-by: Codex:gpt-5.6-sol
Signed-off-by: Longlong Xia <xialonglong@kylinos.cn>
Reviewed-by: Muchun Song <muchun.song@linux.dev>
Cc: David Hildenbrand <david@kernel.org>
Cc: Jinjiang Tu <tujinjiang@huawei.com>
Cc: Longlong Xia <xialonglong@kylinos.cn>
Cc: Oscar Salvador <osalvador@suse.de>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
committed by
Andrew Morton
parent
dc41e961a2
commit
267bede12d
@@ -1992,7 +1992,8 @@ int dissolve_free_hugetlb_folio(struct folio *folio)
|
||||
if (h->surplus_huge_pages_node[folio_nid(folio)])
|
||||
adjust_surplus = true;
|
||||
remove_hugetlb_folio(h, folio, adjust_surplus);
|
||||
h->max_huge_pages--;
|
||||
if (!adjust_surplus)
|
||||
h->max_huge_pages--;
|
||||
spin_unlock_irq(&hugetlb_lock);
|
||||
|
||||
/*
|
||||
@@ -2012,7 +2013,8 @@ int dissolve_free_hugetlb_folio(struct folio *folio)
|
||||
if (rc) {
|
||||
spin_lock_irq(&hugetlb_lock);
|
||||
add_hugetlb_folio(h, folio, adjust_surplus);
|
||||
h->max_huge_pages++;
|
||||
if (!adjust_surplus)
|
||||
h->max_huge_pages++;
|
||||
goto out;
|
||||
}
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user