cpufreq: schedutil: Simplify iowait boosting
There is not reason for the minimum iowait boost value in the schedutil cpufreq governor to depend on the available range of CPU frequencies. In fact, that dependency is generally confusing, because it causes the iowait boost to behave somewhat differently on CPUs with the same maximum frequency and different minimum frequencies, for example. For this reason, replace the min field in struct sugov_cpu with a constant and choose its values to be 1/8 of SCHED_CAPACITY_SCALE (for consistency with the intel_pstate driver's internal governor). [Note that policy->cpuinfo.max_freq will not be a constant any more after a subsequent change, so this change is depended on by it.] Link: https://lore.kernel.org/lkml/20190305083202.GU32494@hirez.programming.kicks-ass.net/T/#ee20bdc98b7d89f6110c0d00e5c3ee8c2ced93c3d Suggested-by: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
This commit is contained in:
parent
540a375822
commit
9eca544b14
|
@ -13,6 +13,8 @@
|
||||||
#include <linux/sched/cpufreq.h>
|
#include <linux/sched/cpufreq.h>
|
||||||
#include <trace/events/power.h>
|
#include <trace/events/power.h>
|
||||||
|
|
||||||
|
#define IOWAIT_BOOST_MIN (SCHED_CAPACITY_SCALE / 8)
|
||||||
|
|
||||||
struct sugov_tunables {
|
struct sugov_tunables {
|
||||||
struct gov_attr_set attr_set;
|
struct gov_attr_set attr_set;
|
||||||
unsigned int rate_limit_us;
|
unsigned int rate_limit_us;
|
||||||
|
@ -51,7 +53,6 @@ struct sugov_cpu {
|
||||||
u64 last_update;
|
u64 last_update;
|
||||||
|
|
||||||
unsigned long bw_dl;
|
unsigned long bw_dl;
|
||||||
unsigned long min;
|
|
||||||
unsigned long max;
|
unsigned long max;
|
||||||
|
|
||||||
/* The field below is for single-CPU policies only: */
|
/* The field below is for single-CPU policies only: */
|
||||||
|
@ -291,8 +292,8 @@ static unsigned long sugov_get_util(struct sugov_cpu *sg_cpu)
|
||||||
*
|
*
|
||||||
* The IO wait boost of a task is disabled after a tick since the last update
|
* The IO wait boost of a task is disabled after a tick since the last update
|
||||||
* of a CPU. If a new IO wait boost is requested after more then a tick, then
|
* of a CPU. If a new IO wait boost is requested after more then a tick, then
|
||||||
* we enable the boost starting from the minimum frequency, which improves
|
* we enable the boost starting from IOWAIT_BOOST_MIN, which improves energy
|
||||||
* energy efficiency by ignoring sporadic wakeups from IO.
|
* efficiency by ignoring sporadic wakeups from IO.
|
||||||
*/
|
*/
|
||||||
static bool sugov_iowait_reset(struct sugov_cpu *sg_cpu, u64 time,
|
static bool sugov_iowait_reset(struct sugov_cpu *sg_cpu, u64 time,
|
||||||
bool set_iowait_boost)
|
bool set_iowait_boost)
|
||||||
|
@ -303,7 +304,7 @@ static bool sugov_iowait_reset(struct sugov_cpu *sg_cpu, u64 time,
|
||||||
if (delta_ns <= TICK_NSEC)
|
if (delta_ns <= TICK_NSEC)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
sg_cpu->iowait_boost = set_iowait_boost ? sg_cpu->min : 0;
|
sg_cpu->iowait_boost = set_iowait_boost ? IOWAIT_BOOST_MIN : 0;
|
||||||
sg_cpu->iowait_boost_pending = set_iowait_boost;
|
sg_cpu->iowait_boost_pending = set_iowait_boost;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -317,8 +318,9 @@ static bool sugov_iowait_reset(struct sugov_cpu *sg_cpu, u64 time,
|
||||||
*
|
*
|
||||||
* Each time a task wakes up after an IO operation, the CPU utilization can be
|
* Each time a task wakes up after an IO operation, the CPU utilization can be
|
||||||
* boosted to a certain utilization which doubles at each "frequent and
|
* boosted to a certain utilization which doubles at each "frequent and
|
||||||
* successive" wakeup from IO, ranging from the utilization of the minimum
|
* successive" wakeup from IO, ranging from IOWAIT_BOOST_MIN to the utilization
|
||||||
* OPP to the utilization of the maximum OPP.
|
* of the maximum OPP.
|
||||||
|
*
|
||||||
* To keep doubling, an IO boost has to be requested at least once per tick,
|
* To keep doubling, an IO boost has to be requested at least once per tick,
|
||||||
* otherwise we restart from the utilization of the minimum OPP.
|
* otherwise we restart from the utilization of the minimum OPP.
|
||||||
*/
|
*/
|
||||||
|
@ -349,7 +351,7 @@ static void sugov_iowait_boost(struct sugov_cpu *sg_cpu, u64 time,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* First wakeup after IO: start with minimum boost */
|
/* First wakeup after IO: start with minimum boost */
|
||||||
sg_cpu->iowait_boost = sg_cpu->min;
|
sg_cpu->iowait_boost = IOWAIT_BOOST_MIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -389,7 +391,7 @@ static unsigned long sugov_iowait_apply(struct sugov_cpu *sg_cpu, u64 time,
|
||||||
* No boost pending; reduce the boost value.
|
* No boost pending; reduce the boost value.
|
||||||
*/
|
*/
|
||||||
sg_cpu->iowait_boost >>= 1;
|
sg_cpu->iowait_boost >>= 1;
|
||||||
if (sg_cpu->iowait_boost < sg_cpu->min) {
|
if (sg_cpu->iowait_boost < IOWAIT_BOOST_MIN) {
|
||||||
sg_cpu->iowait_boost = 0;
|
sg_cpu->iowait_boost = 0;
|
||||||
return util;
|
return util;
|
||||||
}
|
}
|
||||||
|
@ -826,9 +828,6 @@ static int sugov_start(struct cpufreq_policy *policy)
|
||||||
memset(sg_cpu, 0, sizeof(*sg_cpu));
|
memset(sg_cpu, 0, sizeof(*sg_cpu));
|
||||||
sg_cpu->cpu = cpu;
|
sg_cpu->cpu = cpu;
|
||||||
sg_cpu->sg_policy = sg_policy;
|
sg_cpu->sg_policy = sg_policy;
|
||||||
sg_cpu->min =
|
|
||||||
(SCHED_CAPACITY_SCALE * policy->cpuinfo.min_freq) /
|
|
||||||
policy->cpuinfo.max_freq;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for_each_cpu(cpu, policy->cpus) {
|
for_each_cpu(cpu, policy->cpus) {
|
||||||
|
|
Loading…
Reference in New Issue