From: Will Deacon Date: Mon, 6 Jun 2011 14:49:23 +0000 (+0100) Subject: ARM: stop: execute platform callback from cpu_stop code X-Git-Url: http://git.openpandora.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=58825fd80e48bb0b823a42300361a3ce24a820fc;p=pandora-kernel.git 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 --- diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index c93ba0333bfc..c104153eb475 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -2017,7 +2017,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 a05ca124cbf1..250106df001b 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -526,6 +526,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(); }