[PATCH 04/15] mm/hugetlb_vmemmap: use folio_page() for vmemmap address arithmetic

From: Nilay Vaish

Date: Tue Sep 29 2026 - 17:58:08 EST


As part of the memdescs effort, struct folio will be allocated
separately from struct page and will no longer overlay the head page.

Replace direct (unsigned long)&folio->page casts and the implicit folio
pointer passed to copy_page() with folio_page(folio, 0) so HugeTLB
Vmemmap Optimization (HVO) operates on the vmemmap head page rather than
the struct folio address when struct folio is separately allocated.

No functional change intended.

Assisted-by: LLM
Signed-off-by: Nilay Vaish <nilayvaish@xxxxxxxxxx>
---
mm/hugetlb_vmemmap.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/mm/hugetlb_vmemmap.c b/mm/hugetlb_vmemmap.c
index 0057fa2a16a8..807c6bb23997 100644
--- a/mm/hugetlb_vmemmap.c
+++ b/mm/hugetlb_vmemmap.c
@@ -403,7 +403,7 @@ static int __hugetlb_vmemmap_restore_folio(const struct hstate *h,
if (!folio_test_hugetlb_vmemmap_optimized(folio))
return 0;

- vmemmap_start = (unsigned long)&folio->page;
+ vmemmap_start = (unsigned long)folio_page(folio, 0);
vmemmap_end = vmemmap_start + hugetlb_vmemmap_size(h);

vmemmap_start += HUGETLB_VMEMMAP_RESERVE_SIZE;
@@ -531,11 +531,11 @@ static int __hugetlb_vmemmap_optimize_folio(const struct hstate *h,
goto out;
}

- copy_page(page_to_virt(vmemmap_head), folio);
+ copy_page(page_to_virt(vmemmap_head), folio_page(folio, 0));
list_add(&vmemmap_head->lru, vmemmap_pages);
memmap_pages_add(1);

- vmemmap_start = (unsigned long)&folio->page;
+ vmemmap_start = (unsigned long)folio_page(folio, 0);
vmemmap_end = vmemmap_start + hugetlb_vmemmap_size(h);

/*
@@ -578,7 +578,7 @@ static int hugetlb_vmemmap_split_folio(const struct hstate *h, struct folio *fol
if (!vmemmap_should_optimize_folio(h, folio))
return 0;

- vmemmap_start = (unsigned long)&folio->page;
+ vmemmap_start = (unsigned long)folio_page(folio, 0);
vmemmap_end = vmemmap_start + hugetlb_vmemmap_size(h);

/*
@@ -610,7 +610,7 @@ static void __hugetlb_vmemmap_optimize_folios(struct hstate *h,
* Already optimized by pre-HVO, just map the
* mirrored tail page structs RO.
*/
- spfn = (unsigned long)&folio->page;
+ spfn = (unsigned long)folio_page(folio, 0);
epfn = spfn + hugetlb_vmemmap_size(h);
vmemmap_wrprotect_hvo(spfn, epfn, folio_nid(folio),
HUGETLB_VMEMMAP_RESERVE_SIZE);
--
2.56.0.rc1.315.gc6ed9934b7-goog