Received: by 2002:a05:6358:d09b:b0:dc:cd0c:909e with SMTP id jc27csp584476rwb; Wed, 7 Dec 2022 02:24:40 -0800 (PST) X-Google-Smtp-Source: AA0mqf7Gfr1Jk+0Di4/DB3zCHBCt5o0pcKdyQ7KkHpobMuEI3+ojxHAAmoFkgdh7BPiys8GqwPtU X-Received: by 2002:aa7:9acc:0:b0:577:81cb:4761 with SMTP id x12-20020aa79acc000000b0057781cb4761mr2384420pfp.46.1670408680594; Wed, 07 Dec 2022 02:24:40 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1670408680; cv=none; d=google.com; s=arc-20160816; b=j7GsuP5rts3deSgkVTXoXhUpBwVE82JKB3Qh5h15sjMclJ4rfflDsscFi62eqoUe53 VVV1Xj66+9X7PfqSUNOUffvy1xX+gduEWTNZKCLwlmrHIc3QGhsQr9tsDpzUgqbg+SM8 lg1Pkaa1zIYEhc10YZCjrylg+i/ikHZUIrStloVCQ/pWplArlJezFTKEFu6TjQ05UvfW Z19xMMPxREzfWYdtViV0AFIxyvwf1NctC0BPZVy1lv8ejW7aQwlEz/6bOLp8T6BP/PZD iEwrwbZCc7vdB5VUZz87lIblOI4peZ62xMz4GwOf2Ccm95T0MAnegm22eZV8Y4ajrMoD xSRg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from; bh=of4EF5HOby1WjanvafN7EK9H8PQAF18boJlQ0vJ7PAI=; b=TU4mVflM4K2T2z7r5uZiJpZ9kZgJl1Dfh6kIyk7Ku+zRPO5AfRCV6MGCyrN8Z+M8KL g51N/mivARoHl99zstzZvzC1JdQ9DSCjCfXRw43SJ6Wu+UDJaxEV9YCw9QplPGLc3iT9 w2MDDzdHFX1RwLK0hzYi6RMoD/EHlK6cRrqGaWny8fSd2Rro/DG5ar92Ymhf4k4BLNW3 PI7vGLeAPRL7BAVCHHdzdE4gG3XZz7ESlWa2WRN/PY5gcLhiSvr7iSr+XXK7zbZeRTGT iA9ePg6RbVqKmY7PrPn/F8j2kKplT2GrbdWI55DyT4YBSP/DeTFtPq9jJ03EoFl+rILX 7Hug== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id c19-20020a056a000ad300b0056e770672c1si22061618pfl.305.2022.12.07.02.24.30; Wed, 07 Dec 2022 02:24:40 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230295AbiLGKRp (ORCPT + 76 others); Wed, 7 Dec 2022 05:17:45 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45766 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230383AbiLGKR3 (ORCPT ); Wed, 7 Dec 2022 05:17:29 -0500 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id A456F419A8; Wed, 7 Dec 2022 02:17:28 -0800 (PST) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 22D4DED1; Wed, 7 Dec 2022 02:17:35 -0800 (PST) Received: from e123648.arm.com (unknown [10.57.7.234]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 2A6D63F73B; Wed, 7 Dec 2022 02:17:25 -0800 (PST) From: Lukasz Luba To: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, rafael@kernel.org Cc: lukasz.luba@arm.com, viresh.kumar@linaro.org, dietmar.eggemann@arm.com, vincent.guittot@linaro.org, saravanak@google.com, wusamuel@google.com, isaacmanjarres@google.com, kernel-team@android.com, juri.lelli@redhat.com, peterz@infradead.org, mingo@redhat.com, rostedt@goodmis.org, bsegall@google.com, mgorman@suse.de Subject: [PATCH v2 2/2] cpufreq: schedutil: Optimize operations with single max CPU capacity Date: Wed, 7 Dec 2022 10:17:05 +0000 Message-Id: <20221207101705.9460-3-lukasz.luba@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20221207101705.9460-1-lukasz.luba@arm.com> References: <20221207101705.9460-1-lukasz.luba@arm.com> X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The max CPU capacity is the same for all CPUs sharing frequency domain and thus 'policy' object. There is a way to avoid heavy operations in a loop for each CPU by leveraging this knowledge. Thus, simplify the looping code in the sugov_next_freq_shared() and drop heavy multiplications. Instead, use simple max() to get the highest utilization from these CPUs. This is useful for platforms with many (4 or 6) little CPUs. The max CPU capacity must be fetched every time we are called, due to difficulties during the policy setup, where we are not able to get the normalized CPU capacity at the right time. The stored value in sugov_policy::max is also than used in sugov_iowait_apply() to calculate the right boost. Thus, that field is useful to have in that sugov_policy struct. Signed-off-by: Lukasz Luba --- kernel/sched/cpufreq_schedutil.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c index c19d6de67b7a..f9881f3d9488 100644 --- a/kernel/sched/cpufreq_schedutil.c +++ b/kernel/sched/cpufreq_schedutil.c @@ -158,10 +158,8 @@ static unsigned int get_next_freq(struct sugov_policy *sg_policy, static void sugov_get_util(struct sugov_cpu *sg_cpu) { - struct sugov_policy *sg_policy = sg_cpu->sg_policy; struct rq *rq = cpu_rq(sg_cpu->cpu); - sg_policy->max = arch_scale_cpu_capacity(sg_cpu->cpu); sg_cpu->bw_dl = cpu_bw_dl(rq); sg_cpu->util = effective_cpu_util(sg_cpu->cpu, cpu_util_cfs(sg_cpu->cpu), FREQUENCY_UTIL, NULL); @@ -317,6 +315,8 @@ static inline void ignore_dl_rate_limit(struct sugov_cpu *sg_cpu) static inline bool sugov_update_single_common(struct sugov_cpu *sg_cpu, u64 time, unsigned int flags) { + struct sugov_policy *sg_policy = sg_cpu->sg_policy; + sugov_iowait_boost(sg_cpu, time, flags); sg_cpu->last_update = time; @@ -325,6 +325,9 @@ static inline bool sugov_update_single_common(struct sugov_cpu *sg_cpu, if (!sugov_should_update_freq(sg_cpu->sg_policy, time)) return false; + /* Fetch the latest CPU capcity to avoid stale data */ + sg_policy->max = arch_scale_cpu_capacity(sg_cpu->cpu); + sugov_get_util(sg_cpu); sugov_iowait_apply(sg_cpu, time); @@ -414,25 +417,22 @@ static unsigned int sugov_next_freq_shared(struct sugov_cpu *sg_cpu, u64 time) { struct sugov_policy *sg_policy = sg_cpu->sg_policy; struct cpufreq_policy *policy = sg_policy->policy; - unsigned long util = 0, max = 1; + unsigned long util = 0; unsigned int j; + /* Fetch the latest CPU capcity to avoid stale data */ + sg_policy->max = arch_scale_cpu_capacity(sg_cpu->cpu); + for_each_cpu(j, policy->cpus) { struct sugov_cpu *j_sg_cpu = &per_cpu(sugov_cpu, j); - unsigned long j_util, j_max; sugov_get_util(j_sg_cpu); sugov_iowait_apply(j_sg_cpu, time); - j_util = j_sg_cpu->util; - j_max = j_sg_cpu->max; - if (j_util * max > j_max * util) { - util = j_util; - max = j_max; - } + util = max(j_sg_cpu->util, util); } - return get_next_freq(sg_policy, util, max); + return get_next_freq(sg_policy, util, sg_policy->max); } static void -- 2.17.1