Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp2844950pxu; Mon, 14 Dec 2020 12:15:41 -0800 (PST) X-Google-Smtp-Source: ABdhPJwi5JoQA3OIvrPoiGRGr1o87tShOO605NIto56DaSNSDW7Z30tVovK6nBIFTjKVr1ybzOYG X-Received: by 2002:a17:907:2061:: with SMTP id qp1mr23360836ejb.222.1607976941182; Mon, 14 Dec 2020 12:15:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1607976941; cv=none; d=google.com; s=arc-20160816; b=VL3dK9dXa2xzE/8PNHHpnloWGitP/TkTuqGhlmdEiOty5XXniGZ5umOBQS38Tvb279 Nzo8He99AduhjnqjEnUx0dJ57sw6Lyq8GCZKhGhBLdAynpuUeDDUYlqgbPIqQanNGsYo cozQmJnCqKOQuRLhmC/C7HRvW5qwDdD46LpdgtH7jEkpEYWIYW4PAuJvVDCOW6I+7zJC tizTb5R2TQQcqHnkK0WAWA2HA7gf3N2rZPWCFurVSWuD55MBGA5z8Qs0qwtvIy74vRGx 0A6Vpu0WIZ6EWlfE6O6dDmV6pGeZlZbewdt3OrSkTTYqm03yxyS7+9WvmxIfR6sjVyrb J4bg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=2i1pmVEEA+pakYZGiqJXDnVNLfLzif5vEfYLBySqqhg=; b=JPSK+CqjcUNqNE0cr4ntFvUCLtlx9MZ7ovYj4Y0X1gAZAY25X8w40CPCkKAGZ5yh99 XZiulBkp2MtGZ1SjddW+3Kdi03EezKSPaKMr7ioDfT9SEHTDVz2A7+c1BFDCBsk/x8cq /taZFj0MNq/kQkfolTVYSzJ5ePgfvOL25CD2lOpvWf34e4Sij1vf4gbmHY3+K/dl1qlR pu1aO6j2enX70cLdju/vZr7BAVRRdAqM52X7KqCpInTDvHjB0CAD4t1l3npy0LCE3C+E ajhYdGAsCSMOGqcR13il6m1BjIdJ5rSHdPRk42hTSnegrwLWJBfD9jgEdPiDVTaaTk1v HuIQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id j1si11187124edn.611.2020.12.14.12.15.17; Mon, 14 Dec 2020 12:15:41 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2503039AbgLNUL2 (ORCPT + 99 others); Mon, 14 Dec 2020 15:11:28 -0500 Received: from cloudserver094114.home.pl ([79.96.170.134]:55000 "EHLO cloudserver094114.home.pl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2502853AbgLNUKn (ORCPT ); Mon, 14 Dec 2020 15:10:43 -0500 Received: from 89-77-60-66.dynamic.chello.pl (89.77.60.66) (HELO kreacher.localnet) by serwer1319399.home.pl (79.96.170.134) with SMTP (IdeaSmtpServer 0.83.530) id ed48d699427488a5; Mon, 14 Dec 2020 21:09:40 +0100 From: "Rafael J. Wysocki" To: Linux PM Cc: LKML , Viresh Kumar , Srinivas Pandruvada , Peter Zijlstra , Doug Smythies , Giovanni Gherdovich Subject: [PATCH v2 1/3] cpufreq: schedutil: Add util to struct sg_cpu Date: Mon, 14 Dec 2020 21:04:11 +0100 Message-ID: <12570124.nDbfvnBycr@kreacher> In-Reply-To: <3827230.0GnL3RTcl1@kreacher> References: <20360841.iInq7taT2Z@kreacher> <3827230.0GnL3RTcl1@kreacher> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Rafael J. Wysocki Instead of passing util and max between functions while computing the utilization and capacity, store the former in struct sg_cpu (along with the latter and bw_dl). This will allow the current utilization value to be compared with the one obtained previously (which is requisite for some code changes to follow this one), but also it causes the code to look slightly more consistent and cleaner. Signed-off-by: Rafael J. Wysocki Acked-by: Viresh Kumar --- v1 -> v2: * Added the tag from Viresh. --- kernel/sched/cpufreq_schedutil.c | 42 ++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 22 deletions(-) Index: linux-pm/kernel/sched/cpufreq_schedutil.c =================================================================== --- linux-pm.orig/kernel/sched/cpufreq_schedutil.c +++ linux-pm/kernel/sched/cpufreq_schedutil.c @@ -53,6 +53,7 @@ struct sugov_cpu { unsigned int iowait_boost; u64 last_update; + unsigned long util; unsigned long bw_dl; unsigned long max; @@ -276,16 +277,15 @@ unsigned long schedutil_cpu_util(int cpu return min(max, util); } -static unsigned long sugov_get_util(struct sugov_cpu *sg_cpu) +static void sugov_get_util(struct sugov_cpu *sg_cpu) { struct rq *rq = cpu_rq(sg_cpu->cpu); - unsigned long util = cpu_util_cfs(rq); unsigned long max = arch_scale_cpu_capacity(sg_cpu->cpu); sg_cpu->max = max; sg_cpu->bw_dl = cpu_bw_dl(rq); - - return schedutil_cpu_util(sg_cpu->cpu, util, max, FREQUENCY_UTIL, NULL); + sg_cpu->util = schedutil_cpu_util(sg_cpu->cpu, cpu_util_cfs(rq), max, + FREQUENCY_UTIL, NULL); } /** @@ -362,8 +362,6 @@ static void sugov_iowait_boost(struct su * sugov_iowait_apply() - Apply the IO boost to a CPU. * @sg_cpu: the sugov data for the cpu to boost * @time: the update time from the caller - * @util: the utilization to (eventually) boost - * @max: the maximum value the utilization can be boosted to * * A CPU running a task which woken up after an IO operation can have its * utilization boosted to speed up the completion of those IO operations. @@ -377,18 +375,17 @@ static void sugov_iowait_boost(struct su * This mechanism is designed to boost high frequently IO waiting tasks, while * being more conservative on tasks which does sporadic IO operations. */ -static unsigned long sugov_iowait_apply(struct sugov_cpu *sg_cpu, u64 time, - unsigned long util, unsigned long max) +static void sugov_iowait_apply(struct sugov_cpu *sg_cpu, u64 time) { unsigned long boost; /* No boost currently required */ if (!sg_cpu->iowait_boost) - return util; + return; /* Reset boost if the CPU appears to have been idle enough */ if (sugov_iowait_reset(sg_cpu, time, false)) - return util; + return; if (!sg_cpu->iowait_boost_pending) { /* @@ -397,18 +394,19 @@ static unsigned long sugov_iowait_apply( sg_cpu->iowait_boost >>= 1; if (sg_cpu->iowait_boost < IOWAIT_BOOST_MIN) { sg_cpu->iowait_boost = 0; - return util; + return; } } sg_cpu->iowait_boost_pending = false; /* - * @util is already in capacity scale; convert iowait_boost + * sg_cpu->util is already in capacity scale; convert iowait_boost * into the same scale so we can compare. */ - boost = (sg_cpu->iowait_boost * max) >> SCHED_CAPACITY_SHIFT; - return max(boost, util); + boost = (sg_cpu->iowait_boost * sg_cpu->max) >> SCHED_CAPACITY_SHIFT; + if (sg_cpu->util < boost) + sg_cpu->util = boost; } #ifdef CONFIG_NO_HZ_COMMON @@ -439,9 +437,8 @@ static void sugov_update_single(struct u { struct sugov_cpu *sg_cpu = container_of(hook, struct sugov_cpu, update_util); struct sugov_policy *sg_policy = sg_cpu->sg_policy; - unsigned long util, max; - unsigned int next_f; unsigned int cached_freq = sg_policy->cached_raw_freq; + unsigned int next_f; sugov_iowait_boost(sg_cpu, time, flags); sg_cpu->last_update = time; @@ -451,10 +448,10 @@ static void sugov_update_single(struct u if (!sugov_should_update_freq(sg_policy, time)) return; - util = sugov_get_util(sg_cpu); - max = sg_cpu->max; - util = sugov_iowait_apply(sg_cpu, time, util, max); - next_f = get_next_freq(sg_policy, util, max); + sugov_get_util(sg_cpu); + sugov_iowait_apply(sg_cpu, time); + + next_f = get_next_freq(sg_policy, sg_cpu->util, sg_cpu->max); /* * Do not reduce the frequency if the CPU has not been idle * recently, as the reduction is likely to be premature then. @@ -491,9 +488,10 @@ static unsigned int sugov_next_freq_shar struct sugov_cpu *j_sg_cpu = &per_cpu(sugov_cpu, j); unsigned long j_util, j_max; - j_util = sugov_get_util(j_sg_cpu); + 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; - j_util = sugov_iowait_apply(j_sg_cpu, time, j_util, j_max); if (j_util * max > j_max * util) { util = j_util;