diff options
| author | Peter Zijlstra | 2025-10-20 16:15:05 +0200 |
|---|---|---|
| committer | Peter Zijlstra | 2025-11-11 12:33:38 +0100 |
| commit | e636ffb9e31b4f7dde7fef5358669266b9ce02ec (patch) | |
| tree | 01246d67c4a81ce41a0f57578ba89b106fff5ee8 /kernel/sched/fair.c | |
| parent | e40cea333e60c548e047eaddec6ca48c6632424b (diff) | |
sched/deadline: Fix dl_server time accounting
The dl_server time accounting code is a little odd. The normal scheduler
pattern is to update curr before doing something, such that the old state is
fully accounted before changing state.
Notably, the dl_server_timer() needs to propagate the current time accounting
since the current task could be ran by dl_server and thus this can affect
dl_se->runtime. Similarly for dl_server_start().
And since the (deferred) dl_server wants idle time accounted, rework
sched_idle_class time accounting to be more like all the others.
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://patch.msgid.link/20251020141130.GJ3245006@noisy.programming.kicks-ass.net
Diffstat (limited to 'kernel/sched/fair.c')
| -rw-r--r-- | kernel/sched/fair.c | 9 |
1 files changed, 2 insertions, 7 deletions
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 8d971d48669f..b4617d631549 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -1212,8 +1212,7 @@ static void update_curr(struct cfs_rq *cfs_rq) * against fair_server such that it can account for this time * and possibly avoid running this period. */ - if (dl_server_active(&rq->fair_server)) - dl_server_update(&rq->fair_server, delta_exec); + dl_server_update(&rq->fair_server, delta_exec); } account_cfs_rq_runtime(cfs_rq, delta_exec); @@ -6961,12 +6960,8 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) h_nr_idle = 1; } - 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); + if (!rq_h_nr_queued && rq->cfs.h_nr_queued) dl_server_start(&rq->fair_server); - } /* At this point se is NULL and we are at root level*/ add_nr_running(rq, 1); |
