29.09.2014, 19:03, "Juri Lelli" <juri.le...@arm.com>: > Hi Kirill, > > On 27/09/14 09:41, Kirill Tkhai wrote: >> From: Kirill Tkhai <ktk...@parallels.com> >> >> Now rq->curr task can't be dequeued in this function >> (it's possible only in __schedule()). > > Could you please detail about "before", with a reference to the commit > that made this further change necessary?
I wrote about unlocked context switching, but I've looked one more time and found that it used to be impossible before too. We set "rq->curr = next" before prepare_lock_switch(), so dequeued task wasn't able to be curr. I'll update both descriptions in v2. Thanks, Kirill > > Thanks a lot, > > - Juri >> Also, delete "else" branch which is dead code. >> >> Signed-off-by: Kirill Tkhai <ktk...@parallels.com> >> --- >> kernel/sched/deadline.c | 50 >> +++++++++++++++++++++++------------------------ >> 1 file changed, 24 insertions(+), 26 deletions(-) >> >> diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c >> index 63f8b4a..38b4f19 100644 >> --- a/kernel/sched/deadline.c >> +++ b/kernel/sched/deadline.c >> @@ -1638,35 +1638,33 @@ static void switched_to_dl(struct rq *rq, struct >> task_struct *p) >> static void prio_changed_dl(struct rq *rq, struct task_struct *p, >> int oldprio) >> { >> - if (task_on_rq_queued(p) || rq->curr == p) { >> + if (!task_on_rq_queued(p)) >> + return; >> #ifdef CONFIG_SMP >> - /* >> - * This might be too much, but unfortunately >> - * we don't have the old deadline value, and >> - * we can't argue if the task is increasing >> - * or lowering its prio, so... >> - */ >> - if (!rq->dl.overloaded) >> - pull_dl_task(rq); >> - >> - /* >> - * If we now have a earlier deadline task than p, >> - * then reschedule, provided p is still on this >> - * runqueue. >> - */ >> - if (dl_time_before(rq->dl.earliest_dl.curr, p->dl.deadline) && >> - rq->curr == p) >> - resched_curr(rq); >> -#else >> - /* >> - * Again, we don't know if p has a earlier >> - * or later deadline, so let's blindly set a >> - * (maybe not needed) rescheduling point. >> - */ >> + /* >> + * This might be too much, but unfortunately >> + * we don't have the old deadline value, and >> + * we can't argue if the task is increasing >> + * or lowering its prio, so... >> + */ >> + if (!rq->dl.overloaded) >> + pull_dl_task(rq); >> + /* >> + * If we now have a earlier deadline task than p, >> + * then reschedule, provided p is still on this >> + * runqueue. >> + */ >> + if (dl_time_before(rq->dl.earliest_dl.curr, p->dl.deadline) && >> + rq->curr == p) >> resched_curr(rq); >> +#else >> + /* >> + * Again, we don't know if p has a earlier >> + * or later deadline, so let's blindly set a >> + * (maybe not needed) rescheduling point. >> + */ >> + resched_curr(rq); >> #endif /* CONFIG_SMP */ >> - } else >> - switched_to_dl(rq, p); >> } >> >> const struct sched_class dl_sched_class = { -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/