Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp940324ybp; Fri, 11 Oct 2019 06:46:35 -0700 (PDT) X-Google-Smtp-Source: APXvYqzogdxCixV8Z3OljxwKOVTfEPxRzBm8Lp9t+A0UgsNONG4bPab/Tfpq7236tndiezgADtTh X-Received: by 2002:a17:906:7212:: with SMTP id m18mr13872677ejk.88.1570801595176; Fri, 11 Oct 2019 06:46:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570801595; cv=none; d=google.com; s=arc-20160816; b=ZknymfAZ/6dOn15T4XaNAFLYyWLiR+mYDeO1tw5rPZjFvBncVy7bDYclHFUcpH1+xp DAHoQyi7rsUhpSpuDDCiMZi+ZTD5JseqSD76qEruz/0q2/dHDYFLYjLHAjkqUHPGdiy5 Ze6AD94VSfNjiaHGm6xsB7A7PSApDIoMaglgdQaYy/0Ne6QARpWA8nxe3dNBtCx6CutP p7wAhfAd6AgC2VpDmWBx9P4wrP98WkfmG6HrOwp2lPSk1Etil5bLhMMPzC5b2iWUHOaj Isz2934oLMUMe+oGYsoISSd/VDe+nOLc+OK7n9t2tbR780A75s8o3FDl1/f8wgJHM6AS uBNA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=606Mg5EeMm41lxKHctgAjP4L21tg2DsZ1c6mtjjJLNI=; b=rWjWDG3YSzNGv1Pw5+VfOpNjMo8dAt+lRaUQ4GOnPz4+hq2M2h9QRjrjdej/KYPNXJ effXElJYstI/3p5ho2SxjWRm9oZhIz6k2q5QdfcM5AjYJXL9epBcfWXDKKFl0y1W/2wM R3VvDD8thNejmMkaRTd6+wmFzVnpzbzXOKuwWN9Dhl/+Ml9z2UU4bI2/gYmDi6KbK9o3 Aj7CfimmS015Qx9rG8yu4QZm9KHyLS7MGtKWIJGQCDSiYAz3sba3HMICkGCKltTWwESf YAlKRwgM4vPHCKMnHx+JZlLePaC2ejJ+BNNv/3tnz8WoLj3yZh6D9avN6hQ/bgCbN+5X AVew== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e49si6385065edb.87.2019.10.11.06.46.11; Fri, 11 Oct 2019 06:46:35 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728691AbfJKNpn (ORCPT + 99 others); Fri, 11 Oct 2019 09:45:43 -0400 Received: from foss.arm.com ([217.140.110.172]:60928 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728684AbfJKNpm (ORCPT ); Fri, 11 Oct 2019 09:45:42 -0400 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 237C21597; Fri, 11 Oct 2019 06:45:42 -0700 (PDT) Received: from e107049-lin.arm.com (e107049-lin.cambridge.arm.com [10.1.195.43]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 733BF3F68E; Fri, 11 Oct 2019 06:45:40 -0700 (PDT) From: Douglas RAILLARD To: linux-kernel@vger.kernel.org Cc: linux-pm@vger.kernel.org, mingo@redhat.com, peterz@infradead.org, rjw@rjwysocki.net, viresh.kumar@linaro.org, juri.lelli@redhat.com, vincent.guittot@linaro.org, douglas.raillard@arm.com, dietmar.eggemann@arm.com, qperret@qperret.net, patrick.bellasi@matbug.net, dh.han@samsung.com Subject: [RFC PATCH v3 4/6] sched/cpufreq: Introduce sugov_cpu_ramp_boost Date: Fri, 11 Oct 2019 14:44:58 +0100 Message-Id: <20191011134500.235736-5-douglas.raillard@arm.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191011134500.235736-1-douglas.raillard@arm.com> References: <20191011134500.235736-1-douglas.raillard@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Use the utilization signals dynamic to detect when the utilization of a set of tasks starts increasing because of a change in tasks' behavior. This allows detecting when spending extra power for faster frequency ramp up response would be beneficial to the reactivity of the system. This ramp boost is computed as the difference util_avg-util_est_enqueued. This number somehow represents a lower bound of how much extra utilization this tasks is actually using, compared to our best current stable knowledge of it (which is util_est_enqueued). When the set of runnable tasks changes, the boost is disabled as the impact of blocked utilization on util_avg will make the delta with util_est_enqueued not very informative. Signed-off-by: Douglas RAILLARD --- kernel/sched/cpufreq_schedutil.c | 44 ++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c index aab8c0498dd1..c118f85d1f3d 100644 --- a/kernel/sched/cpufreq_schedutil.c +++ b/kernel/sched/cpufreq_schedutil.c @@ -61,6 +61,10 @@ struct sugov_cpu { unsigned long bw_dl; unsigned long max; + unsigned long ramp_boost; + unsigned long util_est_enqueued; + unsigned long util_avg; + /* The field below is for single-CPU policies only: */ #ifdef CONFIG_NO_HZ_COMMON unsigned long saved_idle_calls; @@ -181,6 +185,42 @@ static void sugov_deferred_update(struct sugov_policy *sg_policy, u64 time, } } +static unsigned long sugov_cpu_ramp_boost(struct sugov_cpu *sg_cpu) +{ + return READ_ONCE(sg_cpu->ramp_boost); +} + +static unsigned long sugov_cpu_ramp_boost_update(struct sugov_cpu *sg_cpu) +{ + struct rq *rq = cpu_rq(sg_cpu->cpu); + unsigned long util_est_enqueued; + unsigned long util_avg; + unsigned long boost = 0; + + util_est_enqueued = READ_ONCE(rq->cfs.avg.util_est.enqueued); + util_avg = READ_ONCE(rq->cfs.avg.util_avg); + + /* + * Boost when util_avg becomes higher than the previous stable + * knowledge of the enqueued tasks' set util, which is CPU's + * util_est_enqueued. + * + * We try to spot changes in the workload itself, so we want to + * avoid the noise of tasks being enqueued/dequeued. To do that, + * we only trigger boosting when the "amount of work' enqueued + * is stable. + */ + if (util_est_enqueued == sg_cpu->util_est_enqueued && + util_avg >= sg_cpu->util_avg && + util_avg > util_est_enqueued) + boost = util_avg - util_est_enqueued; + + sg_cpu->util_est_enqueued = util_est_enqueued; + sg_cpu->util_avg = util_avg; + WRITE_ONCE(sg_cpu->ramp_boost, boost); + return boost; +} + /** * get_next_freq - Compute a new frequency for a given cpufreq policy. * @sg_policy: schedutil policy object to compute the new frequency for. @@ -512,6 +552,7 @@ static void sugov_update_single(struct update_util_data *hook, u64 time, busy = !sg_policy->need_freq_update && sugov_cpu_is_busy(sg_cpu); util = sugov_get_util(sg_cpu); + sugov_cpu_ramp_boost_update(sg_cpu); max = sg_cpu->max; util = sugov_iowait_apply(sg_cpu, time, util, max); next_f = get_next_freq(sg_policy, util, max); @@ -552,6 +593,8 @@ static unsigned int sugov_next_freq_shared(struct sugov_cpu *sg_cpu, u64 time) unsigned long j_util, j_max; j_util = sugov_get_util(j_sg_cpu); + if (j_sg_cpu == sg_cpu) + sugov_cpu_ramp_boost_update(sg_cpu); j_max = j_sg_cpu->max; j_util = sugov_iowait_apply(j_sg_cpu, time, j_util, j_max); @@ -561,6 +604,7 @@ static unsigned int sugov_next_freq_shared(struct sugov_cpu *sg_cpu, u64 time) } } + return get_next_freq(sg_policy, util, max); } -- 2.23.0