Re: [PATCH v4 0/6] mm: Unify device DAX and HugeTLB vmemmap population paths

From: Andrew Morton

Date: Sat Oct 10 2026 - 16:42:30 EST


On Sat, 10 Oct 2026 15:57:49 +0800 Muchun Song <songmuchun@xxxxxxxxxxxxx> wrote:

> This v4 is based on mm-new commit d5207c6d152c, which contains v6 of
> "mm: Switch device DAX to section-based vmemmap optimization" [1].
>
> This series is split out from the earlier, larger series "mm: Generalize
> HVO for HugeTLB and device DAX" [2]. While the parent series generalizes
> vmemmap optimization across HugeTLB and device DAX, this subset addresses
> a single, self-contained step: unifying their vmemmap population paths.
>
> After the preceding Device DAX conversion, both HugeTLB and Device DAX
> describe optimized vmemmap mappings through memory-section metadata and
> use per-zone shared tail vmemmap pages. The generic code, however, still
> carries a Device DAX-specific population flag and compound-page population
> path, along with arguments and helpers needed only by that path.
>
> This series first removes VMEMMAP_POPULATE_DAX and moves selection and
> reference handling for the shared tail page into the common vmemmap
> population path. It then removes the generic Device DAX-specific
> compound-page population path and routes section vmemmap population
> through vmemmap_populate(). The powerpc radix path continues to use its
> architecture-specific compound-page population implementation for
> optimizable sections.
>
> The remaining patches remove the unused ptpfn argument, open-code
> vmemmap_populate_address() now that no caller needs its returned PTE, and
> add a warning for inconsistent zone initialization of shared tail vmemmap
> pages.
>
> This is the fourth smaller step toward the broader HVO generalization.
> After this series, HugeTLB and Device DAX use the same population model
> instead of parallel generic paths, while powerpc keeps its
> architecture-specific implementation.

Thanks, I've updated mm-unstable to this version, including the -fix.

> v4:
> - Rebase onto mm-new commit d5207c6d152c, which contains v6 of the Device
> DAX section-based vmemmap series.
> - Factor the zone mismatch check into a local helper as suggested by Mike
> Rapoport.
> - Collect Reviewed-by tags from Lance Yang.

Here's how v4 altered mm.git:


mm/mm_init.c | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)

--- a/mm/mm_init.c~b
+++ a/mm/mm_init.c
@@ -593,6 +593,15 @@ out:
node_states[N_MEMORY] = saved_node_state;
}

+static inline void vmemmap_optimization_verify_zone(struct page *page)
+{
+ const unsigned int order = pfn_to_section_compound_order(page_to_pfn(page));
+
+ VM_WARN_ON_ONCE(vmemmap_optimizable_order(order) &&
+ page_zone_id(page + VMEMMAP_OPTIMIZATION_NR_STRUCT_PAGES) !=
+ page_zone_id(page));
+}
+
void __meminit __init_single_page(struct page *page, unsigned long pfn,
unsigned long zone, int nid)
{
@@ -609,9 +618,11 @@ void __meminit __init_single_page(struct
if (!is_highmem_idx(zone))
set_page_address(page, __va(pfn << PAGE_SHIFT));
#endif
- VM_WARN_ON_ONCE(vmemmap_optimizable_order(pfn_to_section_compound_order(pfn)) &&
- page_zone_id(page + VMEMMAP_OPTIMIZATION_NR_STRUCT_PAGES) !=
- page_zone_id(page));
+ /*
+ * Shared tail struct pages are initialized during vmemmap population,
+ * before retained struct pages reach here.
+ */
+ vmemmap_optimization_verify_zone(page);
}

#ifdef CONFIG_NUMA
_