Re: [PATCH v2 13/20] arm64: Support hugetlb vmemmap optimization

From: James Houghton

Date: Tue Nov 10 2026 - 17:26:06 EST


On Tue, Nov 10, 2026 at 1:16 AM Kefeng Wang <wangkefeng.wang@xxxxxxxxxx> wrote:
>
>
>
> 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)))

Thanks, Muchun and Kefeng. I never hit this warning, I think because I
was only using 4K base pages. I'll make sure to test with 16K and 64K
base pages before sending v3. I'll make the same fix, though I think I
will write it differently.