Re: [PATCH 1/4] sched: Don't account tickless CPU load on tick

From: Byungchul Park
Date: Wed Jan 20 2016 - 00:44:05 EST


On Tue, Jan 19, 2016 at 11:33:22PM +0100, Frederic Weisbecker wrote:
> On Tue, Jan 19, 2016 at 07:56:47PM +0100, Peter Zijlstra wrote:
> > On Tue, Jan 19, 2016 at 05:22:11PM +0100, Frederic Weisbecker wrote:
> > > On Tue, Jan 19, 2016 at 02:08:57PM +0100, Peter Zijlstra wrote:
> > > > On Wed, Jan 13, 2016 at 05:01:28PM +0100, Frederic Weisbecker wrote:
> > > > > The cpu load update on tick doesn't care about dynticks and as such is
> > > > > buggy when occuring on nohz ticks (including idle ticks) as it resets
> > > > > the jiffies snapshot that was recorded on nohz entry. We eventually
> > > > > ignore the potentially long tickless load that happened before the
> > > > > tick.
> > > >
> > > > I don't get it, how can we call scheduler_tick() while
> > > > tick_nohz_tick_stopped() ?
> > >
> > > tick_nohz_tick_stopped() (which is ts->tick_stopped == 1) doesn't actually
> > > mean that the tick is really stopped. It just means that the tick fires only
> > > when it's really needed (timer list expired, RCU stuff, irq_work, ...).
> >
> > That's insane and broken. Fix _that_.
> >
> > If RCU, irq_work etc.. needs the tick, do not stop the tick.
>
> This is not the first time we have this conversation :-)
>
> RCU/irq_work/foo_needs_tick() are treated just like any timer that expire in one
> tick, although RCU is some more tunable there.
>
> And timers that expire in 1 jiffy can be treated in two ways:
>
> * If the tick is still periodic (ts->tick_stopped = 0), we don't stop the
> tick: we don't enter dynticks mode.
>
> * If the tick is already stopped (or rather in dynticks mode to be more exact:
> ts->tick_stopped == 1) we just program the tick one jiffy ahead. This is
> an optimization and a simplification, if we were to restart the tick everytime
> we see a tick one jiffy ahead in the middle of a dynticks frame, we would have
> to perform all the accounting in tick_nohz_idle_exit() as well, including
> update_cpu_load_nohz() that locks rq->lock. Having a bunch of jiffies subsequently
> ticking in the middle of a dynticks frame is a common and frequent scenario and
> removing that optimization would have a bad visible impact.
>
> Certainly the issue here is that "tick_stopped" can be misunderstood. ts->dynticks_active
> would be better but we already have ts->nohz_active which reflects something very
> different. I guess we need a cascading rename.
>
> Anyway whether the next tick is one jiffy ahead or more doesn't really matter here.
> The issue is that ticks can fire while dynticks-idle or dyntick-buzy and
> update_cpu_load_active() treats them in a broken way.

It looks very tricky. I have a question. Do we have to call the
scheduler_tick() even while the tick is stopped? IMHO, it seems to be
ok even if we won't call it while the tick is stopped. Wrong? I mean,

---

diff --git a/kernel/time/timer.c b/kernel/time/timer.c
index bbc5d11..774adc2 100644
--- a/kernel/time/timer.c
+++ b/kernel/time/timer.c
@@ -1422,7 +1422,8 @@ void update_process_times(int user_tick)
if (in_irq())
irq_work_tick();
#endif
- scheduler_tick();
+ if (!tick_nohz_tick_stopped())
+ scheduler_tick();
run_posix_cpu_timers(p);
}

---

hm ???