Skip to content

Commit 295d6d5

Browse files
Luca AbeniIngo Molnar
authored andcommitted
sched/deadline: Fix switching to -deadline
Fix a bug introduced in: 72f9f3f ("sched/deadline: Remove dl_new from struct sched_dl_entity") After that commit, when switching to -deadline if the scheduling deadline of a task is in the past then switched_to_dl() calls setup_new_entity() to properly initialize the scheduling deadline and runtime. The problem is that the task is enqueued _before_ having its parameters initialized by setup_new_entity(), and this can cause problems. For example, a task with its out-of-date deadline in the past will potentially be enqueued as the highest priority one; however, its adjusted deadline may not be the earliest one. This patch fixes the problem by initializing the task's parameters before enqueuing it. Signed-off-by: luca abeni <[email protected]> Signed-off-by: Peter Zijlstra (Intel) <[email protected]> Reviewed-by: Daniel Bristot de Oliveira <[email protected]> Cc: Juri Lelli <[email protected]> Cc: Linus Torvalds <[email protected]> Cc: Mathieu Poirier <[email protected]> Cc: Mike Galbraith <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Steven Rostedt <[email protected]> Cc: Thomas Gleixner <[email protected]> Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Ingo Molnar <[email protected]>
1 parent e964d35 commit 295d6d5

File tree

1 file changed

+4
-7
lines changed

1 file changed

+4
-7
lines changed

kernel/sched/deadline.c

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1364,6 +1364,10 @@ enqueue_dl_entity(struct sched_dl_entity *dl_se,
13641364
update_dl_entity(dl_se, pi_se);
13651365
} else if (flags & ENQUEUE_REPLENISH) {
13661366
replenish_dl_entity(dl_se, pi_se);
1367+
} else if ((flags & ENQUEUE_RESTORE) &&
1368+
dl_time_before(dl_se->deadline,
1369+
rq_clock(rq_of_dl_rq(dl_rq_of_se(dl_se))))) {
1370+
setup_new_dl_entity(dl_se);
13671371
}
13681372

13691373
__enqueue_dl_entity(dl_se);
@@ -2255,13 +2259,6 @@ static void switched_to_dl(struct rq *rq, struct task_struct *p)
22552259

22562260
return;
22572261
}
2258-
/*
2259-
* If p is boosted we already updated its params in
2260-
* rt_mutex_setprio()->enqueue_task(..., ENQUEUE_REPLENISH),
2261-
* p's deadline being now already after rq_clock(rq).
2262-
*/
2263-
if (dl_time_before(p->dl.deadline, rq_clock(rq)))
2264-
setup_new_dl_entity(&p->dl);
22652262

22662263
if (rq->curr != p) {
22672264
#ifdef CONFIG_SMP

0 commit comments

Comments
 (0)