[PATCH v4 09/13] mm: hugetlb_vmemmap: move alloc_vmemmap_page_list() next to its free helper
From: Muchun Song
Date: Fri Nov 06 2026 - 21:35:50 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>
Reviewed-by: Oscar Salvador <osalvador@xxxxxxx>
Tested-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
---
v4:
- Carry the caller-selected allocation mask through the helper move
- Collect Reviewed-by from Oscar Salvador
- Collect Tested-by from Andrew Morton
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 3968dfe7f5a0..6c248e8fbdde 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, gfp_t gfp_mask)
+{
+ struct page *page, *next;
+ LIST_HEAD(new_pages);
+
+ for (unsigned int i = 0; i < nr_pages; i++) {
+ page = alloc_pages_node(nid, gfp_mask | __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, gfp_t gfp_mask)
-{
- struct page *page, *next;
- LIST_HEAD(new_pages);
-
- for (unsigned int i = 0; i < nr_pages; i++) {
- page = alloc_pages_node(nid, gfp_mask | __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