[PATCH v3 08/12] mm: hugetlb_vmemmap: move alloc_vmemmap_page_list() next to its free helper

From: Muchun Song

Date: Tue Nov 03 2026 - 21:38:18 EST


Keep alloc_vmemmap_page_list() together with
free_vmemmap_page_list(). This also allows the folio-oriented
optimization helper introduced in a subsequent change to reuse the
allocator without a forward declaration.

No functional change intended.

Signed-off-by: Muchun Song <songmuchun@xxxxxxxxxxxxx>
Reviewed-by: Lance Yang <lance.yang@xxxxxxxxx>
Reviewed-by: Qi Zheng <qi.zheng@xxxxxxxxx>
Reviewed-by: Mike Rapoport (Microsoft) <rppt@xxxxxxxxxx>
---
v3:
- Carry the revised allocation cleanup through the helper move (follow-up
to review by Mike Rapoport)
- Collect Reviewed-by from Mike Rapoport

v2:
- Collect Reviewed-by from Lance Yang and Qi Zheng
---
mm/hugetlb_vmemmap.c | 44 ++++++++++++++++++++++----------------------
1 file changed, 22 insertions(+), 22 deletions(-)

diff --git a/mm/hugetlb_vmemmap.c b/mm/hugetlb_vmemmap.c
index 2724539f9c62..7d51df1cb78b 100644
--- a/mm/hugetlb_vmemmap.c
+++ b/mm/hugetlb_vmemmap.c
@@ -197,6 +197,28 @@ static void free_vmemmap_page_list(struct list_head *list)
free_vmemmap_page(page);
}

+static int alloc_vmemmap_page_list(struct list_head *head,
+ unsigned int nr_pages, int nid)
+{
+ LIST_HEAD(new_pages);
+ struct page *page, *next;
+
+ for (unsigned int i = 0; i < nr_pages; i++) {
+ page = alloc_pages_node(nid, GFP_KERNEL | __GFP_RETRY_MAYFAIL, 0);
+ if (!page)
+ goto free_pages;
+ list_add(&page->lru, &new_pages);
+ }
+ list_splice(&new_pages, head);
+ memmap_pages_add(nr_pages);
+
+ return 0;
+free_pages:
+ list_for_each_entry_safe(page, next, &new_pages, lru)
+ __free_page(page);
+ return -ENOMEM;
+}
+
static struct page *vmemmap_dup_page_from_list(const struct page *src,
struct list_head *vmemmap_pages)
{
@@ -324,28 +346,6 @@ static int vmemmap_remap_free(unsigned long start, unsigned long end,
return ret;
}

-static int alloc_vmemmap_page_list(struct list_head *head,
- unsigned int nr_pages, int nid)
-{
- LIST_HEAD(new_pages);
- struct page *page, *next;
-
- for (unsigned int i = 0; i < nr_pages; i++) {
- page = alloc_pages_node(nid, GFP_KERNEL | __GFP_RETRY_MAYFAIL, 0);
- if (!page)
- goto free_pages;
- list_add(&page->lru, &new_pages);
- }
- list_splice(&new_pages, head);
- memmap_pages_add(nr_pages);
-
- return 0;
-free_pages:
- list_for_each_entry_safe(page, next, &new_pages, lru)
- __free_page(page);
- return -ENOMEM;
-}
-
/**
* vmemmap_remap_alloc - remap the vmemmap virtual address range [@start, end)
* to the page which is from the @vmemmap_pages
--
2.54.0