2020-01-06 22:19:48

by Frederic Weisbecker

[permalink] [raw]
Subject: Re: [PATCH 1/4] tick/sched: Forward timer even in nohz mode

On Mon, Dec 16, 2019 at 06:22:22PM -0500, Scott Wood wrote:
> Currently when exiting nohz, the expiry will be forwarded as if we
> had just run the timer. If we re-enter nohz before this new expiry,
> and exit after, this forwarding will happen again. If this load pattern
> recurs the tick can be indefinitely postponed.

I must be missing something but I don't see why that would be a problem.
Indeed the tick can be indefinitely postponed but that's as long as it's
not needed. As soon as it's needed (timer callback expired, RCU, ...), the
tick will be retained and it will eventually fire.

> @@ -642,9 +642,6 @@ static void tick_nohz_restart(struct tick_sched *ts, ktime_t now)
> hrtimer_cancel(&ts->sched_timer);
> hrtimer_set_expires(&ts->sched_timer, ts->last_tick);
>
> - /* Forward the time to expire in the future */
> - hrtimer_forward(&ts->sched_timer, now, tick_period);
> -

By doing that, you may program a past tick and thus add a useless interrupt
at each idle exit.

Thanks.


2020-01-08 23:19:33

by Crystal Wood

[permalink] [raw]
Subject: Re: [PATCH 1/4] tick/sched: Forward timer even in nohz mode

On Mon, 2020-01-06 at 23:18 +0100, Frederic Weisbecker wrote:
> On Mon, Dec 16, 2019 at 06:22:22PM -0500, Scott Wood wrote:
> > Currently when exiting nohz, the expiry will be forwarded as if we
> > had just run the timer. If we re-enter nohz before this new expiry,
> > and exit after, this forwarding will happen again. If this load pattern
> > recurs the tick can be indefinitely postponed.
>
> I must be missing something but I don't see why that would be a problem.
> Indeed the tick can be indefinitely postponed but that's as long as it's
> not needed. As soon as it's needed (timer callback expired, RCU, ...), the
> tick will be retained and it will eventually fire.

My main concern was the loadavg recording, which does not prevent entering
nohz. However, if we're going into and out of nohz then the call to
calc_load_nohz_start() in tick_nohz_stop_tick() should take care of it, so I
guess we only need patches 3 and 4, if there's nothing else in the tick that
doesn't either prevent nohz or get handled during the transition
(psi_task_tick?).

-Scott