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

From: Muchun Song

Date: Sat Nov 07 2026 - 01:45:41 EST




> 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.

Thanks,
Muchun

> select ARCH_WANTS_EXECMEM_LATE
> select ARCH_WANTS_NO_INSTR
> select ARCH_WANTS_THP_SWAP if ARM64_4K_PAGES
> diff --git a/arch/arm64/include/asm/hugetlb.h b/arch/arm64/include/asm/hugetlb.h
> index d038ff14d16c..938d7896a31e 100644
> --- a/arch/arm64/include/asm/hugetlb.h
> +++ b/arch/arm64/include/asm/hugetlb.h
> @@ -11,6 +11,7 @@
> #define __ASM_HUGETLB_H
>
> #include <asm/cacheflush.h>
> +#include <asm/cpufeature.h>
> #include <asm/mte.h>
> #include <asm/page.h>
>
> @@ -65,6 +66,12 @@ extern void huge_ptep_modify_prot_commit(struct vm_area_struct *vma,
> unsigned long addr, pte_t *ptep,
> pte_t old_pte, pte_t new_pte);
>
> +#define __HAVE_ARCH_HVO_SUPPORTED
> +static inline bool arch_hugetlb_vmemmap_optimization_supported(void)
> +{
> + return system_supports_bbm_through_af();
> +}
> +
> #include <asm-generic/hugetlb.h>
>
> static inline void __flush_hugetlb_tlb_range(struct vm_area_struct *vma,
> diff --git a/mm/hugetlb_vmemmap.c b/mm/hugetlb_vmemmap.c
> index c1c736dd08b9..fabf2b25fe59 100644
> --- a/mm/hugetlb_vmemmap.c
> +++ b/mm/hugetlb_vmemmap.c
> @@ -85,6 +85,10 @@ static int vmemmap_split_pmd(pmd_t *pmd, struct page *head, unsigned long start,
>
> /* Make pte visible before pmd. See comment in pmd_install(). */
> smp_wmb();
> + /*
> + * On arm64, this requires BBML3. Its support has already been
> + * checked.
> + */
> pmd_populate_kernel(&init_mm, pmd, pgtable);
> if (!(walk->flags & VMEMMAP_SPLIT_NO_TLB_FLUSH))
> flush_tlb_kernel_range(start, start + PMD_SIZE);
> --
> 2.56.0.rc1.315.gc6ed9934b7-goog
>