From: Chengming Zhou <zhouchengming@bytedance.com>
To: vincent.guittot@linaro.org, dietmar.eggemann@arm.com,
mingo@redhat.com, peterz@infradead.org, rostedt@goodmis.org,
bsegall@google.com, vschneid@redhat.com
Cc: linux-kernel@vger.kernel.org, tj@kernel.org,
Chengming Zhou <zhouchengming@bytedance.com>
Subject: [PATCH v6 5/9] sched/fair: combine detach into dequeue when migrating task
Date: Thu, 18 Aug 2022 20:48:01 +0800 [thread overview]
Message-ID: <20220818124805.601-6-zhouchengming@bytedance.com> (raw)
In-Reply-To: <20220818124805.601-1-zhouchengming@bytedance.com>
When we are migrating task out of the CPU, we can combine detach and
propagation into dequeue_entity() to save the detach_entity_cfs_rq()
in migrate_task_rq_fair().
This optimization is like combining DO_ATTACH in the enqueue_entity()
when migrating task to the CPU. So we don't have to traverse the CFS tree
extra time to do the detach_entity_cfs_rq() -> propagate_entity_cfs_rq(),
which wouldn't be called anymore with this patch's change.
detach_task()
deactivate_task()
dequeue_task_fair()
for_each_sched_entity(se)
dequeue_entity()
update_load_avg() /* (1) */
detach_entity_load_avg()
set_task_cpu()
migrate_task_rq_fair()
detach_entity_cfs_rq() /* (2) */
update_load_avg();
detach_entity_load_avg();
propagate_entity_cfs_rq();
for_each_sched_entity()
update_load_avg()
This patch save the detach_entity_cfs_rq() called in (2) by doing
the detach_entity_load_avg() for a CPU migrating task inside (1)
(the task being the first se in the loop)
Signed-off-by: Chengming Zhou <zhouchengming@bytedance.com>
Reviewed-by: Vincent Guittot <vincent.guittot@linaro.org>
---
kernel/sched/fair.c | 28 ++++++++++++++++------------
1 file changed, 16 insertions(+), 12 deletions(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 372e5f4a49a3..1eb3fb3d95c3 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -4167,6 +4167,7 @@ static void detach_entity_load_avg(struct cfs_rq *cfs_rq, struct sched_entity *s
#define UPDATE_TG 0x1
#define SKIP_AGE_LOAD 0x2
#define DO_ATTACH 0x4
+#define DO_DETACH 0x8
/* Update task and its cfs_rq load average */
static inline void update_load_avg(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)
@@ -4196,6 +4197,13 @@ static inline void update_load_avg(struct cfs_rq *cfs_rq, struct sched_entity *s
attach_entity_load_avg(cfs_rq, se);
update_tg_load_avg(cfs_rq);
+ } else if (flags & DO_DETACH) {
+ /*
+ * DO_DETACH means we're here from dequeue_entity()
+ * and we are migrating task out of the CPU.
+ */
+ detach_entity_load_avg(cfs_rq, se);
+ update_tg_load_avg(cfs_rq);
} else if (decayed) {
cfs_rq_util_change(cfs_rq, 0);
@@ -4456,6 +4464,7 @@ static inline bool cfs_rq_is_decayed(struct cfs_rq *cfs_rq)
#define UPDATE_TG 0x0
#define SKIP_AGE_LOAD 0x0
#define DO_ATTACH 0x0
+#define DO_DETACH 0x0
static inline void update_load_avg(struct cfs_rq *cfs_rq, struct sched_entity *se, int not_used1)
{
@@ -4676,6 +4685,11 @@ static __always_inline void return_cfs_rq_runtime(struct cfs_rq *cfs_rq);
static void
dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)
{
+ int action = UPDATE_TG;
+
+ if (entity_is_task(se) && task_on_rq_migrating(task_of(se)))
+ action |= DO_DETACH;
+
/*
* Update run-time statistics of the 'current'.
*/
@@ -4690,7 +4704,7 @@ dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)
* - For group entity, update its weight to reflect the new share
* of its group cfs_rq.
*/
- update_load_avg(cfs_rq, se, UPDATE_TG);
+ update_load_avg(cfs_rq, se, action);
se_update_runnable(se);
update_stats_dequeue_fair(cfs_rq, se, flags);
@@ -7242,8 +7256,6 @@ select_task_rq_fair(struct task_struct *p, int prev_cpu, int wake_flags)
return new_cpu;
}
-static void detach_entity_cfs_rq(struct sched_entity *se);
-
/*
* Called immediately before a task is migrated to a new CPU; task_cpu(p) and
* cfs_rq_of(p) references at time of call are still valid and identify the
@@ -7265,15 +7277,7 @@ static void migrate_task_rq_fair(struct task_struct *p, int new_cpu)
se->vruntime -= u64_u32_load(cfs_rq->min_vruntime);
}
- if (p->on_rq == TASK_ON_RQ_MIGRATING) {
- /*
- * In case of TASK_ON_RQ_MIGRATING we in fact hold the 'old'
- * rq->lock and can modify state directly.
- */
- lockdep_assert_rq_held(task_rq(p));
- detach_entity_cfs_rq(se);
-
- } else {
+ if (!task_on_rq_migrating(p)) {
remove_entity_load_avg(se);
/*
--
2.37.2
next prev parent reply other threads:[~2022-08-18 12:49 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-18 12:47 [PATCH v6 0/9] sched/fair: task load tracking optimization and cleanup Chengming Zhou
2022-08-18 12:47 ` [PATCH v6 1/9] sched/fair: maintain task se depth in set_task_rq() Chengming Zhou
2022-08-23 9:27 ` [tip: sched/core] sched/fair: Maintain " tip-bot2 for Chengming Zhou
2022-08-18 12:47 ` [PATCH v6 2/9] sched/fair: remove redundant cpu_cgrp_subsys->fork() Chengming Zhou
2022-08-23 9:27 ` [tip: sched/core] sched/fair: Remove " tip-bot2 for Chengming Zhou
2022-08-18 12:47 ` [PATCH v6 3/9] sched/fair: reset sched_avg last_update_time before set_task_rq() Chengming Zhou
2022-08-23 9:27 ` [tip: sched/core] sched/fair: Reset " tip-bot2 for Chengming Zhou
2022-08-18 12:48 ` [PATCH v6 4/9] sched/fair: update comments in enqueue/dequeue_entity() Chengming Zhou
2022-08-23 9:27 ` [tip: sched/core] sched/fair: Update " tip-bot2 for Chengming Zhou
2022-08-18 12:48 ` Chengming Zhou [this message]
2022-08-23 9:27 ` [tip: sched/core] sched/fair: Combine detach into dequeue when migrating task tip-bot2 for Chengming Zhou
2022-08-18 12:48 ` [PATCH v6 6/9] sched/fair: fix another detach on unattached task corner case Chengming Zhou
2022-08-23 7:06 ` Vincent Guittot
2022-08-23 9:27 ` [tip: sched/core] sched/fair: Fix " tip-bot2 for Chengming Zhou
2022-08-18 12:48 ` [PATCH v6 7/9] sched/fair: allow changing cgroup of new forked task Chengming Zhou
2022-08-23 7:54 ` Vincent Guittot
2022-08-23 9:27 ` [tip: sched/core] sched/fair: Allow " tip-bot2 for Chengming Zhou
2022-08-18 12:48 ` [PATCH v6 8/9] sched/fair: move task sched_avg attach to enqueue_task_fair() Chengming Zhou
2022-08-23 7:48 ` Vincent Guittot
2022-08-23 9:27 ` [tip: sched/core] sched/fair: Move " tip-bot2 for Chengming Zhou
2022-08-18 12:48 ` [PATCH v6 9/9] sched/fair: don't init util/runnable_avg for !fair task Chengming Zhou
2022-08-23 7:49 ` Vincent Guittot
2022-08-23 9:27 ` [tip: sched/core] sched/fair: Don't " tip-bot2 for Chengming Zhou
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=20220818124805.601-6-zhouchengming@bytedance.com \
--to=zhouchengming@bytedance.com \
--cc=bsegall@google.com \
--cc=dietmar.eggemann@arm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=tj@kernel.org \
--cc=vincent.guittot@linaro.org \
--cc=vschneid@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®