Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752110AbcDBHRK (ORCPT ); Sat, 2 Apr 2016 03:17:10 -0400 Received: from casper.infradead.org ([85.118.1.10]:35435 "EHLO casper.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751231AbcDBHRI (ORCPT ); Sat, 2 Apr 2016 03:17:08 -0400 Date: Sat, 2 Apr 2016 09:15:20 +0200 From: Peter Zijlstra To: Frederic Weisbecker Cc: LKML , Byungchul Park , Chris Metcalf , Thomas Gleixner , Luiz Capitulino , Christoph Lameter , "Paul E . McKenney" , Mike Galbraith , Rik van Riel , Ingo Molnar Subject: Re: [PATCH 2/4] sched: Correctly handle nohz ticks cpu load accounting Message-ID: <20160402071520.GE2906@worktop> References: <1459516987-15745-1-git-send-email-fweisbec@gmail.com> <1459516987-15745-3-git-send-email-fweisbec@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459516987-15745-3-git-send-email-fweisbec@gmail.com> User-Agent: Mutt/1.5.22.1 (2013-10-16) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1334 Lines: 36 On Fri, Apr 01, 2016 at 03:23:05PM +0200, Frederic Weisbecker wrote: > Ticks can happen in the middle of a nohz frame and I'm still miffed with that.. And this changelog doesn't even explain why and how. > cpu_load_update_active() doesn't handle these correctly. It forgets the > whole previous tickless load and just records the current tick, ignoring > potentially long idle periods. > > In order to solve this, record the load on nohz frame entry so we know > what to record in case of nohz interruptions, then use this recorded load > to account the tickless load on nohz ticks and nohz frame end. > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c > index f33764d..394f008 100644 > --- a/kernel/sched/fair.c > +++ b/kernel/sched/fair.c > @@ -4527,9 +4527,9 @@ decay_load_missed(unsigned long load, unsigned long missed_updates, int idx) > * term. See the @active paramter. ^^^^^^^^^^^^^^ What active parameter... you need to update that comment. > */ > static void __cpu_load_update(struct rq *this_rq, unsigned long this_load, > - unsigned long pending_updates, int active) > + unsigned long pending_updates) > { > - unsigned long tickless_load = active ? this_rq->cpu_load[0] : 0; > + unsigned long tickless_load = this_rq->cpu_load[0]; > int i, scale; > > this_rq->nr_load_updates++;