Messages in this thread | | | Date | Thu, 25 Jun 2020 15:53:05 +0530 | From | Viresh Kumar <> | Subject | Re: [PATCH] cpufreq: schedutil: force frequency update when limits change |
| |
On 24-06-20, 23:46, Wei Wang wrote: > To avoid reducing the frequency of a CPU prematurely, we skip reducing > the frequency if the CPU had been busy recently. > > This should not be done when the limits of the policy are changed, for > example due to thermal throttling. We should always get the frequency > within the new limits as soon as possible. > > There was a fix in > commit 600f5badb78c ("cpufreq: schedutil: Don't skip freq update when > limits change") upstream which introduced another flag. However, the > fix didn't address the case when next_freq is the same as previously > voted, which is then checked in sugov_update_next_freq. As a result, the > frequency would be stuck at low until the high demanding workload quits. > > test trace: > kworker/u19:0-1872 ( 1872) [002] .... 347.878871: cpu_frequency_limits: min=600000 max=2348000 cpu_id=6 > dhry64-11525 (11525) [007] d.h2 347.880012: sugov_should_update_freq: thermal limit on policy6 > dhry64-11525 (11525) [007] d.h2 347.880012: sugov_deferred_update: policy6 skipped update > dhry64-11525 (11525) [007] d.h2 347.884040: sugov_deferred_update: policy6 skipped update
I am not sure these are helpful in the logs as the code which generated them isn't there in the kernel.
> ... > > This patch fixes this by skipping the check and forcing an update in > this case. The second flag was kept as the limits_change flag could be > updated in thermal kworker from another CPU.
I am sorry but I am not fully sure of what the problem is. Can you describe that by giving an example with some random frequency, and tell the expected and actual behavior ?
> Fixes: ecd288429126 ("cpufreq: schedutil: Don't set next_freq to UINT_MAX") > Signed-off-by: Wei Wang <wvw@google.com> > --- > kernel/sched/cpufreq_schedutil.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c > index 7fbaee24c824..dc2cd768022e 100644 > --- a/kernel/sched/cpufreq_schedutil.c > +++ b/kernel/sched/cpufreq_schedutil.c > @@ -102,11 +102,12 @@ static bool sugov_should_update_freq(struct sugov_policy *sg_policy, u64 time) > 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->need_freq_update && sg_policy->next_freq == next_freq)
AFAIU, if the next freq is same as currently programmed one, there is no need to force update it.
> return false; > > sg_policy->next_freq = next_freq; > sg_policy->last_freq_update_time = time; > + sg_policy->need_freq_update = false; > > return true; > } > @@ -178,7 +179,6 @@ static unsigned int get_next_freq(struct sugov_policy *sg_policy, > if (freq == sg_policy->cached_raw_freq && !sg_policy->need_freq_update) > return sg_policy->next_freq; > > - sg_policy->need_freq_update = false; > sg_policy->cached_raw_freq = freq; > return cpufreq_driver_resolve_freq(policy, freq); > } > -- > 2.27.0.212.ge8ba1cc988-goog
-- viresh
| |