summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Aaberg <jonas.aberg@stericsson.com>2012-03-06 07:46:12 +0100
committerPhilippe Langlais <philippe.langlais@linaro.org>2012-04-06 09:39:39 +0200
commit16f1ed6df7731514273d5e62a75667ed9ab259c5 (patch)
tree304495c9a0055a264ea3fac110e33585cde69cf6
parenteecb2662818c59a603282613cf91f79eb4b85f76 (diff)
ARM: smp_twd: Only wait for reprogramming on active cpus
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. This is just a work around to hide the original problem. ST-Ericsson Linux next: - ST-Ericsson ID: 419957 ST-Ericsson FOSS-OUT ID: Trivial Change-Id: I133e511cece4024375cc92a82f79bd799514d71d Signed-off-by: Jonas Aaberg <jonas.aberg@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/51514 Reviewed-by: QABUILD Reviewed-by: Rickard ANDERSSON <rickard.andersson@stericsson.com>
-rw-r--r--arch/arm/kernel/smp_twd.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c
index c731ac2f0bd..007f7f6aee8 100644
--- a/arch/arm/kernel/smp_twd.c
+++ b/arch/arm/kernel/smp_twd.c
@@ -118,10 +118,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;
}