[tip: sched/core] sched/fair: Extend for_each_sched_entity() with a back-link
From: tip-bot2 for Peter Zijlstra
Date: Mon Nov 09 2026 - 03:47:07 EST
The following commit has been merged into the sched/core branch of tip:
Commit-ID: 6e3cae6cb5a098d32e0b07a4e38a5bf9811b2f18
Gitweb: https://git.kernel.org/tip/6e3cae6cb5a098d32e0b07a4e38a5bf9811b2f18
Author: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
AuthorDate: Tue, 29 Sep 2026 10:49:26 +02:00
Committer: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
CommitterDate: Mon, 09 Nov 2026 09:39:56 +01:00
sched/fair: Extend for_each_sched_entity() with a back-link
Leave a trail of bread crumbs, such that we can find our way back down the
hierarchy. No actual users yet, but split out because its a bit tricky.
Signed-off-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx>
Reviewed-by: Vincent Guittot <vincent.guittot@xxxxxxxxxx>
Link: https://patch.msgid.link/20260929085320.209298048@xxxxxxxxxxxxx
---
kernel/sched/fair.c | 14 +++++++++++---
kernel/sched/sched.h | 1 +
2 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index d5f937d..31a583d 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -317,8 +317,13 @@ const struct sched_class fair_sched_class;
#ifdef CONFIG_FAIR_GROUP_SCHED
/* Walk up scheduling entities hierarchy */
-#define for_each_sched_entity(se, cfs_rq) \
- for (; (se) && ((cfs_rq) = cfs_rq_of(se)); (se) = (se)->parent)
+#define for_each_sched_entity(se, cfs_rq) \
+ for (struct sched_entity *_BL = NULL; \
+ (se) && ((cfs_rq) = cfs_rq_of(se), (cfs_rq)->backlink = _BL, true);\
+ (se) = (se)->parent, _BL = (se))
+
+#define for_each_sched_entity_bl(se, cfs_rq) \
+ for (; ((se) = (cfs_rq)->backlink); (cfs_rq) = group_cfs_rq(se))
static inline bool list_add_leaf_cfs_rq(struct cfs_rq *cfs_rq)
{
@@ -455,6 +460,9 @@ static int se_is_idle(struct sched_entity *se)
#define for_each_sched_entity(se, cfs_rq) \
for (; (se) && ((cfs_rq) = cfs_rq_of(se)); (se) = NULL)
+#define for_each_sched_entity_bl(se, cfs_rq) \
+ for (; ((se) = NULL);)
+
static inline bool list_add_leaf_cfs_rq(struct cfs_rq *cfs_rq)
{
return true;
@@ -15277,7 +15285,7 @@ static inline void task_tick_core(struct rq *rq, struct task_struct *curr)
/*
* se_fi_update - Update the cfs_rq->zero_vruntime_fi in a CFS hierarchy if needed.
*/
-static void se_fi_update(const struct sched_entity *se, unsigned int fi_seq,
+static void se_fi_update(struct sched_entity *se, unsigned int fi_seq,
bool forceidle)
{
struct cfs_rq *cfs_rq;
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index cf5dba1..a993c7d 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -726,6 +726,7 @@ struct cfs_rq {
unsigned long tg_runnable_avg_contrib;
long propagate;
long prop_runnable_sum;
+ struct sched_entity *backlink;
/*
* h_load = weight * f(tg)