ARM: Disable preemption along with interrupts during shutdown
arunks.linux at gmail.com
arunks.linux at gmail.com
Thu May 8 06:23:31 PDT 2014
From: Arun KS <arunks.linux at gmail.com>
'irqs disabled' is funtamentally unsafe way of disabling preemption.
Any spin_unlock() decreasing the preemption count to 0 might trigger
a reschedule. A simple printk() might trigger a reschedule.
To be on safe side disable preemption as well using preempt_disable()
Signed-off-by: Arun KS <getarunks at gmail.com>
---
arch/arm/kernel/process.c | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
index 81ef686..9ecb7b5 100644
--- a/arch/arm/kernel/process.c
+++ b/arch/arm/kernel/process.c
@@ -193,6 +193,7 @@ void machine_shutdown(void)
void machine_halt(void)
{
local_irq_disable();
+ preempt_disable();
smp_send_stop();
local_irq_disable();
@@ -208,6 +209,7 @@ void machine_halt(void)
void machine_power_off(void)
{
local_irq_disable();
+ preempt_disable();
smp_send_stop();
if (pm_power_off)
@@ -228,6 +230,7 @@ void machine_power_off(void)
void machine_restart(char *cmd)
{
local_irq_disable();
+ preempt_disable();
smp_send_stop();
arm_pm_restart(reboot_mode, cmd);
--
1.7.6
More information about the linux-arm-kernel
mailing list