Re: [PATCH v2 13/20] arm64: Support hugetlb vmemmap optimization
From: Kefeng Wang
Date: Tue Nov 10 2026 - 04:26:11 EST
On 11/7/2026 2:45 PM, Muchun Song wrote:
On Oct 3, 2026, at 08:21, James Houghton <jthoughton@xxxxxxxxxx> wrote:
Support HVO if HW AF and BBML3 are supported. These are the required
features for the vmemmap to be modified in place.
On arm64 systems that do not have the required hardware features to
support HVO, the HVO sysctl will not appear, and any attempts to enable
HVO (either via the command line or via
CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP_DEFAULT_ON=y) will have no effect.
Signed-off-by: James Houghton <jthoughton@xxxxxxxxxx>
---
arch/arm64/Kconfig | 2 ++
arch/arm64/include/asm/hugetlb.h | 7 +++++++
mm/hugetlb_vmemmap.c | 4 ++++
3 files changed, 13 insertions(+)
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
index b51d23a62c92..e4c87487bc7f 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -92,7 +92,9 @@ config ARM64
select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT
select ARCH_WANT_FRAME_POINTERS
select ARCH_WANT_HUGE_PMD_SHARE if ARM64_4K_PAGES || (ARM64_16K_PAGES && !ARM64_VA_BITS_36)
+ select ARCH_WANT_HUGETLB_VMEMMAP_RO_AFTER_INIT
select ARCH_WANT_LD_ORPHAN_WARN
+ select ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP if ARM64_HW_AFDBM
Because vmemmap optimization depends on compound_info_has_mask(), before
enabling HVO on arm64, its vmemmap start address needs to be aligned to
MAX_FOLIO_VMEMMAP_ALIGN. Therefore, a prerequisite patch is required.
Agreed, we tried to enable ARCH_WANT_OPTIMIZE_DAX_VMEMMAP[1] on ARM64.
If the alignment is not performed, a warning will be triggered with
DEBUG_VM, see sparse_init(). The same issue applies to ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP.
[1] enable ARCH_WANT_OPTIMIZE_DAX_VMEMMAP
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
index 1075bc661833..649244e55c4b 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -94,6 +94,7 @@ config ARM64
select ARCH_WANT_FRAME_POINTERS
select ARCH_WANT_HUGE_PMD_SHARE if ARM64_4K_PAGES || (ARM64_16K_PAGES && !ARM64_VA_BITS_36)
select ARCH_WANT_LD_ORPHAN_WARN
+ select ARCH_WANT_OPTIMIZE_DAX_VMEMMAP
select ARCH_WANTS_EXECMEM_LATE
select ARCH_WANTS_NO_INSTR
select ARCH_WANTS_THP_SWAP if ARM64_4K_PAGES
diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
index 4e7682dfe366..6808529873a9 100644
--- a/arch/arm64/mm/init.c
+++ b/arch/arm64/mm/init.c
@@ -91,11 +91,9 @@ phys_addr_t __ro_after_init arm64_dma_phys_limit;
* has a direct correspondence, and needs to appear sufficiently aligned
* in the virtual address space.
*/
-#if ARM64_MEMSTART_SHIFT < SECTION_SIZE_BITS
-#define ARM64_MEMSTART_ALIGN (1UL << SECTION_SIZE_BITS)
-#else
-#define ARM64_MEMSTART_ALIGN (1UL << ARM64_MEMSTART_SHIFT)
-#endif
+#define ARM64_MEMSTART_ALIGN \
+ max_t(u64, 1UL << max(SECTION_SIZE_BITS, ARM64_MEMSTART_SHIFT), \
+ PFN_PHYS(MAX_FOLIO_VMEMMAP_ALIGN / sizeof(struct page)))