]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ARM: 7359/2: smp_twd: Only wait for reprogramming on active cpus
authorLinus Walleij <linus.walleij@linaro.org>
Tue, 10 Apr 2012 11:37:42 +0000 (12:37 +0100)
committerLothar Waßmann <LW@KARO-electronics.de>
Fri, 24 May 2013 06:34:42 +0000 (08:34 +0200)
During booting of cpu1, there is a short window where cpu1
is online, but not active where cpu1 is occupied by waiting
to become active. If cpu0 then decides to schedule something
on cpu1 and wait for it to complete, before cpu0 has set
cpu1 active, we have a deadlock.

Typically it's this CPU frequency transition that happens at
this time, so let's just not wait for it to happen, it will
happen whenever the CPU eventually comes online instead.

Cc: Peter Zijlstra <peterz@infradead.org>
Cc: stable@kernel.org
Signed-off-by: Jonas Aaberg <jonas.aberg@stericsson.com>
Reviewed-by: Rickard Andersson <rickard.andersson@stericsson.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/kernel/smp_twd.c

index a5a2f45069d57553835d16c77ec315caace74e9b..31deb5ae00610a7ef72219f338e7e2c7b5f88d4d 100644 (file)
@@ -115,10 +115,14 @@ static int twd_cpufreq_transition(struct notifier_block *nb,
         * The twd clock events must be reprogrammed to account for the new
         * frequency.  The timer is local to a cpu, so cross-call to the
         * changing cpu.
+        *
+        * Only wait for it to finish, if the cpu is active to avoid
+        * deadlock when cpu1 is spinning on while(!cpu_active(cpu1)) during
+        * booting of that cpu.
         */
        if (state == CPUFREQ_POSTCHANGE || state == CPUFREQ_RESUMECHANGE)
                smp_call_function_single(freqs->cpu, twd_update_frequency,
-                       NULL, 1);
+                                        NULL, cpu_active(freqs->cpu));
 
        return NOTIFY_OK;
 }