 
            From: Joel Fernandes joelagnelf@nvidia.com
Since we are adding more servers, make dl_server_update_idle_time() accept a server argument rather than a specific server.
v2: - rename rq_dl_server to dl_server (Peter Zijlstra)
Acked-by: Juri Lelli juri.lelli@redhat.com Reviewed-by: Andrea Righi arighi@nvidia.com Signed-off-by: Joel Fernandes joelagnelf@nvidia.com --- kernel/sched/deadline.c | 16 ++++++++-------- kernel/sched/fair.c | 2 +- kernel/sched/idle.c | 2 +- kernel/sched/sched.h | 3 ++- 4 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c index 8aff1aba7b8a9..6ecfaaa1f912d 100644 --- a/kernel/sched/deadline.c +++ b/kernel/sched/deadline.c @@ -1543,26 +1543,26 @@ static void update_curr_dl_se(struct rq *rq, struct sched_dl_entity *dl_se, s64 * as time available for the dl_server, avoiding a penalty for the rt * scheduler that did not consumed that time. */ -void dl_server_update_idle_time(struct rq *rq, struct task_struct *p) +void dl_server_update_idle_time(struct rq *rq, struct task_struct *p, + struct sched_dl_entity *dl_server) { s64 delta_exec;
- if (!rq->fair_server.dl_defer) + if (!dl_server->dl_defer) return;
/* no need to discount more */ - if (rq->fair_server.runtime < 0) + if (dl_server->runtime < 0) return;
delta_exec = rq_clock_task(rq) - p->se.exec_start; if (delta_exec < 0) return;
- rq->fair_server.runtime -= delta_exec; - - if (rq->fair_server.runtime < 0) { - rq->fair_server.dl_defer_running = 0; - rq->fair_server.runtime = 0; + dl_server->runtime -= delta_exec; + if (dl_server->runtime < 0) { + dl_server->dl_defer_running = 0; + dl_server->runtime = 0; }
p->se.exec_start = rq_clock_task(rq); diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 2554055c1ba13..562cdd253678a 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -6999,7 +6999,7 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) if (!rq_h_nr_queued && rq->cfs.h_nr_queued) { /* Account for idle runtime */ if (!rq->nr_running) - dl_server_update_idle_time(rq, rq->curr); + dl_server_update_idle_time(rq, rq->curr, &rq->fair_server); dl_server_start(&rq->fair_server); }
diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c index 7fa0b593bcff7..60a19ea9bdbb7 100644 --- a/kernel/sched/idle.c +++ b/kernel/sched/idle.c @@ -454,7 +454,7 @@ static void wakeup_preempt_idle(struct rq *rq, struct task_struct *p, int flags)
static void put_prev_task_idle(struct rq *rq, struct task_struct *prev, struct task_struct *next) { - dl_server_update_idle_time(rq, prev); + dl_server_update_idle_time(rq, prev, &rq->fair_server); scx_update_idle(rq, false, true); }
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 4a0bf38dc71e9..eaae470841dea 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -412,7 +412,8 @@ extern void dl_server_init(struct sched_dl_entity *dl_se, struct rq *rq, extern void sched_init_dl_servers(void);
extern void dl_server_update_idle_time(struct rq *rq, - struct task_struct *p); + struct task_struct *p, + struct sched_dl_entity *rq_dl_server); extern void fair_server_init(struct rq *rq); extern void __dl_server_attach_root(struct sched_dl_entity *dl_se, struct rq *rq); extern int dl_server_apply_params(struct sched_dl_entity *dl_se,