Messages in this thread | | | Date | Wed, 23 Sep 2009 22:40:27 +1000 | From | Peter Williams <> | Subject | Re: [PATCH] sched: Make sure task has correct sched_class after policy change |
| |
On 23/09/09 16:32, Peter Zijlstra wrote: > On Wed, 2009-09-23 at 02:21 +0000, Peter Williams wrote: >> From the code in rt_mutex_setprio(), it is evident that the intention >> is that task's with a RT 'prio' value as a consequence of receiving a PI >> boost also have their 'sched_class' field set to '&rt_sched_class'. >> However, the code in __setscheduler() could result in this intention >> being frustrated. >> >> This patch fixes this problem. >> >> Signed-off-by: Peter Williams<pwil3058@bigpond.net.au> > > I think you're right, but the problem seems to be that it sets > sched_class based on policy, which seems fragile in the face of PI. > > How about the alternative below?
Yes, that's what I meant to do i.e. use p->prio in the if condition. I sent a second patch with a fix but your solution is neater :-).
> > --- > kernel/sched.c | 17 ++++------------- > 1 files changed, 4 insertions(+), 13 deletions(-) > > diff --git a/kernel/sched.c b/kernel/sched.c > index 91843ba..753a52c 100644 > --- a/kernel/sched.c > +++ b/kernel/sched.c > @@ -6129,23 +6129,14 @@ __setscheduler(struct rq *rq, struct task_struct *p, int policy, int prio) > { > BUG_ON(p->se.on_rq); > > - p->policy = policy; > - switch (p->policy) { > - case SCHED_NORMAL: > - case SCHED_BATCH: > - case SCHED_IDLE: > - p->sched_class =&fair_sched_class; > - break; > - case SCHED_FIFO: > - case SCHED_RR: > - p->sched_class =&rt_sched_class; > - break; > - } > - > p->rt_priority = prio; > p->normal_prio = normal_prio(p); > /* we are holding p->pi_lock already */ > p->prio = rt_mutex_getprio(p); > + if (rt_prio(p->prio)) > + p->sched_class =&rt_sched_class; > + else > + p->sched_class =&fair_sched_class; > set_load_weight(p); > }
Peter -- Peter Williams pwil3058@bigpond.net.au
"Learning, n. The kind of ignorance distinguishing the studious." -- Ambrose Bierce
| |