Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 87cdf4ed authored by Viresh Kumar's avatar Viresh Kumar Committed by Todd Kjos
Browse files

BACKPORT: schedutil: Reset cached freq if it is not in sync with next_freq



'cached_raw_freq' is used to get the next frequency quickly but should
always be in sync with sg_policy->next_freq. There are cases where it is
not and in such cases it should be reset to avoid switching to incorrect
frequencies.

Consider this case for example:
- policy->cur is 1.2 GHz (Max)
- New request comes for 780 MHz and we store that in cached_raw_freq.
- Based on 780 MHz, we calculate the effective frequency as 800 MHz.
- We then decide not to update the frequency as
  sugov_up_down_rate_limit() return true.
- Here cached_raw_freq is 780 MHz and sg_policy->next_freq is 1.2 GHz.
- Now if the utilization doesn't change in next request, then the next
  target frequency will still be 780 MHz and it will match with
  cached_raw_freq and so we will directly return 1.2 GHz instead of 800
  MHz.

BACKPORT of upstream commit 07458f6a5171 ("cpufreq: schedutil: Reset
cached_raw_freq when not in sync with next_freq").

This also updates sugov_update_commit() for handling up/down tunables,
which aren't present in mainline.

Change-Id: Ie86465231e7cb265e5b4c26f59d6faf8d9630b0a
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
parent b7634809
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -129,8 +129,11 @@ static void sugov_update_commit(struct sugov_policy *sg_policy, u64 time,
{
	struct cpufreq_policy *policy = sg_policy->policy;

	if (sugov_up_down_rate_limit(sg_policy, time, next_freq))
	if (sugov_up_down_rate_limit(sg_policy, time, next_freq)) {
		/* Reset cached freq as next_freq isn't changed */
		sg_policy->cached_raw_freq = 0;
		return;
	}

	if (sg_policy->next_freq == next_freq)
		return;
@@ -291,8 +294,12 @@ static void sugov_update_single(struct update_util_data *hook, u64 time,
		 * Do not reduce the frequency if the CPU has not been idle
		 * recently, as the reduction is likely to be premature then.
		 */
		if (busy && next_f < sg_policy->next_freq)
		if (busy && next_f < sg_policy->next_freq) {
			next_f = sg_policy->next_freq;

			/* Reset cached freq as next_freq has changed */
			sg_policy->cached_raw_freq = 0;
		}
	}
	sugov_update_commit(sg_policy, time, next_f);
}