[PATCH 2/2] mm/mm_init.c: count nr_initialised only for last zone

Wei Yang
2024-05-22T07:31:18Z

Since we always populate low zones, it is not necessary to count
nr_initialised for them. Let's move the last zone check ahead to skip
the nr_initialised reset.

Assume low zones counts for 4G, this change may reduce 1M times
comparison of prev_end_pfn and end_pfn.

Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
---
mm/mm_init.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/mm/mm_init.c b/mm/mm_init.c
index 2dfb87841fdb..4cc627b4ebfe 100644
--- a/mm/mm_init.c
+++ b/mm/mm_init.c
@@ -676,6 +676,11 @@ defer_init(int nid, unsigned long pfn, unsigned long end_pfn)

if (early_page_ext_enabled())
return false;
+
+ /* Always populate low zones for address-constrained allocations */
+ if (end_pfn < pgdat_end_pfn(NODE_DATA(nid)))
+ return false;
+
/*
* prev_end_pfn static that contains the end of previous zone
* No need to protect because called very early in boot before smp_init.
@@ -685,10 +690,6 @@ defer_init(int nid, unsigned long pfn, unsigned long end_pfn)
nr_initialised = 0;
}

- /* Always populate low zones for address-constrained allocations */
- if (end_pfn < pgdat_end_pfn(NODE_DATA(nid)))
- return false;
-
if (NODE_DATA(nid)->first_deferred_pfn != ULONG_MAX)
return true;
/*
--
2.34.1