On 21/07/16 15:36, Juri Lelli wrote: > On 21/07/16 15:21, Juri Lelli wrote: > > Hi, > > > > On 18/07/16 21:37, Xunlei Pang wrote: > > > On 2016/07/18 at 21:04, Juri Lelli wrote: > > > > On 15/07/16 18:39, Xunlei Pang wrote: > > > >> On 2016/07/13 at 18:58, Juri Lelli wrote: > > > > [...] > > > > > > > >> Since this is only called for queued cases now, there is no need to > > > >> check boosted stuff here. As enqueue_task(ENQUEUE_REPLENISH) > > > >> is called before check_class_changed() in rt_mutex_setprio(). > > > >> > > > > But we don't do the same in setscheduler, right? > > > > > > If p is deadline PI-boosted, setscheduler() won't call change its > > > sched_class. > > > If p isn't deadline PI-boosted, then pi_task is NULL. > > > > > > So, I think the added code won't hit. Did I miss something? > > > > > > > No, I think you are right. > > > > Oh, and we need to filter the call after rt_mutex_setprio has > already issued a replenishment. >
Does something like this on top of v4 make sense? --- kernel/sched/deadline.c | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c index dc56f5be0112..6f05ac78711c 100644 --- a/kernel/sched/deadline.c +++ b/kernel/sched/deadline.c @@ -350,9 +350,8 @@ static inline void setup_new_dl_entity(struct sched_dl_entity *dl_se) { struct dl_rq *dl_rq = dl_rq_of_se(dl_se); struct rq *rq = rq_of_dl_rq(dl_rq); - struct task_struct *pi_task; - struct sched_dl_entity *pi_se = dl_se; + WARN_ON(dl_se->dl_boosted); WARN_ON(dl_time_before(rq_clock(rq), dl_se->deadline)); /* @@ -364,21 +363,12 @@ static inline void setup_new_dl_entity(struct sched_dl_entity *dl_se) return; /* - * Use the scheduling parameters of the top pi-waiter task, - * if we have one from which we can inherit a deadline. - */ - if (dl_se->dl_boosted && - (pi_task = rt_mutex_get_top_task(dl_task_of(dl_se))) && - dl_prio(pi_task->normal_prio)) - pi_se = &pi_task->dl; - - /* * We use the regular wall clock time to set deadlines in the * future; in fact, we must consider execution overheads (time * spent on hardirq context, etc.). */ - dl_se->deadline = rq_clock(rq) + pi_se->dl_deadline; - dl_se->runtime = pi_se->dl_runtime; + dl_se->deadline = rq_clock(rq) + dl_se->dl_deadline; + dl_se->runtime = dl_se->dl_runtime; } /* @@ -1734,9 +1724,11 @@ static void switched_to_dl(struct rq *rq, struct task_struct *p) if (task_on_rq_queued(p)) { /* * If p is not queued we will update its parameters at next - * wakeup. + * wakeup. If p is dl_boosted we already updated its params in + * rt_mutex_setprio()->enqueue_task(..., ENQUEUE_REPLENISH). */ - if (dl_time_before(p->dl.deadline, rq_clock(rq))) + if (dl_time_before(p->dl.deadline, rq_clock(rq)) && + !p->dl.dl_boosted) setup_new_dl_entity(&p->dl); if (rq->curr != p) { --