linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Viresh Kumar <viresh.kumar@linaro.org>
To: rjw@sisk.pl
Cc: linaro-kernel@lists.linaro.org, patches@linaro.org,
	cpufreq@vger.kernel.org, linux-pm@vger.kernel.org,
	linux-kernel@vger.kernel.org, srivatsa.bhat@linux.vnet.ibm.com,
	Viresh Kumar <viresh.kumar@linaro.org>
Subject: [PATCH V2 08/11] cpufreq: Fix broken usage of governor->owner's refcount
Date: Tue,  6 Aug 2013 22:53:10 +0530	[thread overview]
Message-ID: <28d948514a30b279afb99ff156bc3a3f74234641.1375809311.git.viresh.kumar@linaro.org> (raw)
In-Reply-To: <cover.1375809311.git.viresh.kumar@linaro.org>
In-Reply-To: <cover.1375809311.git.viresh.kumar@linaro.org>

Governor's owner refcount usage was broken. We should increment refcount only
when CPUFREQ_GOV_POLICY_INIT event has come and should decrement only if
CPUFREQ_GOV_POLICY_EXIT has come.

Currently there can be situations where governor is in use but we have allowed
it to be unloaded which may result in undefined behavior.
Lets fix it.

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

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index fe04b79..62eddb6 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -1708,8 +1708,9 @@ static int __cpufreq_governor(struct cpufreq_policy *policy,
 		}
 	}
 
-	if (!try_module_get(policy->governor->owner))
-		return -EINVAL;
+	if (event == CPUFREQ_GOV_POLICY_INIT)
+		if (!try_module_get(policy->governor->owner))
+			return -EINVAL;
 
 	pr_debug("__cpufreq_governor for CPU %u, event %u\n",
 						policy->cpu, event);
@@ -1718,6 +1719,8 @@ static int __cpufreq_governor(struct cpufreq_policy *policy,
 	if ((!policy->governor_enabled && (event == CPUFREQ_GOV_STOP)) ||
 	    (policy->governor_enabled && (event == CPUFREQ_GOV_START))) {
 		mutex_unlock(&cpufreq_governor_lock);
+		if (event == CPUFREQ_GOV_POLICY_INIT)
+			module_put(policy->governor->owner);
 		return -EBUSY;
 	}
 
@@ -1745,11 +1748,8 @@ static int __cpufreq_governor(struct cpufreq_policy *policy,
 		mutex_unlock(&cpufreq_governor_lock);
 	}
 
-	/* we keep one module reference alive for
-			each CPU governed by this CPU */
-	if ((event != CPUFREQ_GOV_START) || ret)
-		module_put(policy->governor->owner);
-	if ((event == CPUFREQ_GOV_STOP) && !ret)
+	if (((event == CPUFREQ_GOV_POLICY_INIT) && ret) ||
+			((event == CPUFREQ_GOV_POLICY_EXIT) && !ret))
 		module_put(policy->governor->owner);
 
 	return ret;
-- 
1.7.12.rc2.18.g61b472e


  parent reply	other threads:[~2013-08-06 17:26 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-06 17:23 [PATCH V2 00/11] CPUFreq: Fixes & Cleanups for 3.12 Viresh Kumar
2013-08-06 17:23 ` [PATCH V2 01/11] cpufreq: Cleanup header files included in core Viresh Kumar
2013-08-06 17:23 ` [PATCH V2 02/11] cpufreq: Re-arrange declarations in cpufreq.h Viresh Kumar
2013-08-06 17:23 ` [PATCH V2 03/11] cpufreq: Give consistent names for struct cpufreq_policy * Viresh Kumar
2013-08-06 17:23 ` [PATCH V2 04/11] cpufreq: Use sizeof(*ptr) form for finding size of a struct Viresh Kumar
2013-08-06 17:23 ` [PATCH V2 05/11] cpufreq: Pass policy to cpufreq_add_policy_cpu() Viresh Kumar
2013-08-06 17:23 ` [PATCH V2 06/11] cpufreq: Store cpufreq policies in a list Viresh Kumar
2013-08-06 17:23 ` [PATCH V2 07/11] cpufreq: Use cpufreq_policy_list for iterating over policies Viresh Kumar
2013-08-18 14:06   ` Rafael J. Wysocki
2013-08-19 11:27     ` Viresh Kumar
2013-08-19 11:45       ` Amit Kucheria
2013-08-20  6:32         ` Viresh Kumar
2013-08-19 23:22       ` Rafael J. Wysocki
2013-08-20  6:33         ` Viresh Kumar
2013-08-20  6:35       ` Viresh Kumar
2013-08-06 17:23 ` Viresh Kumar [this message]
2013-08-06 17:23 ` [PATCH V2 09/11] cpufreq: Don't use cpufreq_driver->owner's refcount to protect critical sections Viresh Kumar
2013-08-06 17:23 ` [PATCH V2 10/11] cpufreq: Remove struct cpufreq_driver's owner field Viresh Kumar
2013-08-06 17:23 ` [PATCH V2 11/11] cpufreq: improve error checking on return values of __cpufreq_governor() Viresh Kumar
2013-08-07  0:21 ` [PATCH V2 00/11] CPUFreq: Fixes & Cleanups for 3.12 Rafael J. Wysocki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=28d948514a30b279afb99ff156bc3a3f74234641.1375809311.git.viresh.kumar@linaro.org \
    --to=viresh.kumar@linaro.org \
    --cc=cpufreq@vger.kernel.org \
    --cc=linaro-kernel@lists.linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=patches@linaro.org \
    --cc=rjw@sisk.pl \
    --cc=srivatsa.bhat@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).