]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mm/mm_init.c: use deferred_init_mem_pfn_range_in_zone() to decide loop condition
authorWei Yang <richard.weiyang@gmail.com>
Wed, 5 Jun 2024 07:13:38 +0000 (07:13 +0000)
committerMike Rapoport (IBM) <rppt@kernel.org>
Thu, 6 Jun 2024 04:55:43 +0000 (07:55 +0300)
If deferred_init_mem_pfn_range_in_zone() return true, we know it finds
some range in (spfn, epfn). Then we can use it directly for the loop
condition.

Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
Reviewed-by: Mike Rapoport (IBM) <rppt@kernel.org>
Link: https://lore.kernel.org/all/20240605071339.15330-1-richard.weiyang@gmail.com
Signed-off-by: Mike Rapoport (IBM) <rppt@kernel.org>
mm/mm_init.c

index 6eda9367730b62c8fc8118f44ad84b3d4553c57a..c9c8c7458f27841bb06ee396567a7e59973a0a56 100644 (file)
@@ -2170,20 +2170,15 @@ static int __init deferred_init_memmap(void *data)
        /* Only the highest zone is deferred */
        zone = pgdat->node_zones + pgdat->nr_zones - 1;
 
-       /* If the zone is empty somebody else may have cleared out the zone */
-       if (!deferred_init_mem_pfn_range_in_zone(&i, zone, &spfn, &epfn,
-                                                first_init_pfn))
-               goto zone_empty;
-
        max_threads = deferred_page_init_max_threads(cpumask);
 
-       while (spfn < epfn) {
-               unsigned long epfn_align = ALIGN(epfn, PAGES_PER_SECTION);
+       while (deferred_init_mem_pfn_range_in_zone(&i, zone, &spfn, &epfn, first_init_pfn)) {
+               first_init_pfn = ALIGN(epfn, PAGES_PER_SECTION);
                struct padata_mt_job job = {
                        .thread_fn   = deferred_init_memmap_chunk,
                        .fn_arg      = zone,
                        .start       = spfn,
-                       .size        = epfn_align - spfn,
+                       .size        = first_init_pfn - spfn,
                        .align       = PAGES_PER_SECTION,
                        .min_chunk   = PAGES_PER_SECTION,
                        .max_threads = max_threads,
@@ -2191,10 +2186,8 @@ static int __init deferred_init_memmap(void *data)
                };
 
                padata_do_multithreaded(&job);
-               deferred_init_mem_pfn_range_in_zone(&i, zone, &spfn, &epfn,
-                                                   epfn_align);
        }
-zone_empty:
+
        /* Sanity check that the next zone really is unpopulated */
        WARN_ON(pgdat->nr_zones < MAX_NR_ZONES && populated_zone(++zone));