summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorWill Deacon2011-06-06 16:49:23 +0200
committerWill Deacon2011-12-12 17:07:35 +0100
commit02b73e2e9c288cbbb6ec96bef628cf08e29824c4 (patch)
tree0cf7662397eee9f2f2059c5bef8fedbdacad360a /arch
parentARM: reset: implement soft_restart for jumping to a physical address (diff)
downloadkernel-qcow2-linux-02b73e2e9c288cbbb6ec96bef628cf08e29824c4.tar.gz
kernel-qcow2-linux-02b73e2e9c288cbbb6ec96bef628cf08e29824c4.tar.xz
kernel-qcow2-linux-02b73e2e9c288cbbb6ec96bef628cf08e29824c4.zip
ARM: stop: execute platform callback from cpu_stop code
Sending IPI_CPU_STOP to a CPU causes it to execute a busy cpu_relax loop forever. This makes it impossible to kexec successfully on an SMP system since the secondary CPUs do not reset. This patch adds a callback to platform_cpu_kill, defined when CONFIG_HOTPLUG_CPU=y, from the ipi_cpu_stop handling code. This function currently just returns 1 on all platforms that define it but allows them to do something more sophisticated in the future. Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/Kconfig2
-rw-r--r--arch/arm/kernel/smp.c4
2 files changed, 5 insertions, 1 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 4b01d71bdbd1..abba5b8c9d74 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -2001,7 +2001,7 @@ config XIP_PHYS_ADDR
config KEXEC
bool "Kexec system call (EXPERIMENTAL)"
- depends on EXPERIMENTAL
+ depends on EXPERIMENTAL && (!SMP || HOTPLUG_CPU)
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/smp.c b/arch/arm/kernel/smp.c
index 76ff28d87bf3..57db122a4f62 100644
--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
@@ -522,6 +522,10 @@ static void ipi_cpu_stop(unsigned int cpu)
local_fiq_disable();
local_irq_disable();
+#ifdef CONFIG_HOTPLUG_CPU
+ platform_cpu_kill(cpu);
+#endif
+
while (1)
cpu_relax();
}