[PATCH] skip overlap region higher level
From: Wei Yang
Date: Tue Apr 21 2026 - 21:13:24 EST
---
mm/mm_init.c | 29 ++++++++++++++++++++++-------
1 file changed, 22 insertions(+), 7 deletions(-)
diff --git a/mm/mm_init.c b/mm/mm_init.c
index 79f93f2a90cf..7a85ba58e87f 100644
--- a/mm/mm_init.c
+++ b/mm/mm_init.c
@@ -916,8 +916,8 @@ 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 (overlap_memmap_init(zone, &pfn))
+ // continue;
if (defer_init(nid, pfn, zone_end_pfn)) {
deferred_struct_pages = true;
break;
@@ -974,6 +974,17 @@ static void __init memmap_init_zone_range(struct zone *zone,
*hole_pfn = end_pfn;
}
+static bool __init region_overlapped(struct memblock_region *rgn, unsigned long zone_type)
+{
+ if (zone_type == ZONE_MOVABLE && memblock_is_mirror(rgn))
+ return true;
+
+ if (zone_type == ZONE_NORMAL && !memblock_is_mirror(rgn))
+ return true;
+
+ return false;
+}
+
static void __init memmap_init(void)
{
unsigned long start_pfn, end_pfn;
@@ -985,10 +996,15 @@ static void __init memmap_init(void)
for (j = 0; j < MAX_NR_ZONES; j++) {
struct zone *zone = node->node_zones + j;
+ struct memblock_region *r = &memblock.memory.regions[i];
if (!populated_zone(zone))
continue;
+ if (mirrored_kernelcore && zone_movable_pfn[nid] &&
+ region_overlapped(r, j))
+ continue;
+
memmap_init_zone_range(zone, start_pfn, end_pfn,
&hole_pfn);
zone_id = j;
@@ -1257,13 +1273,12 @@ static unsigned long __init zone_absent_pages_in_node(int nid,
end_pfn = clamp(memblock_region_memory_end_pfn(r),
zone_start_pfn, zone_end_pfn);
- if (zone_type == ZONE_MOVABLE &&
- memblock_is_mirror(r))
- nr_absent += end_pfn - start_pfn;
+ if (start_pfn == end_pfn)
+ continue;
- if (zone_type == ZONE_NORMAL &&
- !memblock_is_mirror(r))
+ if (region_overlapped(r, zone_type))
nr_absent += end_pfn - start_pfn;
+
}
}
Want to confirm, the logic in zone_absent_pages_in_node() only handle
ZONE_NORMAL and ZONE_MOVABLE. So the assumption is ZONE_MOVABLE only could
overlap with ZONE_NORMAL?
When kernelcore=[nn]M is used, the "highest" populated zone is picked up to be
ZONE_MOVABLE, as indicated by find_usable_zone_for_movable(). So looks it is
possible to choose ZONE_DMA32 as ZONE_MOVABLE.
For kernelcore=mirror, we want to eliminate the complexity?
--
Wei Yang
Help you, Help me