Re: [PATCH v2 06/14] init: fold build_all_zonelists() and page_alloc_init_cpuhp() to mm_init()

From: Mike Rapoport
Date: Wed Mar 22 2023 - 16:35:19 EST


On Wed, Mar 22, 2023 at 05:10:10PM +0100, Vlastimil Babka wrote:
> On 3/21/23 18:05, Mike Rapoport wrote:
> > From: "Mike Rapoport (IBM)" <rppt@xxxxxxxxxx>
> >
> > Both build_all_zonelists() and page_alloc_init_cpuhp() must be called
> > after SMP setup is complete but before the page allocator is set up.
> >
> > Still, they both are a part of memory management initialization, so move
> > them to mm_init().
>
> Well, logic grouping is one thing, but not breaking a functional order is
> more important. So this moves both calls to happen later than theyw ere. I
> guess it could only matter for page_alloc_init_cpuhp() in case cpu hotplugs
> would be processed in some of the calls we "skipped" over by moving this
> later. And one of them is setup_arch()... so are we sure no arch does some
> cpu hotplug for non-boot cpus there?

mm_init() happens after the point build_all_zonelists() and
page_alloc_init_cpuhp() were originally, so they are essentially moved
later in the init sequence and in either case called after setup_arch().

We skip the code below and it does not do neither cpu hotplug nor
non-memblock allocations.

jump_label_init();
parse_early_param();
after_dashes = parse_args("Booting kernel",
static_command_line, __start___param,
__stop___param - __start___param,
-1, -1, NULL, &unknown_bootoption);
print_unknown_bootoptions();
if (!IS_ERR_OR_NULL(after_dashes))
parse_args("Setting init args", after_dashes, NULL, 0, -1, -1,
NULL, set_init_arg);
if (extra_init_args)
parse_args("Setting extra init args", extra_init_args,
NULL, 0, -1, -1, NULL, set_init_arg);

/* Architectural and non-timekeeping rng init, before allocator init */
random_init_early(command_line);

/*
* These use large bootmem allocations and must precede
* kmem_cache_init()
*/
setup_log_buf(0);
vfs_caches_init_early();
sort_main_extable();
trap_init();


> > Signed-off-by: Mike Rapoport (IBM) <rppt@xxxxxxxxxx>
> > Acked-by: David Hildenbrand <david@xxxxxxxxxx>
> > ---
> > init/main.c | 7 ++++---
> > 1 file changed, 4 insertions(+), 3 deletions(-)
> >
> > diff --git a/init/main.c b/init/main.c
> > index b2499bee7a3c..4423906177c1 100644
> > --- a/init/main.c
> > +++ b/init/main.c
> > @@ -833,6 +833,10 @@ static void __init report_meminit(void)
> > */
> > static void __init mm_init(void)
> > {
> > + /* Initializations relying on SMP setup */
> > + build_all_zonelists(NULL);
> > + page_alloc_init_cpuhp();
> > +
> > /*
> > * page_ext requires contiguous pages,
> > * bigger than MAX_ORDER unless SPARSEMEM.
> > @@ -968,9 +972,6 @@ asmlinkage __visible void __init __no_sanitize_address start_kernel(void)
> > smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */
> > boot_cpu_hotplug_init();
> >
> > - build_all_zonelists(NULL);
> > - page_alloc_init_cpuhp();
> > -
> > pr_notice("Kernel command line: %s\n", saved_command_line);
> > /* parameters may set static keys */
> > jump_label_init();
>

--
Sincerely yours,
Mike.