From patchwork Wed Dec 20 17:44:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joel Fernandes X-Patchwork-Id: 10126139 X-Patchwork-Delegate: rjw@sisk.pl Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id E94E06019C for ; Wed, 20 Dec 2017 17:44:42 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CE47A2841F for ; Wed, 20 Dec 2017 17:44:42 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C28E5287A4; Wed, 20 Dec 2017 17:44:42 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1CED72841F for ; Wed, 20 Dec 2017 17:44:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755804AbdLTRok (ORCPT ); Wed, 20 Dec 2017 12:44:40 -0500 Received: from mail-pl0-f68.google.com ([209.85.160.68]:45825 "EHLO mail-pl0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755620AbdLTRoj (ORCPT ); Wed, 20 Dec 2017 12:44:39 -0500 Received: by mail-pl0-f68.google.com with SMTP id o2so9418804plk.12 for ; Wed, 20 Dec 2017 09:44:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=a0hdNH5+BbA0rugBzzzfEoo1ZlcQqcEiJrxSPG08/No=; b=tcU/aoFqO1se/jqgDaepMZDfkocL1tvr92S8uIkxGr1y6JbTUwBSP2sLlXYPo626Gt /bWfYvWxzxsBqfwKfD2AT+I+/sDdkxJKuCISQZlBDXM5QrjQl4rSaBsx/aIM2o9c6p0w YdJd+q8Bofl7BWkWS8zzG4qMgrj/a/77WuLZtGHCIybQhSlzwOn8bf+ETL+gKpCGyRv5 Oj/KXjeZ6LwWPIUatJuCVD+RoBFC9kC+MUiAEHpkVFwfvigMTKPkrkCiqqggyy8TqAX2 8Cevskjubf2q2b8rmXs5MdHPlmW98Ciftlt2xNTNaHC4rw/1V2zwP3UQQhsi35redUMb TPMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=a0hdNH5+BbA0rugBzzzfEoo1ZlcQqcEiJrxSPG08/No=; b=WeScVlhh+xGQXFDLcge281QE4QGwmUA6CRmOJ9/INNE0Ysq9/U30LMB32XyFZMppat pbJ05UIFlluX5ex/baoPM5jADTD5wOFVFYLnjSnx6pPQEhG9RnVpyl+eHyAIebtgDf3y GNxBQ38fr6mVv14Bko2wDrWMasSMWBmo09NKVE735TIsWOThPOyNs5CMWZvbJaU/JabA P94xVMFkYU+Bfpsy10uM9LVHQniwcMpnwNMAMWzIU6KepL5S77UptrW+awxLRuA+esfK JuWaihfkvCr6V+DGUEG+gysTzM844KdTd8JvAHnWDvGq61ooY9PqAdo1CDyW8DoaVJtJ TRbw== X-Gm-Message-State: AKGB3mIZIA4k8qTvRRZ4NNnxAzd7HeV1cS4slkmvAwyK7ffSxA1p6jYX 4tE8scok2atBZhUt/Kh62sD4ztXPZnE= X-Google-Smtp-Source: ACJfBovPTlNjoJsVKR/zN0kMtIci/Lc7VNtOTiLLvtGKmHAkJp8rEp9INYnzBO11fn5MViFOQjsT0w== X-Received: by 10.159.252.76 with SMTP id t12mr7791849plz.323.1513791878381; Wed, 20 Dec 2017 09:44:38 -0800 (PST) Received: from [192.168.0.120] ([24.6.205.35]) by smtp.gmail.com with ESMTPSA id z19sm33801591pfh.39.2017.12.20.09.44.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 Dec 2017 09:44:37 -0800 (PST) Subject: Re: [PATCH RESEND] cpufreq: schedutil: Use idle_calls counter of the remote CPU To: "Rafael J. Wysocki" Cc: Peter Zijlstra , LKML , Srinivas Pandruvada , Len Brown , Viresh Kumar , Ingo Molnar , Juri Lelli , Patrick Bellasi , Chris Redpath , Steve Muckle , Dietmar Eggemann , Vincent Guittot , Morten Ramussen , Frederic Weisbecker , Thomas Gleixner , Saravana Kannan , Vikram Mulukutla , Rohit Jain , Atish Patra , Josef Bacik , Rik van Riel , EAS Dev , linux-pm@vger.kernel.org References: <20171219174712.13806-1-joelaf@google.com> <20171219184811.campbfjw3plynurs@hirez.programming.kicks-ass.net> <1680359.YAEeiLAcPD@aspire.rjw.lan> From: Joel Fernandes Message-ID: Date: Wed, 20 Dec 2017 09:44:35 -0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0 MIME-Version: 1.0 In-Reply-To: <1680359.YAEeiLAcPD@aspire.rjw.lan> Content-Language: en-US Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Hi Rafael, On 12/20/2017 06:45 AM, Rafael J. Wysocki wrote: > On Tuesday, December 19, 2017 8:32:09 PM CET Joel Fernandes wrote: >> On Tue, Dec 19, 2017 at 10:48 AM, Peter Zijlstra wrote: >>> On Tue, Dec 19, 2017 at 09:47:12AM -0800, Joel Fernandes wrote: >>>> Since the recent remote cpufreq callback work, its possible that a cpufreq >>>> update is triggered from a remote CPU. For single policies however, the current >>>> code uses the local CPU when trying to determine if the remote sg_cpu entered >>>> idle or is busy. This is incorrect. To remedy this, compare with the nohz tick >>>> idle_calls counter of the remote CPU. >>>> >>>> Acked-by: Viresh Kumar >>>> Signed-off-by: Joel Fernandes >>> >>> Acked-by: Peter Zijlstra (Intel) >> >> Sweet! > > OK, so any chance to get a Fixes: tag for the patch? Sure. Please find an inline patch below with all acks and fixes tag. thanks! ---8<--- From: Joel Fernandes Subject: [PATCH] cpufreq: schedutil: Use idle_calls counter of the remote CPU Since the recent remote cpufreq callback work, its possible that a cpufreq update is triggered from a remote CPU. For single policies however, the current code uses the local CPU when trying to determine if the remote sg_cpu entered idle or is busy. This is incorrect. To remedy this, compare with the nohz tick idle_calls counter of the remote CPU. Fixes: 674e75411fc2 ("sched: cpufreq: Allow remote cpufreq callbacks") Acked-by: Viresh Kumar Acked-by: Peter Zijlstra (Intel) Signed-off-by: Joel Fernandes --- include/linux/tick.h | 1 + kernel/sched/cpufreq_schedutil.c | 2 +- kernel/time/tick-sched.c | 13 +++++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/include/linux/tick.h b/include/linux/tick.h index f442d1a42025..7cc35921218e 100644 --- a/include/linux/tick.h +++ b/include/linux/tick.h @@ -119,6 +119,7 @@ extern void tick_nohz_idle_exit(void); extern void tick_nohz_irq_exit(void); extern ktime_t tick_nohz_get_sleep_length(void); extern unsigned long tick_nohz_get_idle_calls(void); +extern unsigned long tick_nohz_get_idle_calls_cpu(int cpu); extern u64 get_cpu_idle_time_us(int cpu, u64 *last_update_time); extern u64 get_cpu_iowait_time_us(int cpu, u64 *last_update_time); #else /* !CONFIG_NO_HZ_COMMON */ diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c index 2f52ec0f1539..d6717a3331a1 100644 --- a/kernel/sched/cpufreq_schedutil.c +++ b/kernel/sched/cpufreq_schedutil.c @@ -244,7 +244,7 @@ static void sugov_iowait_boost(struct sugov_cpu *sg_cpu, unsigned long *util, #ifdef CONFIG_NO_HZ_COMMON static bool sugov_cpu_is_busy(struct sugov_cpu *sg_cpu) { - unsigned long idle_calls = tick_nohz_get_idle_calls(); + unsigned long idle_calls = tick_nohz_get_idle_calls_cpu(sg_cpu->cpu); bool ret = idle_calls == sg_cpu->saved_idle_calls; sg_cpu->saved_idle_calls = idle_calls; diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 99578f06c8d4..77555faf6fbc 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c @@ -985,6 +985,19 @@ ktime_t tick_nohz_get_sleep_length(void) return ts->sleep_length; } +/** + * tick_nohz_get_idle_calls_cpu - return the current idle calls counter value + * for a particular CPU. + * + * Called from the schedutil frequency scaling governor in scheduler context. + */ +unsigned long tick_nohz_get_idle_calls_cpu(int cpu) +{ + struct tick_sched *ts = tick_get_tick_sched(cpu); + + return ts->idle_calls; +} + /** * tick_nohz_get_idle_calls - return the current idle calls counter value *