From: douglas.raillard@arm.com
To: linux-kernel@vger.kernel.org
Cc: linux-pm@vger.kernel.org, mingo@redhat.com, peterz@infradead.org,
quentin.perret@arm.com, douglas.raillard@arm.com,
patrick.bellasi@arm.com, dietmar.eggemann@arm.com
Subject: [RFC PATCH 6/7] sched/cpufreq: Improve sugov_cpu_is_busy accuracy
Date: Wed, 8 May 2019 18:43:00 +0100 [thread overview]
Message-ID: <20190508174301.4828-7-douglas.raillard@arm.com> (raw)
In-Reply-To: <20190508174301.4828-1-douglas.raillard@arm.com>
From: Douglas RAILLARD <douglas.raillard@arm.com>
Avoid assuming a CPU is busy when it has begun being idle before
get_next_freq() is called. This is achieved by making sure the CPU will
not be detected as busy by other CPUs whenever its utilization is
decreasing.
Signed-off-by: Douglas RAILLARD <douglas.raillard@arm.com>
---
kernel/sched/cpufreq_schedutil.c | 42 ++++++++++++++++++++++++++++----
1 file changed, 37 insertions(+), 5 deletions(-)
diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c
index a12b7e5bc028..ce4b90cafbb5 100644
--- a/kernel/sched/cpufreq_schedutil.c
+++ b/kernel/sched/cpufreq_schedutil.c
@@ -62,6 +62,7 @@ struct sugov_cpu {
/* The field below is for single-CPU policies only: */
#ifdef CONFIG_NO_HZ_COMMON
unsigned long saved_idle_calls;
+ unsigned long previous_util;
#endif
};
@@ -181,14 +182,35 @@ static bool sugov_cpu_is_busy(struct sugov_cpu *sg_cpu)
return ret;
}
-static void sugov_cpu_is_busy_update(struct sugov_cpu *sg_cpu)
+static void sugov_cpu_is_busy_update(struct sugov_cpu *sg_cpu,
+ unsigned long util)
{
unsigned long idle_calls = tick_nohz_get_idle_calls_cpu(sg_cpu->cpu);
sg_cpu->saved_idle_calls = idle_calls;
+
+ /*
+ * Make sure that this CPU will not be immediately considered as busy in
+ * cases where the CPU has already entered an idle state. In that case,
+ * the number of idle_calls will not vary anymore until it exits idle,
+ * which would lead sugov_cpu_is_busy() to say that this CPU is busy,
+ * because it has not (re)entered idle since the last time we looked at
+ * it.
+ * Assuming cpu0 and cpu1 are in the same policy, that will make sure
+ * this sequence of events leads to right cpu1 business status from
+ * get_next_freq(cpu=1)
+ * cpu0: [enter idle] -> [get_next_freq] -> [doing nothing] -> [wakeup]
+ * cpu1: ... -> [get_next_freq] -> ...
+ */
+ if (util <= sg_cpu->previous_util)
+ sg_cpu->saved_idle_calls--;
+
+ sg_cpu->previous_util = util;
}
#else
static inline bool sugov_cpu_is_busy(struct sugov_cpu *sg_cpu) { return false; }
-static void sugov_cpu_is_busy_update(struct sugov_cpu *sg_cpu) {}
+static void sugov_cpu_is_busy_update(struct sugov_cpu *sg_cpu
+ unsigned long util)
+{}
#endif /* CONFIG_NO_HZ_COMMON */
/**
@@ -507,10 +529,9 @@ static void sugov_update_single(struct update_util_data *hook, u64 time,
if (!sugov_should_update_freq(sg_policy, time))
return;
- busy = sugov_cpu_is_busy(sg_cpu);
- sugov_cpu_is_busy_update(sg_cpu);
-
util = sugov_get_util(sg_cpu);
+ busy = sugov_cpu_is_busy(sg_cpu);
+ sugov_cpu_is_busy_update(sg_cpu, util);
max = sg_cpu->max;
util = sugov_iowait_apply(sg_cpu, time, util, max);
next_f = get_next_freq(sg_policy, util, max);
@@ -545,12 +566,15 @@ static unsigned int sugov_next_freq_shared(struct sugov_cpu *sg_cpu, u64 time)
struct cpufreq_policy *policy = sg_policy->policy;
unsigned long util = 0, max = 1;
unsigned int j;
+ unsigned long sg_cpu_util = 0;
for_each_cpu(j, policy->cpus) {
struct sugov_cpu *j_sg_cpu = &per_cpu(sugov_cpu, j);
unsigned long j_util, j_max;
j_util = sugov_get_util(j_sg_cpu);
+ if (j_sg_cpu == sg_cpu)
+ sg_cpu_util = j_util;
j_max = j_sg_cpu->max;
j_util = sugov_iowait_apply(j_sg_cpu, time, j_util, j_max);
@@ -560,6 +584,14 @@ static unsigned int sugov_next_freq_shared(struct sugov_cpu *sg_cpu, u64 time)
}
}
+ /*
+ * Only update the business status if we are looking at the CPU for
+ * which a utilization change triggered a call to get_next_freq(). This
+ * way, we don't affect the "busy" status of CPUs that don't have any
+ * change in utilization.
+ */
+ sugov_cpu_is_busy_update(sg_cpu, sg_cpu_util);
+
return get_next_freq(sg_policy, util, max);
}
--
2.21.0
next prev parent reply other threads:[~2019-05-08 17:43 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-08 17:42 [RFC PATCH 0/7] sched/cpufreq: Make schedutil energy aware douglas.raillard
2019-05-08 17:42 ` [RFC PATCH 1/7] PM: Introduce em_pd_get_higher_freq() douglas.raillard
2019-05-16 12:42 ` Patrick Bellasi
2019-05-16 13:01 ` Quentin Perret
2019-05-16 13:22 ` Patrick Bellasi
2019-06-19 16:08 ` Douglas Raillard
2019-06-20 13:04 ` Patrick Bellasi
2019-06-21 10:17 ` Quentin Perret
2019-06-21 10:22 ` Quentin Perret
2019-05-16 13:06 ` Douglas Raillard
2019-05-08 17:42 ` [RFC PATCH 2/7] sched/cpufreq: Attach perf domain to sugov policy douglas.raillard
2019-05-08 17:42 ` [RFC PATCH 3/7] sched/cpufreq: Hook em_pd_get_higher_power() into get_next_freq() douglas.raillard
2019-05-08 17:42 ` [RFC PATCH 4/7] sched/cpufreq: Move up sugov_cpu_is_busy() douglas.raillard
2019-05-08 17:42 ` [RFC PATCH 5/7] sched/cpufreq: sugov_cpu_is_busy for shared policy douglas.raillard
2019-05-08 17:43 ` douglas.raillard [this message]
2019-05-16 12:55 ` [RFC PATCH 6/7] sched/cpufreq: Improve sugov_cpu_is_busy accuracy Patrick Bellasi
2019-06-19 16:19 ` Douglas Raillard
2019-06-20 11:05 ` Patrick Bellasi
2019-05-08 17:43 ` [RFC PATCH 7/7] sched/cpufreq: Boost schedutil frequency ramp up douglas.raillard
2019-05-13 7:12 ` [RFC PATCH 0/7] sched/cpufreq: Make schedutil energy aware Viresh Kumar
2019-05-13 13:52 ` Douglas Raillard
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190508174301.4828-7-douglas.raillard@arm.com \
--to=douglas.raillard@arm.com \
--cc=dietmar.eggemann@arm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=patrick.bellasi@arm.com \
--cc=peterz@infradead.org \
--cc=quentin.perret@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.