Re: [PATCH] cpufreq: Fix runtime warnings on systems with shared core clocks

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2 July 2013 15:18, Mark Brown <broonie@xxxxxxxxxx> wrote:
> On Tue, Jul 02, 2013 at 10:45:02AM +0530, Viresh Kumar wrote:
>
>> Please see if below fixes it for you. Use attached patch for testing it.
>
> This doesn't apply terribly easily, the patch is corrupt and appears to
> be based on something other than what's in -next so neither git am nor
> patch can figure out how to apply it.

Two things,

- I rebased my patch now against latest linux-next/master and it applied
  cleanly.
- Somehow one of my changes to include/linux/cpufreq.h didn't get commited

Try attached patch now and it should really work..

I am using gmail for replying to mails from office which corrupts mails. And
I can't use other mail clients from office, firewall issues.

--------x---------------x------------
From: Viresh Kumar <viresh.kumar@xxxxxxxxxx>
Date: Tue, 2 Jul 2013 10:41:54 +0530
Subject: [PATCH] cpufreq: Fix serialization of frequency transitions

Commit 7c30ed ("cpufreq: make sure frequency transitions are serialized")
interacts poorly with systems that have a single core freqency for all
cores.  On such systems we have a single policy for all cores with
several CPUs.  When we do a frequency transition the governor calls the
pre and post change notifiers which causes cpufreq_notify_transition()
per CPU.  Since the policy is the same for all of them all CPUs after
the first and the warnings added are generated by checking a per-policy
flag the warnings will be triggered for all cores after the first.

Fix this by allowing notifier to be called for n times. Where n is the number of
cpus in policy->cpus.

Signed-off-by: Viresh Kumar <viresh.kumar@xxxxxxxxxx>
---
 drivers/cpufreq/cpufreq.c | 7 ++++---
 include/linux/cpufreq.h   | 2 +-
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index b557503..b7bda8d 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -312,11 +312,12 @@ static void __cpufreq_notify_transition(struct
cpufreq_policy *policy,
 	switch (state) {

 	case CPUFREQ_PRECHANGE:
-		if (WARN(policy->transition_ongoing,
+		if (WARN(policy->transition_ongoing ==
+					cpumask_weight(policy->cpus),
 				"In middle of another frequency transition\n"))
 			return;

-		policy->transition_ongoing = true;
+		policy->transition_ongoing++;

 		/* detect if the driver reported a value as "old frequency"
 		 * which is not equal to what the cpufreq core thinks is
@@ -341,7 +342,7 @@ static void __cpufreq_notify_transition(struct
cpufreq_policy *policy,
 				"No frequency transition in progress\n"))
 			return;

-		policy->transition_ongoing = false;
+		policy->transition_ongoing--;

 		adjust_jiffies(CPUFREQ_POSTCHANGE, freqs);
 		pr_debug("FREQ: %lu - CPU: %lu", (unsigned long)freqs->new,
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index 4d7390b..90d5a15 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -119,7 +119,7 @@ struct cpufreq_policy {

 	struct kobject		kobj;
 	struct completion	kobj_unregister;
-	bool			transition_ongoing; /* Tracks transition status */
+	int			transition_ongoing; /* Tracks transition status */
 };

 #define CPUFREQ_ADJUST			(0)

Attachment: 0001-cpufreq-Fix-serialization-of-frequency-transitions.patch
Description: Binary data


[Index of Archives]     [Linux Kernel Devel]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Forum]     [Linux SCSI]

  Powered by Linux