| From d1e7c2996e988866e7ceceb4641a0886885b7889 Mon Sep 17 00:00:00 2001 |
| From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com> |
| Date: Thu, 29 Oct 2020 12:12:46 +0100 |
| Subject: cpufreq: schedutil: Always call driver if CPUFREQ_NEED_UPDATE_LIMITS is set |
| |
| From: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| |
| commit d1e7c2996e988866e7ceceb4641a0886885b7889 upstream. |
| |
| Because sugov_update_next_freq() may skip a frequency update even if |
| the need_freq_update flag has been set for the policy at hand, policy |
| limits updates may not take effect as expected. |
| |
| For example, if the intel_pstate driver operates in the passive mode |
| with HWP enabled, it needs to update the HWP min and max limits when |
| the policy min and max limits change, respectively, but that may not |
| happen if the target frequency does not change along with the limit |
| at hand. In particular, if the policy min is changed first, causing |
| the target frequency to be adjusted to it, and the policy max limit |
| is changed later to the same value, the HWP max limit will not be |
| updated to follow it as expected, because the target frequency is |
| still equal to the policy min limit and it will not change until |
| that limit is updated. |
| |
| To address this issue, modify get_next_freq() to let the driver |
| callback run if the CPUFREQ_NEED_UPDATE_LIMITS cpufreq driver flag |
| is set regardless of whether or not the new frequency to set is |
| equal to the previous one. |
| |
| Fixes: f6ebbcf08f37 ("cpufreq: intel_pstate: Implement passive mode with HWP enabled") |
| Reported-by: Zhang Rui <rui.zhang@intel.com> |
| Tested-by: Zhang Rui <rui.zhang@intel.com> |
| Cc: 5.9+ <stable@vger.kernel.org> # 5.9+: 1c534352f47f cpufreq: Introduce CPUFREQ_NEED_UPDATE_LIMITS ... |
| Cc: 5.9+ <stable@vger.kernel.org> # 5.9+: a62f68f5ca53 cpufreq: Introduce cpufreq_driver_test_flags() |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Acked-by: Viresh Kumar <viresh.kumar@linaro.org> |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| kernel/sched/cpufreq_schedutil.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| --- a/kernel/sched/cpufreq_schedutil.c |
| +++ b/kernel/sched/cpufreq_schedutil.c |
| @@ -102,7 +102,8 @@ static bool sugov_should_update_freq(str |
| static bool sugov_update_next_freq(struct sugov_policy *sg_policy, u64 time, |
| unsigned int next_freq) |
| { |
| - if (sg_policy->next_freq == next_freq) |
| + if (sg_policy->next_freq == next_freq && |
| + !cpufreq_driver_test_flags(CPUFREQ_NEED_UPDATE_LIMITS)) |
| return false; |
| |
| sg_policy->next_freq = next_freq; |
| @@ -175,7 +176,8 @@ static unsigned int get_next_freq(struct |
| |
| freq = map_util_freq(util, freq, max); |
| |
| - if (freq == sg_policy->cached_raw_freq && !sg_policy->need_freq_update) |
| + if (freq == sg_policy->cached_raw_freq && !sg_policy->need_freq_update && |
| + !cpufreq_driver_test_flags(CPUFREQ_NEED_UPDATE_LIMITS)) |
| return sg_policy->next_freq; |
| |
| sg_policy->need_freq_update = false; |