[PATCH] ARM: decouple CPU offlining from reboot/shutdown

Will Deacon will.deacon at arm.com
Tue Jun 11 14:29:27 EDT 2013


On Tue, Jun 11, 2013 at 07:08:40PM +0100, Stephen Warren wrote:
> On 06/11/2013 11:23 AM, Will Deacon wrote:
> > On Mon, Jun 10, 2013 at 07:12:41PM +0100, Stephen Warren wrote:
> >> From: Stephen Warren <swarren at nvidia.com>
> >>
> >> machine_shutdown() is a hook for kexec. Add a comment saying so, since
> >> it isn't obvious from the function name.
> > 
> > I'd go as far as saying that some of this commit log could be included in
> > the comment too, since this comes up time and time again and it's never
> > clear!
> 
> OK, I'll add some expanded comments to each of the functions.

Great, cheers.

> >> diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
> 
> >> @@ -97,13 +97,14 @@ void soft_restart(unsigned long addr)
> >>  {
> >>  	u64 *stack = soft_restart_stack + ARRAY_SIZE(soft_restart_stack);
> >>  
> >> +	BUG_ON(num_online_cpus() > 1);
> > 
> > I think this is overkill, and we could actually scream and try to return an
> > error here (we've not yet switched stack, and the upper layers of kexec look
> > like they can do something with an error code).
> 
> Hmmm. The function returns void, although I suppose I could look into
> changing that too?

Yes. Usually this is a path of no return, but if we detect an error before
we've changed stack then I think we should at least try to propogate the
error.

> >> +/* For kexec */
> >>  void machine_shutdown(void)
> >>  {
> >> -#ifdef CONFIG_SMP
> >> -	smp_send_stop();
> >> +#ifdef CONFIG_PM_SLEEP_SMP
> >> +	disable_nonboot_cpus();
> >>  #endif
> > 
> > You can lose the #ifdef here.
> 
> The implementation of disable_nonboot_cpus() is #ifdef
> CONFIG_PM_SLEEP_SMP, so I think I need that to avoid build errors.

Hmm, my include/linux/cpu.h has a dummy definition in an #else block, which
simply returns 0. What kernel are you using?

> >> +	BUG_ON(num_online_cpus() > 1);
> > 
> > Maybe redefine machine_shutdown if !kexec and lose this BUG?
> 
> IIUC, machine_shutdown() is only used for kexec now, so I don't think an
> alternative implementation is required in the !kexec case?

Yes, you're right. In fact, since we don't support KEXEC_JUMP on ARM, we
could dispense with machine_shutdown altogether (just make it do nothing)
and move the code into machine_kexec, which has a much better name.

What do you think?

Will



More information about the linux-arm-kernel mailing list