Messages in this thread | | | Subject | Re: [PATCH v4] sched/deadline: remove useless param from setup_new_dl_entity | From | Xunlei Pang <> | Date | Fri, 22 Jul 2016 10:58:55 +0800 |
| |
On 2016/07/21 at 22:46, Juri Lelli wrote: > 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)
Hi Juri,
It looks good to me, only one question: For on_rq boosted to deadline, p->dl.deadline has been updated after rq_lock(rq) by rt_mutex_setprio()->enqueue_task(..., ENQUEUE_REPLENISH) and no rq clock update afterwards, so dl_time_before() will be false, seems p->dl.dl_boosted check is needless.
Regards, Xunlei
> setup_new_dl_entity(&p->dl); > > if (rq->curr != p) {
| |