[RFC PATCH 1/3] sched/core: Track the core-wide pick leader

From: K Prateek Nayak

Date: Fri Jul 17 2026 - 07:24:45 EST


Track the rq whose task is dictating the core-wide cookie. If no
core-cookie is set (!needs_sync), every rq on the core is considered a
pick leader as it can individually try to dictate a core cookie later.

This detail will be used in subsequent commits to extend proxy execution
to remain compatible with core scheduling.

No functional changes intended.

Signed-off-by: K Prateek Nayak <kprateek.nayak@xxxxxxx>
---
kernel/sched/core.c | 11 +++++++++--
kernel/sched/sched.h | 3 +++
2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 25851bb5489d..31fa6bcee616 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -6649,9 +6649,9 @@ pick_next_task(struct rq *rq, struct rq_flags *rf)
const struct cpumask *smt_mask;
bool fi_before = false;
bool core_clock_updated = (rq == rq->core);
+ struct rq *rq_i, *rq_max;
unsigned long cookie;
int i, cpu, occ = 0;
- struct rq *rq_i;
bool need_sync;

if (!sched_core_enabled(rq))
@@ -6668,6 +6668,7 @@ pick_next_task(struct rq *rq, struct rq_flags *rf)
*/
rq->core_pick = NULL;
rq->core_dl_server = NULL;
+ rq->core_pick_leader = true;
return __pick_next_task(rq, rf);
}

@@ -6737,6 +6738,7 @@ pick_next_task(struct rq *rq, struct rq_flags *rf)
if (!next->core_cookie) {
rq->core_pick = NULL;
rq->core_dl_server = NULL;
+ rq->core_pick_leader = true;
/*
* For robustness, update the min_vruntime_fi for
* unconstrained picks as well.
@@ -6755,6 +6757,7 @@ pick_next_task(struct rq *rq, struct rq_flags *rf)
*/
restart_multi:
max = NULL;
+ rq_max = NULL;
for_each_cpu_wrap(i, smt_mask, cpu) {
rq_i = cpu_rq(i);

@@ -6772,11 +6775,15 @@ pick_next_task(struct rq *rq, struct rq_flags *rf)

rq_i->core_pick = p;
rq_i->core_dl_server = rq_i->dl_server;
+ rq_i->core_pick_leader = false;

- if (!max || prio_less(max, p, fi_before))
+ if (!max || prio_less(max, p, fi_before)) {
max = p;
+ rq_max = rq_i;
+ }
}

+ rq_max->core_pick_leader = true;
cookie = rq->core->core_cookie = max->core_cookie;

/*
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index 9539867e9e0f..b80a5eb384f0 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -1350,6 +1350,9 @@ struct rq {
unsigned int core_sched_seq;
struct rb_root core_tree;

+ /* private state for sched_proxy_exec() */
+ bool core_pick_leader;
+
/* shared state -- careful with sched_core_cpu_deactivate() */
unsigned int core_task_seq;
unsigned int core_pick_seq;
--
2.43.0