[BOOT-WRAPPER v2 10/10] Boot CPUs sequentially

Mark Rutland mark.rutland at arm.com
Thu Aug 22 03:02:36 PDT 2024


On Wed, Aug 21, 2024 at 06:49:23PM +0100, Andre Przywara wrote:
> On Mon, 12 Aug 2024 11:15:55 +0100
> Mark Rutland <mark.rutland at arm.com> wrote:
> 
> > Currently the boot-wrapper initializes all CPUs in parallel. This means
> > that we cannot log errors as they happen, as this would mean multiple
> > CPUs concurrently writing to the UART, producing garbled output. To
> > produce meaningful output we have to special-case errors on the boot CPU
> > and hope CPUs have been configured consistently.
> > 
> > To make it easier to handle errors, boot CPUs sequentially so that errors
> > can be logged as they happen. With this change it's pretty clear that
> > the cpu_init_bootmethod() abstraction isn't helpful, and so this is
> > removed with cpu_init_arch() directly initializing PSCI where necessary.
> 
> Yeah, makes sense, though the change is a bit hard to follow in the diff
> below. But I convinced myself that it's correct. Just one small comment
> inside:
> 
> > When things go well this looks like:
> > 
> > | Boot-wrapper v0.2
> > | Entered at EL3
> > | Memory layout:
> > | [0000000080000000..0000000080001f90] => boot-wrapper
> > | [000000008000fff8..0000000080010000] => mbox
> > | [0000000080200000..0000000082cbaa00] => kernel
> > | [0000000088000000..0000000088002df1] => dtb
> > | CPU0: (MPIDR 0000000000000000) initializing...
> > | CPU0: Done
> > | CPU1: (MPIDR 0000000000000100) initializing...
> > | CPU1: Done
> > | CPU2: (MPIDR 0000000000000200) initializing...
> > | CPU2: Done
> > | CPU3: (MPIDR 0000000000000300) initializing...
> > | CPU3: Done
> > | CPU4: (MPIDR 0000000000010000) initializing...
> > | CPU4: Done
> > | CPU5: (MPIDR 0000000000010100) initializing...
> > | CPU5: Done
> > | CPU6: (MPIDR 0000000000010200) initializing...
> > | CPU6: Done
> > | CPU7: (MPIDR 0000000000010300) initializing...
> > | CPU7: Done
> > | All CPUs initialized. Entering kernel...
> > |
> > | [    0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd0f0]

> > +static void cpu_init_self(unsigned int cpu)
> > +{
> > +	print_string("CPU");
> > +	print_uint_dec(cpu);
> > +	print_string(": (MPIDR ");
> > +	print_ulong_hex(read_mpidr());
> > +	print_string(") initializing...\r\n");
> 
> It feels like using two lines per core for something that rarely fails
> is a bit wasteful. Can we get rid of the EOL here, and just put the "Done"
> right behind it, in the same line? That reduces the noise on the terminal.

That'll interact poorly with logging errors, as the first will get
appended to the "initializing..." line.

Instead, I'll get rid of the "Done" line, so that the output ends up as:

| CPU0: (MPIDR 0000000000000000) initializing...
| CPU1: (MPIDR 0000000000000100) initializing...
| CPU2: (MPIDR 0000000000000200) initializing...
| CPU3: (MPIDR 0000000000000300) initializing...
| CPU4: (MPIDR 0000000000010000) initializing...
| CPU5: (MPIDR 0000000000010100) initializing...
| CPU6: (MPIDR 0000000000010200) initializing...
| CPU7: (MPIDR 0000000000010300) initializing...
| All CPUs initialized. Entering kernel...

... and if any error occurs it'll still be clear which CPU it belongs
to given the next line will either be the next CPU being announced or
the final "All CPUs initialized." message.

Mark.



More information about the linux-arm-kernel mailing list