Messages in this thread Patch in this message |  | | From | Yuri Andriaccio <> | | Subject | [RFC PATCH v5 03/29] sched/deadline: Distinguish between dl_rq and my_q | | Date | Thu, 30 Apr 2026 23:38:07 +0200 |
| |
From: luca abeni <luca.abeni@santannapisa.it>
Split the single runqueue pointer in sched_dl_entity into two separate pointers, following the existing pattern used by sched_rt_entity:
- dl_rq: Points to the deadline runqueue where this entity is queued (global runqueue). - my_q: Points to the runqueue that this entity serves (for servers).
This distinction is currently redundant for the fair_server and ext_servers (both point to the same CPU's structures), but is essential for future RT cgroup support where deadline servers will be queued on the global dl_rq while serving tasks from cgroup-specific runqueues.
Update rq_of_dl_se() to use container_of_const() to recover the global rq from dl_rq, and update fair.c and ext.c to explicitly use my_q (local rq) when accessing the served runqueue.
Update dl_server_init() to take a dl_rq pointer (use to retrieve the global runqueue where the dl_server is scheduled) and a rq pointer (for the local runqueue served by the server).
Signed-off-by: luca abeni <luca.abeni@santannapisa.it> Signed-off-by: Yuri Andriaccio <yurand2000@gmail.com> --- include/linux/sched.h | 6 ++++-- kernel/sched/deadline.c | 10 +++++++--- kernel/sched/ext.c | 4 ++-- kernel/sched/fair.c | 4 ++-- kernel/sched/sched.h | 3 ++- 5 files changed, 17 insertions(+), 10 deletions(-)
diff --git a/include/linux/sched.h b/include/linux/sched.h index 5a5d3dbc9cdf..eb8b57f689b5 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -733,9 +733,11 @@ struct sched_dl_entity { * Bits for DL-server functionality. Also see the comment near * dl_server_update(). * - * @rq the runqueue this server is for + * @dl_rq the runqueue on which this entity is (to be) queued + * @my_q the runqueue "owned" by this entity */ - struct rq *rq; + struct dl_rq *dl_rq; + struct rq *my_q; dl_server_pick_f server_pick_task;
#ifdef CONFIG_RT_MUTEXES diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c index ce80d9c08e31..219fe2fd697d 100644 --- a/kernel/sched/deadline.c +++ b/kernel/sched/deadline.c @@ -75,10 +75,12 @@ static inline struct rq *rq_of_dl_rq(struct dl_rq *dl_rq)
static inline struct rq *rq_of_dl_se(struct sched_dl_entity *dl_se) { - struct rq *rq = dl_se->rq; + struct rq *rq;
if (!dl_server(dl_se)) rq = task_rq(dl_task_of(dl_se)); + else + rq = container_of_const(dl_se->dl_rq, struct rq, dl);
return rq; } @@ -1833,10 +1835,12 @@ void dl_server_stop(struct sched_dl_entity *dl_se) dl_se->dl_server_active = 0; }
-void dl_server_init(struct sched_dl_entity *dl_se, struct rq *rq, +void dl_server_init(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq, + struct rq *served_rq, dl_server_pick_f pick_task) { - dl_se->rq = rq; + dl_se->dl_rq = dl_rq; + dl_se->my_q = served_rq; dl_se->server_pick_task = pick_task; }
diff --git a/kernel/sched/ext.c b/kernel/sched/ext.c index 064eaa76be4b..382152f8895f 100644 --- a/kernel/sched/ext.c +++ b/kernel/sched/ext.c @@ -2606,7 +2606,7 @@ ext_server_pick_task(struct sched_dl_entity *dl_se, struct rq_flags *rf) if (!scx_enabled()) return NULL;
- return do_pick_task_scx(dl_se->rq, rf, true); + return do_pick_task_scx(dl_se->my_q, rf, true); }
/* @@ -2618,7 +2618,7 @@ void ext_server_init(struct rq *rq)
init_dl_entity(dl_se);
- dl_server_init(dl_se, rq, ext_server_pick_task); + dl_server_init(dl_se, &rq->dl, rq, ext_server_pick_task); }
#ifdef CONFIG_SCHED_CORE diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index ab4114712be7..8c951186d5e5 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -9059,7 +9059,7 @@ pick_next_task_fair(struct rq *rq, struct task_struct *prev, struct rq_flags *rf static struct task_struct * fair_server_pick_task(struct sched_dl_entity *dl_se, struct rq_flags *rf) { - return pick_task_fair(dl_se->rq, rf); + return pick_task_fair(dl_se->my_q, rf); }
void fair_server_init(struct rq *rq) @@ -9068,7 +9068,7 @@ void fair_server_init(struct rq *rq)
init_dl_entity(dl_se);
- dl_server_init(dl_se, rq, fair_server_pick_task); + dl_server_init(dl_se, &rq->dl, rq, fair_server_pick_task); }
/* diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 1ef9ba480f51..8572bd12d0a2 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -412,7 +412,8 @@ extern void dl_server_update_idle(struct sched_dl_entity *dl_se, s64 delta_exec) extern void dl_server_update(struct sched_dl_entity *dl_se, s64 delta_exec); extern void dl_server_start(struct sched_dl_entity *dl_se); extern void dl_server_stop(struct sched_dl_entity *dl_se); -extern void dl_server_init(struct sched_dl_entity *dl_se, struct rq *rq, +extern void dl_server_init(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq, + struct rq *served_rq, dl_server_pick_f pick_task); extern void sched_init_dl_servers(void);
-- 2.53.0
|  |