diff options
author | Stefan Agner <stefan.agner@toradex.com> | 2016-03-21 16:23:35 -0700 |
---|---|---|
committer | Stefan Agner <stefan.agner@toradex.com> | 2016-03-21 16:30:03 -0700 |
commit | 9ace52b11aca9bbb657a35612c72c83c85b7e92c (patch) | |
tree | aad777b1bb5ae8f536859211c1b2dc965c694308 | |
parent | e1121f9a970a2d0e770532a5849eb749d8bbe8a3 (diff) |
ARM: disable_nonboot_cpus before poweroffColibri_iMX6_LinuxImageV2.6Beta1_20160331Apalis_iMX6_LinuxImageV2.6Beta1_20160331
If poweroff takes a bit more time (e.g. due to I2C call), it is
quite likely that another timer interrupt fires. Timer interrupt
get broadcasted through the timer interrupt callback
tick_handle_oneshot_broadcast. This code broadcasts the timer
interrupt to all CPU's in tick_broadcast_oneshot_mask. The only
function which removes CPU from this mask is
tick_shutdown_broadcast_oneshot which ultimately get called by
_cpu_down (in kernel/cpu.c). The function disable_nonboot_cpus
makes sure that the CPU's get properly taken down and _cpu_down
gets called. With that no more broadcasts are sent to CPU's which
are no longer online.
Signed-off-by: Stefan Agner <stefan.agner@toradex.com>
-rw-r--r-- | arch/arm/kernel/process.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index f5e98acf1c07..40d88d93bdf7 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c @@ -214,6 +214,7 @@ void machine_halt(void) */ void machine_power_off(void) { + disable_nonboot_cpus(); local_irq_disable(); smp_send_stop(); |