From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933603AbcATFoD (ORCPT ); Wed, 20 Jan 2016 00:44:03 -0500 Received: from LGEAMRELO12.lge.com ([156.147.23.52]:57342 "EHLO lgeamrelo12.lge.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933425AbcATFnv (ORCPT ); Wed, 20 Jan 2016 00:43:51 -0500 X-Original-SENDERIP: 156.147.1.127 X-Original-MAILFROM: byungchul.park@lge.com X-Original-SENDERIP: 10.177.222.33 X-Original-MAILFROM: byungchul.park@lge.com Date: Wed, 20 Jan 2016 14:43:35 +0900 From: Byungchul Park To: Frederic Weisbecker Cc: Peter Zijlstra , LKML , Chris Metcalf , Thomas Gleixner , Luiz Capitulino , Christoph Lameter , "Paul E . McKenney" , Mike Galbraith , Rik van Riel Subject: Re: [PATCH 1/4] sched: Don't account tickless CPU load on tick Message-ID: <20160120054335.GE9882@X58A-UD3R> References: <1452700891-21807-1-git-send-email-fweisbec@gmail.com> <1452700891-21807-2-git-send-email-fweisbec@gmail.com> <20160119130857.GC6344@twins.programming.kicks-ass.net> <20160119162210.GA5317@lerouge> <20160119185647.GA6357@twins.programming.kicks-ass.net> <20160119223320.GD5317@lerouge> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160119223320.GD5317@lerouge> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 ???