On 24 April 2014 15:46, Meelis Roos <mr...@linux.ee> wrote:
> I can add debug to where needed and try it.

I am quite sure below wouldn't fix it, but just wanted to check
for the corner case :(

Can you please try attached patch (mail's content would be
broken):

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index abda660..7198e23 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -355,10 +355,12 @@ void cpufreq_freq_transition_begin(struct
cpufreq_policy *policy,
                struct cpufreq_freqs *freqs)
 {
 wait:
+       smp_mb();
        wait_event(policy->transition_wait, !policy->transition_ongoing);

        spin_lock(&policy->transition_lock);

+       smp_mb();
        if (unlikely(policy->transition_ongoing)) {
                spin_unlock(&policy->transition_lock);
                goto wait;
@@ -380,8 +382,11 @@ void cpufreq_freq_transition_end(struct
cpufreq_policy *policy,

        cpufreq_notify_post_transition(policy, freqs, transition_failed);

+       smp_mb();
+
        policy->transition_ongoing = false;

+       smp_mb();
        wake_up(&policy->transition_wait);
 }
 EXPORT_SYMBOL_GPL(cpufreq_freq_transition_end);
From 08d42f39fed326a74fa2062cfc663ca41ee71148 Mon Sep 17 00:00:00 2001
Message-Id: <08d42f39fed326a74fa2062cfc663ca41ee71148.1398335331.git.viresh.ku...@linaro.org>
From: Viresh Kumar <viresh.ku...@linaro.org>
Date: Thu, 24 Apr 2014 15:58:50 +0530
Subject: [PATCH] cpufreq: add smp_mb()s to cpufreq transitions

Signed-off-by: Viresh Kumar <viresh.ku...@linaro.org>
---
 drivers/cpufreq/cpufreq.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index abda660..7198e23 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -355,10 +355,12 @@ void cpufreq_freq_transition_begin(struct cpufreq_policy *policy,
 		struct cpufreq_freqs *freqs)
 {
 wait:
+	smp_mb();
 	wait_event(policy->transition_wait, !policy->transition_ongoing);
 
 	spin_lock(&policy->transition_lock);
 
+	smp_mb();
 	if (unlikely(policy->transition_ongoing)) {
 		spin_unlock(&policy->transition_lock);
 		goto wait;
@@ -380,8 +382,11 @@ void cpufreq_freq_transition_end(struct cpufreq_policy *policy,
 
 	cpufreq_notify_post_transition(policy, freqs, transition_failed);
 
+	smp_mb();
+
 	policy->transition_ongoing = false;
 
+	smp_mb();
 	wake_up(&policy->transition_wait);
 }
 EXPORT_SYMBOL_GPL(cpufreq_freq_transition_end);
-- 
1.7.12.rc2.18.g61b472e

Reply via email to