Commit 994a8f25 authored by Viresh Kumar's avatar Viresh Kumar Committed by Rafael J. Wysocki

cpufreq: schedutil: Redefine the rate_limit_us tunable

The rate_limit_us tunable is intended to reduce the possible overhead
from running the schedutil governor.  However, that overhead can be
divided into two separate parts: the governor computations and the
invocation of the scaling driver to set the CPU frequency.  The latter
is where the real overhead comes from.  The former is much less
expensive in terms of execution time and running it every time the
governor callback is invoked by the scheduler, after rate_limit_us
interval has passed since the last frequency update, would not be a
problem.

For this reason, redefine the rate_limit_us tunable so that it means the
minimum time that has to pass between two consecutive invocations of the
scaling driver by the schedutil governor (to set the CPU frequency).
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 4495c08e
...@@ -93,14 +93,13 @@ static void sugov_update_commit(struct sugov_policy *sg_policy, u64 time, ...@@ -93,14 +93,13 @@ static void sugov_update_commit(struct sugov_policy *sg_policy, u64 time,
{ {
struct cpufreq_policy *policy = sg_policy->policy; struct cpufreq_policy *policy = sg_policy->policy;
sg_policy->last_freq_update_time = time;
if (policy->fast_switch_enabled) { if (policy->fast_switch_enabled) {
if (sg_policy->next_freq == next_freq) { if (sg_policy->next_freq == next_freq) {
trace_cpu_frequency(policy->cur, smp_processor_id()); trace_cpu_frequency(policy->cur, smp_processor_id());
return; return;
} }
sg_policy->next_freq = next_freq; sg_policy->next_freq = next_freq;
sg_policy->last_freq_update_time = time;
next_freq = cpufreq_driver_fast_switch(policy, next_freq); next_freq = cpufreq_driver_fast_switch(policy, next_freq);
if (next_freq == CPUFREQ_ENTRY_INVALID) if (next_freq == CPUFREQ_ENTRY_INVALID)
return; return;
...@@ -109,6 +108,7 @@ static void sugov_update_commit(struct sugov_policy *sg_policy, u64 time, ...@@ -109,6 +108,7 @@ static void sugov_update_commit(struct sugov_policy *sg_policy, u64 time,
trace_cpu_frequency(next_freq, smp_processor_id()); trace_cpu_frequency(next_freq, smp_processor_id());
} else if (sg_policy->next_freq != next_freq) { } else if (sg_policy->next_freq != next_freq) {
sg_policy->next_freq = next_freq; sg_policy->next_freq = next_freq;
sg_policy->last_freq_update_time = time;
sg_policy->work_in_progress = true; sg_policy->work_in_progress = true;
irq_work_queue(&sg_policy->irq_work); irq_work_queue(&sg_policy->irq_work);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment