lkml.org 
[lkml]   [2016]   [Jan]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 1/4] sched: Don't account tickless CPU load on tick
    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.

    \
     
     \ /
      Last update: 2016-01-19 23:41    [W:7.545 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site