From 05d2ca24206798c20145789dc2314daac87134de Mon Sep 17 00:00:00 2001 From: Saravana Kannan Date: Thu, 2 Mar 2017 15:45:47 -0800 Subject: [PATCH] cpufreq: schedutil: Ignore CPU load older than WALT window size The old code used to ignore CPU load older than 1 tick. Since the WALT window size can be more than 1 tick (and is configurable), this can cause an incorrect frequency drop in the middle of a WALT window. Use WALT window size to ignore CPU load instead. Change-Id: If42420f595ba9722866174c2cda8b6c2fdf34f92 Signed-off-by: Saravana Kannan Signed-off-by: Rohit Gupta --- kernel/sched/cpufreq_schedutil.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c index 864372fbc324..961a50297c19 100644 --- a/kernel/sched/cpufreq_schedutil.c +++ b/kernel/sched/cpufreq_schedutil.c @@ -73,6 +73,7 @@ struct sugov_cpu { }; static DEFINE_PER_CPU(struct sugov_cpu, sugov_cpu); +static unsigned int stale_ns; /************************ Governor internals ***********************/ @@ -299,6 +300,7 @@ static unsigned int sugov_next_freq_shared(struct sugov_cpu *sg_cpu, u64 time) { struct sugov_policy *sg_policy = sg_cpu->sg_policy; struct cpufreq_policy *policy = sg_policy->policy; + u64 last_freq_update_time = sg_policy->last_freq_update_time; unsigned long util = 0, max = 1; unsigned int j; @@ -314,8 +316,8 @@ static unsigned int sugov_next_freq_shared(struct sugov_cpu *sg_cpu, u64 time) * enough, don't take the CPU into account as it probably is * idle now (and clear iowait_boost for it). */ - delta_ns = time - j_sg_cpu->last_update; - if (delta_ns > TICK_NSEC) { + delta_ns = last_freq_update_time - j_sg_cpu->last_update; + if (delta_ns > stale_ns) { j_sg_cpu->iowait_boost = 0; j_sg_cpu->iowait_boost_pending = false; continue; @@ -592,6 +594,7 @@ static int sugov_init(struct cpufreq_policy *policy) policy->governor_data = sg_policy; sg_policy->tunables = tunables; + stale_ns = sched_ravg_window + (sched_ravg_window >> 3); ret = kobject_init_and_add(&tunables->attr_set.kobj, &sugov_tunables_ktype, get_governor_parent_kobj(policy), "%s",