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 <luca.abeni@santannapisa.it> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Daniel Bristot de Oliveira <bristot@redhat.com> Cc: Juri Lelli <juri.lelli@arm.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Mathieu Poirier <mathieu.poirier@linaro.org> Cc: Mike Galbraith <efault@gmx.de> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/1504778971-13573-3-git-send-email-luca.abeni@santannapisa.it Signed-off-by: Ingo Molnar <mingo@kernel.org>
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)