Each call to the init_reserved_page function will look up the corresponding zid for the given pfn parameter. Even if subsequent calls have the same zid for the pfn as the current one, the lookup will be repeated. During system initialization, the memmap_init_reserved_pages function calls init_reserved_page for each contiguous memory region in mem_region. Implementing a cache for zid can significantly improve performance. Tests have shown that adding a zid cache reduces the execution time of the memmap_init_reserved_pages function by over 7%. Signed-off-by: Qiang Liu <liuq131@xxxxxxxxxxxxxxx> --- mm/mm_init.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/mm/mm_init.c b/mm/mm_init.c index 51960079875b..2d5b5ffa962b 100644 --- a/mm/mm_init.c +++ b/mm/mm_init.c @@ -710,19 +710,25 @@ static void __meminit init_reserved_page(unsigned long pfn, int nid) { pg_data_t *pgdat; int zid; + struct zone *zone; + static int zidcache; if (early_page_initialised(pfn, nid)) return; pgdat = NODE_DATA(nid); - for (zid = 0; zid < MAX_NR_ZONES; zid++) { - struct zone *zone = &pgdat->node_zones[zid]; + zone = &pgdat->node_zones[zidcache]; + if (unlikely(zone_spans_pfn(zone, pfn))) + for (zid = 0; zid < MAX_NR_ZONES; zid++) { + zone = &pgdat->node_zones[zid]; - if (zone_spans_pfn(zone, pfn)) - break; - } - __init_single_page(pfn_to_page(pfn), pfn, zid, nid); + if (zone_spans_pfn(zone, pfn)) { + zidcache = zid; + break; + } + } + __init_single_page(pfn_to_page(pfn), pfn, zidcache, nid); } #else static inline void pgdat_set_deferred_range(pg_data_t *pgdat) {} -- 2.27.0