Re: [PATCH 2/2] sched: adjust SCHED_IDLE interactions

From: Peter Zijlstra
Date: Mon Aug 16 2021 - 08:52:38 EST


On Wed, Aug 11, 2021 at 03:31:49PM +0200, Vincent Guittot wrote:
> On Fri, 30 Jul 2021 at 04:00, Josh Don <joshdon@xxxxxxxxxx> wrote:


> > @@ -4216,7 +4228,15 @@ place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int initial)
> > if (sched_feat(GENTLE_FAIR_SLEEPERS))
> > thresh >>= 1;
> >
> > - vruntime -= thresh;
> > + /*
> > + * Don't give sleep credit to a SCHED_IDLE entity if we're
> > + * placing it onto a cfs_rq with non SCHED_IDLE entities.
> > + */
> > + if (!se_is_idle(se) ||
> > + cfs_rq->h_nr_running == cfs_rq->idle_h_nr_running)

I really dislike that second clause, either never do this for idle or
always, but not sometimes when the planets are aligned just right.

> Can't this condition above create unfairness between idle entities ?
> idle thread 1 wake up while normal thread is running
> normal thread thread sleeps immediately after
> idle thread 2 wakes up just after and gets some credits compared to the 1st one.

No. Strictly speaking cfs is unfair here. But it's a really tricky case.

Consider a task that is running 50% competing against a task that's
running 100%. What's fair in that situation, a 50/50 split, or a 25/75
split? What if that 50% is 50% of a minute?

What we do here is fudge the vruntime such that we end up with a 50/50
split provided the period over which it blocks is less than a slice.
After that it gradually converges to the 'expected' 25/75 split that
results from strict runnable competition.

By not letting idle tasks participate in this, we avoid idle tasks
'stealing' the !runnable time and they revert back to strict runnable
competition only.

> > + vruntime -= thresh;
> > + else
> > + vruntime += 1;
> > }
> >
> > /* ensure we never gain time by being placed backwards. */
> > --
> > 2.32.0.554.ge1b32706d8-goog
> >