| From f5739cb0b56590d68d8df8a44659893b6d0084c3 Mon Sep 17 00:00:00 2001 |
| From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com> |
| Date: Wed, 26 Feb 2020 22:39:27 +0100 |
| Subject: cpufreq: Fix policy initialization for internal governor drivers |
| |
| From: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| |
| commit f5739cb0b56590d68d8df8a44659893b6d0084c3 upstream. |
| |
| Before commit 1e4f63aecb53 ("cpufreq: Avoid creating excessively |
| large stack frames") the initial value of the policy field in struct |
| cpufreq_policy set by the driver's ->init() callback was implicitly |
| passed from cpufreq_init_policy() to cpufreq_set_policy() if the |
| default governor was neither "performance" nor "powersave". After |
| that commit, however, cpufreq_init_policy() must take that case into |
| consideration explicitly and handle it as appropriate, so make that |
| happen. |
| |
| Fixes: 1e4f63aecb53 ("cpufreq: Avoid creating excessively large stack frames") |
| Link: https://lore.kernel.org/linux-pm/39fb762880c27da110086741315ca8b111d781cd.camel@gmail.com/ |
| Reported-by: Artem Bityutskiy <dedekind1@gmail.com> |
| Cc: 5.4+ <stable@vger.kernel.org> # 5.4+ |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Acked-by: Viresh Kumar <viresh.kumar@linaro.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/cpufreq/cpufreq.c | 12 ++++++++++-- |
| 1 file changed, 10 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/cpufreq/cpufreq.c |
| +++ b/drivers/cpufreq/cpufreq.c |
| @@ -1074,9 +1074,17 @@ static int cpufreq_init_policy(struct cp |
| pol = policy->last_policy; |
| } else if (def_gov) { |
| pol = cpufreq_parse_policy(def_gov->name); |
| - } else { |
| - return -ENODATA; |
| + /* |
| + * In case the default governor is neiter "performance" |
| + * nor "powersave", fall back to the initial policy |
| + * value set by the driver. |
| + */ |
| + if (pol == CPUFREQ_POLICY_UNKNOWN) |
| + pol = policy->policy; |
| } |
| + if (pol != CPUFREQ_POLICY_PERFORMANCE && |
| + pol != CPUFREQ_POLICY_POWERSAVE) |
| + return -ENODATA; |
| } |
| |
| return cpufreq_set_policy(policy, gov, pol); |