ARM: stop: execute platform callback from cpu_stop code
authorWill Deacon <will.deacon@arm.com>
Mon, 6 Jun 2011 14:49:23 +0000 (15:49 +0100)
committerWill Deacon <will.deacon@arm.com>
Mon, 12 Dec 2011 16:07:35 +0000 (16:07 +0000)
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>
arch/arm/Kconfig
arch/arm/kernel/smp.c

index 4b01d71bdbd1a1aea1ec4fc1024cb88da9a9e1d4..abba5b8c9d74cde9eff567d12ba1d7701ea3e8a2 100644 (file)
@@ -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
index 76ff28d87bf3f229b5cb9028bba1ad311abcd655..57db122a4f629bb53247fde4f2b15076838661c0 100644 (file)
@@ -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();
 }