Skip to content

Commit

Permalink
ARM: call machine_shutdown() from machine_halt(), etc
Browse files Browse the repository at this point in the history
x86 calls machine_shutdown() from the various machine_*() calls which
take the machine down ready for halting, restarting, etc, and uses
this to bring the system safely to a point where those actions can be
performed.  Such actions are stopping the secondary CPUs.

So, change the ARM implementation of these to reflect what x86 does.

This solves kexec problems on ARM SMP platforms, where the secondary
CPUs were left running across the kexec call.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Russell King committed Jul 27, 2010
1 parent 5388a6b commit 3d3f78d
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 9 deletions.
4 changes: 0 additions & 4 deletions arch/arm/kernel/machine_kexec.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,6 @@ void machine_kexec_cleanup(struct kimage *image)
{
}

void machine_shutdown(void)
{
}

void machine_crash_shutdown(struct pt_regs *regs)
{
}
Expand Down
12 changes: 11 additions & 1 deletion arch/arm/kernel/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -198,19 +198,29 @@ int __init reboot_setup(char *str)

__setup("reboot=", reboot_setup);

void machine_halt(void)
void machine_shutdown(void)
{
#ifdef CONFIG_SMP
smp_send_stop();
#endif
}

void machine_halt(void)
{
machine_shutdown();
while (1);
}

void machine_power_off(void)
{
machine_shutdown();
if (pm_power_off)
pm_power_off();
}

void machine_restart(char *cmd)
{
machine_shutdown();
arm_pm_restart(reboot_mode, cmd);
}

Expand Down
11 changes: 7 additions & 4 deletions arch/arm/kernel/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -471,10 +471,13 @@ static DEFINE_SPINLOCK(stop_lock);
*/
static void ipi_cpu_stop(unsigned int cpu)
{
spin_lock(&stop_lock);
printk(KERN_CRIT "CPU%u: stopping\n", cpu);
dump_stack();
spin_unlock(&stop_lock);
if (system_state == SYSTEM_BOOTING ||
system_state == SYSTEM_RUNNING) {
spin_lock(&stop_lock);
printk(KERN_CRIT "CPU%u: stopping\n", cpu);
dump_stack();
spin_unlock(&stop_lock);
}

set_cpu_online(cpu, false);

Expand Down

0 comments on commit 3d3f78d

Please sign in to comment.