RE: [PATCH v4 1/2] mm: move overlap memory map init check to memmap_init()

From: Liu, Yuan1

Date: Sun Apr 26 2026 - 20:31:50 EST



> Subject: Re: [PATCH v4 1/2] mm: move overlap memory map init check to
> memmap_init()
>
> Hi,
>
> On Tue, Apr 21, 2026 at 08:55:07AM -0400, Yuan Liu wrote:
> > Move the overlap memmap init check from memmap_init_range() into
> > memmap_init().
> >
> > When mirrored kernelcore is enabled, avoid memory map initialization
> > for overlap regions. There are two cases that may overlap: a mirror
> > memory region assigned to movable zone, or a non-mirror memory region
> > assigned to a non-movable zone but falling within the movable zone
> > range.
> >
> > Signed-off-by: Yuan Liu <yuan1.liu@xxxxxxxxx>
> > ---
> > mm/mm_init.c | 37 +++++++++++++------------------------
> > 1 file changed, 13 insertions(+), 24 deletions(-)
> >
> > diff --git a/mm/mm_init.c b/mm/mm_init.c
> > index df34797691bd..2b5233060504 100644
> > --- a/mm/mm_init.c
> > +++ b/mm/mm_init.c
> > @@ -797,28 +797,6 @@ void __meminit reserve_bootmem_region(phys_addr_t
> start,
> > }
> > }
> >
> > -/* If zone is ZONE_MOVABLE but memory is mirrored, it is an overlapped
> init */
> > -static bool __meminit
> > -overlap_memmap_init(unsigned long zone, unsigned long *pfn)
> > -{
> > - static struct memblock_region *r;
> > -
> > - if (mirrored_kernelcore && zone == ZONE_MOVABLE) {
> > - if (!r || *pfn >= memblock_region_memory_end_pfn(r)) {
> > - for_each_mem_region(r) {
> > - if (*pfn < memblock_region_memory_end_pfn(r))
> > - break;
> > - }
> > - }
> > - if (*pfn >= memblock_region_memory_base_pfn(r) &&
> > - memblock_is_mirror(r)) {
> > - *pfn = memblock_region_memory_end_pfn(r);
> > - return true;
> > - }
> > - }
> > - return false;
> > -}
> > -
> > /*
> > * Only struct pages that correspond to ranges defined by
> memblock.memory
> > * are zeroed and initialized by going through __init_single_page()
> during
> > @@ -905,8 +883,6 @@ void __meminit memmap_init_range(unsigned long size,
> int nid, unsigned long zone
> > * function. They do not exist on hotplugged memory.
> > */
> > if (context == MEMINIT_EARLY) {
> > - if (overlap_memmap_init(zone, &pfn))
> > - continue;
> > if (defer_init(nid, pfn, zone_end_pfn)) {
> > deferred_struct_pages = true;
> > break;
> > @@ -971,6 +947,7 @@ static void __init memmap_init(void)
> >
> > for_each_mem_pfn_range(i, MAX_NUMNODES, &start_pfn, &end_pfn, &nid)
> {
> > struct pglist_data *node = NODE_DATA(nid);
> > + struct memblock_region *r = &memblock.memory.regions[i];
>
> Please move this declaration above struct pglist_data, let's keep reverse
> xmas tree where possible.

Sure, I will refine this next version.

> >
> > for (j = 0; j < MAX_NR_ZONES; j++) {
> > struct zone *zone = node->node_zones + j;
> > @@ -978,6 +955,18 @@ static void __init memmap_init(void)
> > if (!populated_zone(zone))
> > continue;
> >
> > + if (mirrored_kernelcore) {
> > + const bool is_mirror = memblock_is_mirror(r);
> > + const bool is_movable_zone = (j == ZONE_MOVABLE);
> > +
> > + if (is_mirror && is_movable_zone)
> > + continue;
> > +
> > + if (!is_mirror && !is_movable_zone &&
> > + start_pfn >= zone_movable_pfn[nid])
> > + continue;
> > + }
> > +
>
> I think this:
>
> if (mirrored_kernelcore && j == ZONE_MOVABLE &&
> memblock_is_mirror(r))
> continue;
>
> would be enough to remove overlap_memmap_init() and keep the existing
> logic.
>
> I wouldn't deal the theoretical cases Wei mentioned in this thread for
> now and prefer to keep the things simple.
> The assumptions that mirrored memory spans a contiguous range below some
> limit and that mirrored memory is not removable existed for years and I
> don't see why we should change the logic now and complicate the code for
> exotic theoretical memory layouts.

Hi Mike

Thank you for your comments.
I will update the next version based on your suggestions.

> > memmap_init_zone_range(zone, start_pfn, end_pfn,
> > &hole_pfn);
> > zone_id = j;
> > --
> > 2.47.3
> >
>
> --
> Sincerely yours,
> Mike.