Re: [RFC PATCH 0/4] sched: Improve cpu load accounting with nohz

From: Byungchul Park
Date: Tue Jan 19 2016 - 19:49:08 EST


On Tue, Jan 19, 2016 at 02:04:57PM +0100, Peter Zijlstra wrote:
> On Fri, Jan 15, 2016 at 04:56:36PM +0000, Dietmar Eggemann wrote:
> > Couldn't we set tickless_load only in case:
> >
> > unsigned long tickless_load = (active && pending_updates > 1) ?
> > this_rq->cpu_load[0] : 0;
> >
> > Even though update_cpu_load_nohz() can call with pending_updates=1 and
> > active=1 but then we don't have to decay.
>
> decay_load_missed() has an early bail for !missed, which will be tickled
> with pending_updates == 1.

I think the way for decay_load_missed() to get an early bail for
*!load*, which the Dietmar's proposal did, is also good. And the
peterz's proposal avoiding an unnecessary "add" operation is also
good. Whatever..

>
> What I was thinking of doing however is:
>
> --- a/kernel/sched/fair.c
> +++ b/kernel/sched/fair.c
> @@ -4445,13 +4445,15 @@ static void __update_cpu_load(struct rq
>
> old_load = this_rq->cpu_load[i];
> old_load = decay_load_missed(old_load, pending_updates - 1, i);
> - old_load -= decay_load_missed(tickless_load, pending_updates - 1, i);
> - /*
> - * old_load can never be a negative value because a decayed
> - * tickless_load cannot be greater than the original
> - * tickless_load.
> - */
> - old_load += tickless_load;
> + if (tickless_load) {

And additionally, in this approach, why don't you do like,

if (tickless_load || pending_updates - 1)

> + old_load -= decay_load_missed(tickless_load, pending_updates - 1, i);
> + /*
> + * old_load can never be a negative value because a
> + * decayed tickless_load cannot be greater than the
> + * original tickless_load.
> + */
> + old_load += tickless_load;
> + }
> new_load = this_load;
> /*
> * Round up the averaging division if load is increasing. This
>
>
> Since regardless of the pending_updates, none of that makes sense if
> !tickless_load.

None of that makes sense if !(pending_updates - 1), too. In that case,
it becomes,

old_load -= tickless_load;
old_load += tickless_load;