Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757948AbcDHJmN (ORCPT ); Fri, 8 Apr 2016 05:42:13 -0400 Received: from bombadil.infradead.org ([198.137.202.9]:43528 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752047AbcDHJmL (ORCPT ); Fri, 8 Apr 2016 05:42:11 -0400 Date: Fri, 8 Apr 2016 11:41:54 +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/3] sched: Correctly handle nohz ticks cpu load accounting Message-ID: <20160408094153.GL3448@twins.programming.kicks-ass.net> References: <1460077633-23431-1-git-send-email-fweisbec@gmail.com> <1460077633-23431-3-git-send-email-fweisbec@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460077633-23431-3-git-send-email-fweisbec@gmail.com> User-Agent: Mutt/1.5.21 (2012-12-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1310 Lines: 40 On Fri, Apr 08, 2016 at 03:07:12AM +0200, Frederic Weisbecker wrote: > +void cpu_load_update_nohz_start(void) > { > struct rq *this_rq = this_rq(); > + > + /* > + * This is all lockless but should be fine. If weighted_cpuload changes > + * concurrently we'll exit nohz. And cpu_load write can race with > + * cpu_load_update_idle() but both updater would be writing the same. > + */ > + this_rq->cpu_load[0] = weighted_cpuload(cpu_of(this_rq)); > +} There is more to this; this also updates ->cpu_load[0] at possibly much higher frequency than we've done before, while not updating the other ->cpu_load[] members. Now, I'm not sure we care, but it is a bit odd. > +/* > + * Account the tickless load in the end of a nohz frame. > + */ > +void cpu_load_update_nohz_stop(void) > +{ > unsigned long curr_jiffies = READ_ONCE(jiffies); > + struct rq *this_rq = this_rq(); > + unsigned long load; > > if (curr_jiffies == this_rq->last_load_update_tick) > return; > > + load = weighted_cpuload(cpu_of(this_rq)); > raw_spin_lock(&this_rq->lock); > + cpu_load_update_nohz(this_rq, curr_jiffies, load); > raw_spin_unlock(&this_rq->lock); > } And this makes us take rq->lock when waking from nohz; a bit unfortunate. Do we really need this though? Will not a tick be forthcoming real-soon-now?