Re: [PATCH v8 0/6] mm: Fix vmemmap optimization accounting and initialization

Andrew Morton
2026-04-28T13:48:43Z

On Tue, 28 Apr 2026 16:18:49 +0800 Muchun Song <songmuchun@bytedance.com> wrote:

> The series fixes several bugs in vmemmap optimization, mainly around
> incorrect page accounting and memmap initialization in DAX and memory
> hotplug paths. It also fixes pageblock migratetype initialization and
> struct page initialization for ZONE_DEVICE compound pages.
>
> Patches 1-4 fix vmemmap accounting issues. Patch 1 fixes an accounting
> underflow in the section activation failure path by moving vmemmap page
> accounting into the lower-level allocation and freeing helpers. Patch 2
> fixes incorrect altmap passing in the memory hotplug error path. Patch 3
> passes pgmap through memory deactivation paths so the teardown side can
> determine whether vmemmap optimization was in effect. Patch 4 uses that
> information to account the optimized DAX vmemmap size correctly.
>
> Patches 5-6 fix initialization issues in mm/mm_init. One makes sure all
> pageblocks in ZONE_DEVICE compound pages get their migratetype
> initialized. The other fixes a case where DAX memory hotplug reuses an
> unoptimized early-section memmap while compound_nr_pages() still assumes
> vmemmap optimization, leaving tail struct pages uninitialized.

Thanks, I updated mm-new to this version.

> Changes in v8:
> - In patch 4, move VM_WARN_ON_ONCE(nr_pages > PAGES_PER_SECTION) to the
> top of section_nr_vmemmap_pages().
> - In patch 4, add Acked-by from David Hildenbrand.

Here's how v8 altered mm.git:

--- a/mm/sparse-vmemmap.c~b
+++ a/mm/sparse-vmemmap.c
@@ -654,6 +654,7 @@ static int __meminit section_nr_vmemmap_
const unsigned long pages_per_compound = 1UL << order;

VM_WARN_ON_ONCE(!IS_ALIGNED(pfn | nr_pages, PAGES_PER_SUBSECTION));
+ VM_WARN_ON_ONCE(nr_pages > PAGES_PER_SECTION);

if (!vmemmap_can_optimize(altmap, pgmap))
return DIV_ROUND_UP(nr_pages * sizeof(struct page), PAGE_SIZE);
@@ -664,7 +665,6 @@ static int __meminit section_nr_vmemmap_
}

VM_WARN_ON_ONCE(!IS_ALIGNED(pfn | nr_pages, PAGES_PER_SECTION));
- VM_WARN_ON_ONCE(nr_pages > PAGES_PER_SECTION);

if (IS_ALIGNED(pfn, pages_per_compound))
return VMEMMAP_RESERVE_NR;
_