arm64: Only enable local interrupts after the CPU is marked online
authorCatalin Marinas <catalin.marinas@arm.com>
Fri, 19 Jul 2013 14:08:15 +0000 (15:08 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 9 Jan 2014 20:24:26 +0000 (12:24 -0800)
commit 53ae3acd4390ffeecb3a11dbd5be347b5a3d98f2 upstream.

There is a slight chance that (timer) interrupts are triggered before a
secondary CPU has been marked online with implications on softirq thread
affinity.

Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Reported-by: Kirill Tkhai <tkhai@yandex.ru>
Cc: Mark Brown <broonie@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/arm64/kernel/smp.c

index 5d54e37..9c93e12 100644 (file)
@@ -200,13 +200,6 @@ asmlinkage void __cpuinit secondary_start_kernel(void)
        raw_spin_unlock(&boot_lock);
 
        /*
-        * Enable local interrupts.
-        */
-       notify_cpu_starting(cpu);
-       local_irq_enable();
-       local_fiq_enable();
-
-       /*
         * OK, now it's safe to let the boot CPU continue.  Wait for
         * the CPU migration code to notice that the CPU is online
         * before we continue.
@@ -215,6 +208,14 @@ asmlinkage void __cpuinit secondary_start_kernel(void)
        complete(&cpu_running);
 
        /*
+        * Enable GIC and timers.
+        */
+       notify_cpu_starting(cpu);
+
+       local_irq_enable();
+       local_fiq_enable();
+
+       /*
         * OK, it's off to the idle thread for us
         */
        cpu_startup_entry(CPUHP_ONLINE);