Message ID | 16997374.L1f6Qxgytn@aspire.rjw.lan (mailing list archive) |
---|---|
State | Mainlined |
Delegated to: | Rafael Wysocki |
Headers | show |
On 23-11-17, 14:27, Rafael J. Wysocki wrote: > From: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > > It is possible to remove a cpufreq governor module after > cpufreq_parse_governor() has returned success in > store_scaling_governor() and before cpufreq_set_policy() > acquires a reference to it, because the governor list is > not protected during that period and nothing prevents the > governor from being unregistered then. > > Prevent that from happening by acquiring an extra reference > to the governor module temporarily in cpufreq_parse_governor(), > under cpufreq_governor_mutex, and dropping it in > store_scaling_governor(), when cpufreq_set_policy() returns. > > Note that the second cpufreq_parse_governor() call site is fine, > because it only cares about the policy member of new_policy. > > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > --- > > -> v2: Drop changes to clear policy->governor in > cpufreq_parse_governor() in the cpufreq_driver->setpolicy set > case, as that field should always be NULL then. > > --- > drivers/cpufreq/cpufreq.c | 6 ++++++ > 1 file changed, 6 insertions(+) Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Index: linux-pm/drivers/cpufreq/cpufreq.c =================================================================== --- linux-pm.orig/drivers/cpufreq/cpufreq.c +++ linux-pm/drivers/cpufreq/cpufreq.c @@ -633,6 +633,8 @@ static int cpufreq_parse_governor(char * t = find_governor(str_governor); } + if (t && !try_module_get(t->owner)) + t = NULL; mutex_unlock(&cpufreq_governor_mutex); @@ -766,6 +768,10 @@ static ssize_t store_scaling_governor(st return -EINVAL; ret = cpufreq_set_policy(policy, &new_policy); + + if (new_policy.governor) + module_put(new_policy.governor->owner); + return ret ? ret : count; }