linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Vincent Guittot <vincent.guittot@linaro.org>
To: peterz@infradead.org, mingo@kernel.org,
	linux-kernel@vger.kernel.org, rjw@rjwysocki.net
Cc: juri.lelli@redhat.com, dietmar.eggemann@arm.com,
	Morten.Rasmussen@arm.com, viresh.kumar@linaro.org,
	valentin.schneider@arm.com, quentin.perret@arm.com,
	Vincent Guittot <vincent.guittot@linaro.org>
Subject: [PATCH v5 02/10] sched/rt: add rt_rq utilization tracking
Date: Fri, 25 May 2018 15:12:23 +0200	[thread overview]
Message-ID: <1527253951-22709-3-git-send-email-vincent.guittot@linaro.org> (raw)
In-Reply-To: <1527253951-22709-1-git-send-email-vincent.guittot@linaro.org>

schedutil governor relies on cfs_rq's util_avg to choose the OPP when cfs
tasks are running. When the CPU is overloaded by cfs and rt tasks, cfs tasks
are preempted by rt tasks and in this case util_avg reflects the remaining
capacity but not what cfs want to use. In such case, schedutil can select a
lower OPP whereas the CPU is overloaded. In order to have a more accurate
view of the utilization of the CPU, we track the utilization that is
"stolen" by rt tasks.

rt_rq uses rq_clock_task and cfs_rq uses cfs_rq_clock_task but they are
the same at the root group level, so the PELT windows of the util_sum are
aligned.

Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
---
 kernel/sched/fair.c  | 15 ++++++++++++++-
 kernel/sched/pelt.c  | 23 +++++++++++++++++++++++
 kernel/sched/pelt.h  |  7 +++++++
 kernel/sched/rt.c    |  8 ++++++++
 kernel/sched/sched.h |  7 +++++++
 5 files changed, 59 insertions(+), 1 deletion(-)

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 6390c66..fb18bcc 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -7290,6 +7290,14 @@ static inline bool cfs_rq_has_blocked(struct cfs_rq *cfs_rq)
 	return false;
 }
 
+static inline bool rt_rq_has_blocked(struct rq *rq)
+{
+	if (rq->avg_rt.util_avg)
+		return true;
+
+	return false;
+}
+
 #ifdef CONFIG_FAIR_GROUP_SCHED
 
 static inline bool cfs_rq_is_decayed(struct cfs_rq *cfs_rq)
@@ -7349,6 +7357,10 @@ static void update_blocked_averages(int cpu)
 		if (cfs_rq_has_blocked(cfs_rq))
 			done = false;
 	}
+	update_rt_rq_load_avg(rq_clock_task(rq), rq, 0);
+	/* Don't need periodic decay once load/util_avg are null */
+	if (rt_rq_has_blocked(rq))
+		done = false;
 
 #ifdef CONFIG_NO_HZ_COMMON
 	rq->last_blocked_load_update_tick = jiffies;
@@ -7414,9 +7426,10 @@ static inline void update_blocked_averages(int cpu)
 	rq_lock_irqsave(rq, &rf);
 	update_rq_clock(rq);
 	update_cfs_rq_load_avg(cfs_rq_clock_task(cfs_rq), cfs_rq);
+	update_rt_rq_load_avg(rq_clock_task(rq), rq, 0);
 #ifdef CONFIG_NO_HZ_COMMON
 	rq->last_blocked_load_update_tick = jiffies;
-	if (!cfs_rq_has_blocked(cfs_rq))
+	if (!cfs_rq_has_blocked(cfs_rq) && !rt_rq_has_blocked(rq))
 		rq->has_blocked_load = 0;
 #endif
 	rq_unlock_irqrestore(rq, &rf);
diff --git a/kernel/sched/pelt.c b/kernel/sched/pelt.c
index e6ecbb2..213b922 100644
--- a/kernel/sched/pelt.c
+++ b/kernel/sched/pelt.c
@@ -309,3 +309,26 @@ int __update_load_avg_cfs_rq(u64 now, int cpu, struct cfs_rq *cfs_rq)
 
 	return 0;
 }
+
+/*
+ * rt_rq:
+ *
+ *   util_sum = \Sum se->avg.util_sum but se->avg.util_sum is not tracked
+ *   util_sum = cpu_scale * load_sum
+ *   runnable_load_sum = load_sum
+ *
+ */
+
+int update_rt_rq_load_avg(u64 now, struct rq *rq, int running)
+{
+	if (___update_load_sum(now, rq->cpu, &rq->avg_rt,
+				running,
+				running,
+				running)) {
+
+		___update_load_avg(&rq->avg_rt, 1, 1);
+		return 1;
+	}
+
+	return 0;
+}
diff --git a/kernel/sched/pelt.h b/kernel/sched/pelt.h
index 9cac73e..b2983b7 100644
--- a/kernel/sched/pelt.h
+++ b/kernel/sched/pelt.h
@@ -3,6 +3,7 @@
 int __update_load_avg_blocked_se(u64 now, int cpu, struct sched_entity *se);
 int __update_load_avg_se(u64 now, int cpu, struct cfs_rq *cfs_rq, struct sched_entity *se);
 int __update_load_avg_cfs_rq(u64 now, int cpu, struct cfs_rq *cfs_rq);
+int update_rt_rq_load_avg(u64 now, struct rq *rq, int running);
 
 /*
  * When a task is dequeued, its estimated utilization should not be update if
@@ -38,6 +39,12 @@ update_cfs_rq_load_avg(u64 now, struct cfs_rq *cfs_rq)
 	return 0;
 }
 
+static inline int
+update_rt_rq_load_avg(u64 now, struct rq *rq, int running)
+{
+	return 0;
+}
+
 #endif
 
 
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
index ef3c4e6..b4148a9 100644
--- a/kernel/sched/rt.c
+++ b/kernel/sched/rt.c
@@ -5,6 +5,8 @@
  */
 #include "sched.h"
 
+#include "pelt.h"
+
 int sched_rr_timeslice = RR_TIMESLICE;
 int sysctl_sched_rr_timeslice = (MSEC_PER_SEC / HZ) * RR_TIMESLICE;
 
@@ -1572,6 +1574,9 @@ pick_next_task_rt(struct rq *rq, struct task_struct *prev, struct rq_flags *rf)
 
 	rt_queue_push_tasks(rq);
 
+	update_rt_rq_load_avg(rq_clock_task(rq), rq,
+		rq->curr->sched_class == &rt_sched_class);
+
 	return p;
 }
 
@@ -1579,6 +1584,8 @@ static void put_prev_task_rt(struct rq *rq, struct task_struct *p)
 {
 	update_curr_rt(rq);
 
+	update_rt_rq_load_avg(rq_clock_task(rq), rq, 1);
+
 	/*
 	 * The previous task needs to be made eligible for pushing
 	 * if it is still active
@@ -2308,6 +2315,7 @@ static void task_tick_rt(struct rq *rq, struct task_struct *p, int queued)
 	struct sched_rt_entity *rt_se = &p->rt;
 
 	update_curr_rt(rq);
+	update_rt_rq_load_avg(rq_clock_task(rq), rq, 1);
 
 	watchdog(rq, p);
 
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index 757a3ee..7a16de9 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -592,6 +592,7 @@ struct rt_rq {
 	unsigned long		rt_nr_total;
 	int			overloaded;
 	struct plist_head	pushable_tasks;
+
 #endif /* CONFIG_SMP */
 	int			rt_queued;
 
@@ -847,6 +848,7 @@ struct rq {
 
 	u64			rt_avg;
 	u64			age_stamp;
+	struct sched_avg	avg_rt;
 	u64			idle_stamp;
 	u64			avg_idle;
 
@@ -2205,4 +2207,9 @@ static inline unsigned long cpu_util_cfs(struct rq *rq)
 
 	return util;
 }
+
+static inline unsigned long cpu_util_rt(struct rq *rq)
+{
+	return rq->avg_rt.util_avg;
+}
 #endif
-- 
2.7.4

  parent reply	other threads:[~2018-05-25 13:12 UTC|newest]

Thread overview: 99+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-25 13:12 [PATCH v5 00/10] track CPU utilization Vincent Guittot
2018-05-25 13:12 ` [PATCH v5 01/10] sched/pelt: Move pelt related code in a dedicated file Vincent Guittot
2018-05-25 14:26   ` Quentin Perret
2018-05-25 16:14     ` Peter Zijlstra
2018-05-29  8:21       ` Quentin Perret
2018-05-25 18:04     ` Patrick Bellasi
2018-05-29 14:55       ` Quentin Perret
2018-05-29 15:02         ` Vincent Guittot
2018-05-29 15:04           ` Quentin Perret
2018-05-25 13:12 ` Vincent Guittot [this message]
2018-05-25 15:54   ` [PATCH v5 02/10] sched/rt: add rt_rq utilization tracking Patrick Bellasi
2018-05-29 13:29     ` Vincent Guittot
2018-05-30  9:32       ` Patrick Bellasi
2018-05-30 10:06         ` Vincent Guittot
2018-05-30 11:01           ` Patrick Bellasi
2018-05-30 14:39             ` Vincent Guittot
2018-05-25 13:12 ` [PATCH v5 03/10] cpufreq/schedutil: add rt " Vincent Guittot
2018-05-30  7:03   ` Viresh Kumar
2018-05-30  8:23     ` Vincent Guittot
2018-05-30  9:40   ` Patrick Bellasi
2018-05-30  9:53     ` Vincent Guittot
2018-05-30 16:46   ` Quentin Perret
2018-05-31  8:46     ` Juri Lelli
2018-06-01 16:23       ` Peter Zijlstra
2018-06-01 17:23         ` Patrick Bellasi
2018-06-04 10:17           ` Quentin Perret
2018-06-04 15:16             ` Patrick Bellasi
2018-05-25 13:12 ` [PATCH v5 04/10] sched/dl: add dl_rq " Vincent Guittot
2018-05-30 10:50   ` Patrick Bellasi
2018-05-30 11:51     ` Vincent Guittot
2018-05-25 13:12 ` [PATCH v5 05/10] cpufreq/schedutil: get max utilization Vincent Guittot
2018-05-28 10:12   ` Juri Lelli
2018-05-28 14:57     ` Vincent Guittot
2018-05-28 15:22       ` Juri Lelli
2018-05-28 16:34         ` Vincent Guittot
2018-05-31 10:27           ` Patrick Bellasi
2018-05-31 13:02             ` Vincent Guittot
2018-06-01 13:53               ` Vincent Guittot
2018-06-01 17:45                 ` Joel Fernandes
2018-06-04  6:41                   ` Vincent Guittot
2018-06-04  7:04                     ` Juri Lelli
2018-06-04  7:14                       ` Vincent Guittot
2018-06-04 10:12                         ` Juri Lelli
2018-06-04 12:35                           ` Vincent Guittot
2018-05-29  5:08     ` Joel Fernandes
2018-05-29  6:31       ` Juri Lelli
2018-05-29  6:48         ` Vincent Guittot
2018-05-29  9:47           ` Juri Lelli
2018-05-29  8:40   ` Quentin Perret
2018-05-29  9:52     ` Juri Lelli
2018-05-30  8:37       ` Quentin Perret
2018-05-30  8:51         ` Juri Lelli
2018-05-25 13:12 ` [PATCH v5 06/10] sched: remove rt and dl from sched_avg Vincent Guittot
2018-05-25 13:12 ` [PATCH v5 07/10] sched/irq: add irq utilization tracking Vincent Guittot
2018-05-30 15:55   ` Dietmar Eggemann
2018-05-30 18:45     ` Vincent Guittot
2018-05-31 16:54       ` Dietmar Eggemann
2018-06-06 16:06         ` Vincent Guittot
2018-06-07  8:29           ` Dietmar Eggemann
2018-06-07  8:44             ` Vincent Guittot
2018-06-07  9:06               ` Dietmar Eggemann
2018-05-25 13:12 ` [PATCH v5 08/10] cpufreq/schedutil: take into account interrupt Vincent Guittot
2018-05-28 10:41   ` Juri Lelli
2018-05-28 12:06     ` Vincent Guittot
2018-05-28 12:37       ` Juri Lelli
2018-05-25 13:12 ` [PATCH v5 09/10] sched: remove rt_avg code Vincent Guittot
2018-05-25 13:12 ` [PATCH v5 10/10] proc/sched: remove unused sched_time_avg_ms Vincent Guittot
2018-06-04 16:50 ` [PATCH v5 00/10] track CPU utilization Peter Zijlstra
2018-06-04 17:13   ` Quentin Perret
2018-06-04 18:08   ` Vincent Guittot
2018-06-05 14:18     ` Peter Zijlstra
2018-06-05 15:03       ` Juri Lelli
2018-06-05 15:38       ` Patrick Bellasi
2018-06-05 22:27         ` Peter Zijlstra
2018-06-06  9:44       ` Quentin Perret
2018-06-06  9:59         ` Vincent Guittot
2018-06-06 10:02           ` Vincent Guittot
2018-06-06 10:12           ` Quentin Perret
2018-06-05  8:36 ` Vincent Guittot
2018-06-05 10:57   ` Quentin Perret
2018-06-05 11:59     ` Vincent Guittot
2018-06-05 13:12       ` Quentin Perret
2018-06-05 13:18         ` Vincent Guittot
2018-06-05 13:52           ` Quentin Perret
2018-06-05 13:55             ` Vincent Guittot
2018-06-05 14:09               ` Quentin Perret
2018-06-05 14:21                 ` Quentin Perret
2018-06-05 12:11     ` Juri Lelli
2018-06-05 13:05       ` Quentin Perret
2018-06-05 13:15         ` Juri Lelli
2018-06-05 14:01           ` Quentin Perret
2018-06-05 14:13             ` Juri Lelli
2018-06-06 13:05               ` Claudio Scordino
2018-06-06 13:20                 ` Quentin Perret
2018-06-06 13:53                   ` Claudio Scordino
2018-06-06 14:10                     ` Quentin Perret
2018-06-06 21:05                   ` luca abeni
2018-06-07  8:25                     ` Quentin Perret
2018-06-06 20:53                 ` luca abeni

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=1527253951-22709-3-git-send-email-vincent.guittot@linaro.org \
    --to=vincent.guittot@linaro.org \
    --cc=Morten.Rasmussen@arm.com \
    --cc=dietmar.eggemann@arm.com \
    --cc=juri.lelli@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    --cc=quentin.perret@arm.com \
    --cc=rjw@rjwysocki.net \
    --cc=valentin.schneider@arm.com \
    --cc=viresh.kumar@linaro.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).