summary refs log tree commit diff
path: root/arch/metag
diff options
context:
space:
mode:
authorJames Hogan <james.hogan@imgtec.com>2013-06-28 13:56:02 +0100
committerJames Hogan <james.hogan@imgtec.com>2013-07-02 11:03:51 +0100
commit234c7f1ac109ad1af4ae410463d03ccebf3d6657 (patch)
tree445494b2ed23a56964859e048d4eed0933dc8060 /arch/metag
parent42748752f6ada54faa4f39fa471dabce62eaa79a (diff)
downloadlinux-234c7f1ac109ad1af4ae410463d03ccebf3d6657.tar.gz
metag: smp: enable irqs after set_cpu_online
In secondary_start_kernel() interrupts should be enabled with
local_irq_enable() after the cpu is marked as online with
set_cpu_online(). Otherwise it's possible for a timer interrupt to
trigger a softirq, which if the cpu is marked as offline may have it's
affinity altered.

Reported-by: Kirill Tkhai <tkhai@yandex.ru>
Signed-off-by: James Hogan <james.hogan@imgtec.com>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: "Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>
Cc: Kirill Tkhai <tkhai@yandex.ru>
Diffstat (limited to 'arch/metag')
-rw-r--r--arch/metag/kernel/smp.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/arch/metag/kernel/smp.c b/arch/metag/kernel/smp.c
index b81351538c48..09979f203a4d 100644
--- a/arch/metag/kernel/smp.c
+++ b/arch/metag/kernel/smp.c
@@ -379,12 +379,7 @@ asmlinkage void secondary_start_kernel(void)
 
 	setup_priv();
 
-	/*
-	 * Enable local interrupts.
-	 */
-	tbi_startup_interrupt(TBID_SIGNUM_TRT);
 	notify_cpu_starting(cpu);
-	local_irq_enable();
 
 	pr_info("CPU%u (thread %u): Booted secondary processor\n",
 		cpu, cpu_2_hwthread_id[cpu]);
@@ -398,6 +393,12 @@ asmlinkage void secondary_start_kernel(void)
 	set_cpu_online(cpu, true);
 
 	/*
+	 * Enable local interrupts.
+	 */
+	tbi_startup_interrupt(TBID_SIGNUM_TRT);
+	local_irq_enable();
+
+	/*
 	 * OK, it's off to the idle thread for us
 	 */
 	cpu_startup_entry(CPUHP_ONLINE);