lkml.org 
[lkml]   [2011]   [Jan]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
SubjectRe: Bug in scheduler when using rt_mutex
From
Date
On Thu, 2011-01-20 at 12:18 +0800, Yong Zhang wrote:
> On Wed, Jan 19, 2011 at 9:30 PM, Peter Zijlstra <peterz@infradead.org> wrote:
> > +static void switched_from_fair(struct rq *rq, struct task_struct *p)
> > +{
> > + struct sched_entity *se = &p->se;
> > + struct cfs_rq *cfs_rq = cfs_rq_of(se);
> > +
> > + /*
> > + * Ensure the task's vruntime is normalized, so that when its
> > + * switched back to the fair class the enqueue_entity(.flags=0) will
> > + * do the right thing.
> > + *
> > + * If it was on_rq, then the dequeue_entity(.flags=0) will already
> > + * have normalized the vruntime, if it was !on_rq, then only when
> > + * the task is sleeping will it still have non-normalized vruntime.
> > + */
> > + if (!se->on_rq && p->state != TASK_RUNNING)
> > + se->vruntime -= cfs_rq->min_vruntime;
>
> Here it's possible that se->vruntime is little than cfs_rq->min_vruntime.

The idea of normalizing is to preserve the offset, so the task can be
enqueued at this same offset, regardless of movement.

For sleepers, we can't usually do this until enqueue time, lest their
sleep time be unaccountable. Here, we have to normalize, so the task's
sleep stops from the vantage point of fair_class upon class exit, and
either resumes where it left off upon re-entry, or the task is enqueued
at it's last offset as usual for runnable tasks.

-Mike



\
 
 \ /
  Last update: 2011-01-20 06:01    [W:0.099 / U:8.252 seconds]
©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site