arm64: Fix machine_shutdown() definition
Arun KS
arunks.linux at gmail.com
Tue May 6 18:31:44 PDT 2014
Hi Stephen,
On Tue, May 6, 2014 at 10:05 PM, Stephen Warren <swarren at wwwdotorg.org> wrote:
> On 05/06/2014 09:55 AM, arunks.linux at gmail.com wrote:
>> From: Arun KS <arun.linux at gmail.com>
>>
>> machine_shutdown() is a hook for kexec. Add a comment saying so, since
>> it isn't obvious from the function name.
>>
>> Halt, power-off, and restart have different requirements re: stopping
>> secondary CPUs than kexec has. The former simply require the secondary
>> CPUs to be quiesced somehow, whereas kexec requires them to be
>> completely non-operational, so that no matter where the kexec target
>> images are written in RAM, they won't influence operation of the
>> secondary CPUS,which could happen if the CPUs were still executing some
>> kind of pin loop. To this end, modify machine_halt, power_off, and
>> restart to call smp_send_stop() directly, rather than calling
>> machine_shutdown().
>>
>> In machine_shutdown(), replace the call to smp_send_stop() with a call
>> to disable_nonboot_cpus(). This completely disables all but one CPU,
>> thus satisfying the kexec requirements a couple paragraphs above.
>>
>> Signed-off-by: Stephen Warren <swarren at nvidia.com>
>> Signed-off-by: Arun KS <getarunks at gmail.com>
>> Signed-off-by: Arun KS <arunks.linux at gmail.com>
>
> It's a bit odd to include my s-o-b here when I didn't actually write
> this particular patch. No doubt it's included because I wrote an
> identical patch for arch/arm/.
>
> Rather than including my s-o-b here, perhaps simply including the
> following paragraph in the commit decription would be better:
>
> This patch ports most of commit 19ab428f4b79 "ARM: 7759/1: decouple CPU
> offlining from reboot/shutdown" by Stephen Warren from arch/arm to
> arch/arm64.
Okey. I ll re-spin this patch.
>
> Or, I sometimes use the following tag instead of s-o-b:
>
> Based-on-work-by: Stephen Warren <swarren at nvidia.com>
>
> Including two s-o-b for yourself probably isn't necesary.
>
> Do you need to include an equivalent of the following from my original
> patch to arch/arm/?
Rest of the things are already taken care in arm64.
Thanks,
Arun
>
>> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
>> index 239fa96c12bb..2651b1da1c56 100644
>> --- a/arch/arm/Kconfig
>> +++ b/arch/arm/Kconfig
>> @@ -2016,7 +2016,7 @@ config XIP_PHYS_ADDR
>>
>> config KEXEC
>> bool "Kexec system call (EXPERIMENTAL)"
>> - depends on (!SMP || HOTPLUG_CPU)
>> + depends on (!SMP || PM_SLEEP_SMP)
>> help
>> kexec is a system call that implements the ability to shutdown your
>> current kernel, and to start another kernel. It is like a reboot
>> diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c
>> index 8ef8c9337809..4fb074c446bf 100644
>> --- a/arch/arm/kernel/machine_kexec.c
>> +++ b/arch/arm/kernel/machine_kexec.c
>> @@ -134,6 +134,10 @@ void machine_kexec(struct kimage *image)
>> unsigned long reboot_code_buffer_phys;
>> void *reboot_code_buffer;
>>
>> + if (num_online_cpus() > 1) {
>> + pr_err("kexec: error: multiple CPUs still online\n");
>> + return;
>> + }
>>
>> page_list = image->head & PAGE_MASK;
>>
>> diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
>> index 550d63cef68e..5919eb451bb9 100644
>> --- a/arch/arm/kernel/smp.c
>> +++ b/arch/arm/kernel/smp.c
>> @@ -651,17 +651,6 @@ void smp_send_reschedule(int cpu)
>> smp_cross_call(cpumask_of(cpu), IPI_RESCHEDULE);
>> }
>>
>> -#ifdef CONFIG_HOTPLUG_CPU
>> -static void smp_kill_cpus(cpumask_t *mask)
>> -{
>> - unsigned int cpu;
>> - for_each_cpu(cpu, mask)
>> - platform_cpu_kill(cpu);
>> -}
>> -#else
>> -static void smp_kill_cpus(cpumask_t *mask) { }
>> -#endif
>> -
>> void smp_send_stop(void)
>> {
>> unsigned long timeout;
>> @@ -679,8 +668,6 @@ void smp_send_stop(void)
>>
>> if (num_online_cpus() > 1)
>> pr_warning("SMP: failed to stop secondary CPUs\n");
>> -
>> - smp_kill_cpus(&mask);
>> }
>>
>> /*
>
More information about the linux-arm-kernel
mailing list