Re: [PATCH 1/4] sched: Don't account tickless CPU load on tick
From: Frederic Weisbecker
Date: Thu Jan 28 2016 - 11:01:38 EST
On Wed, Jan 20, 2016 at 07:26:14PM +0900, Byungchul Park wrote:
> On Wed, Jan 20, 2016 at 02:43:35PM +0900, Byungchul Park wrote:
> > 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,
> The reason why I asked is that, scheduler_tick() looks to be a
> scheduler callback for *periodic tick*. IMHO, we need to choose one of
> these two.
> 1) Make scheduler_tick() can handle it, not only for the periodic tick
> but also for the tick-like event during tick-stopped. But I am not sure
> if this is the right way.
> 2) Distinguish the periodic tick from the tick-like event by which we
> can handle rcu callback, irq work and so on, so that the periodic tick
> handler only handles periodic stuff either locally or remotely, while
> the tick-like event handler only does its purpose. I think this is
> better, I am sure though.
So lets check all the things we call on scheduler_tick():
_ sched_clock_tick(): maybe it doesn't need to be called when idle. I'm not sure.
Some code in idle (timers, irqs, ...) might need to call sched_clock().
_ update_rq_clock(), task_tick(): task_tick is empty for idle class, so we probably
don't need an updated rq either.
_ update_cpu_load_active(): I was about to fix the issue properly and make it account
correctly on idle ticks but we might as well want to spare it.
_ calc_global_load_tick(): no idea
_ perf_event_task_tick(): needed, some freq CPU events can trigger in idle and need
_ trigger_load_balance(): maybe needed, I see it triggers the softirq after some
rebalance delay, regardless of the current CPU idleness.
_ rq_last_tick_reset(): not needed in idle
Here we are.
> > ---
> > 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 ???