Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp2074476imm; Mon, 16 Jul 2018 01:30:59 -0700 (PDT) X-Google-Smtp-Source: AAOMgpe+9Du+mckSMd5LFsfRSpfRLlD64E3GlfbMpuPqXITfbmOM2kZp9Qvv8/Qcu+xDcJXXwiVo X-Received: by 2002:a63:6604:: with SMTP id a4-v6mr14485906pgc.404.1531729859828; Mon, 16 Jul 2018 01:30:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1531729859; cv=none; d=google.com; s=arc-20160816; b=oQr3WaFQhB3LjbuqR9U/bgiVpK/FAb6/OXxs97+k4xo2ejtUKWk2wSZSTQB8sFCC89 9mgPSRGLdH16L5hxwN9LGYU0qehWzqDijUL8fI16xfVj4wAZ1OqL6ERlMAuv/Qyq6fDA nUAGxthYFM3QMO2DZFRbAMFSu8Cx6nEMrAWmP03VZTTzCMdKPeFIn9Lx97tD3/7csfCa CLAHqLSHBhK7rhDjR9524XYoJM1uxhvcNZ+E3cQtdbYHpr2t73OD4psVx4EPZLyjWqK5 kK3e/ZVcKW30EBggrtLWy7OuTfOMDRKKHCi2cbcMr4hPYWJVBBBf2M2vcjUhgoYuIJ/u DzBA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=gGBClTDFsiIGDE/JpK8efqH9g6/Kfq+Dfh3WuzkSRGI=; b=0xTiWKOfboOgf0Of2fkDWG/JeMpnyKlp+YvX4A95flDCjsv4A0aDvxkCwZARqcb0eC yhZZq6jGviUn/xdsKTa3kJ2OG1K7jsUCKopt14YIpoIx4Mowf+067WStdCsWW1VNMdQp b/ANP6P3tN1MeBXK0s6TsRUSB/2gk520Kzu6ozjJIjGIeaYkNv2iaFF5GkC3cV+D3q49 dX7ARQhbuA2ErcyjThy/yoBe24pODVnHhtAvOgYLjXsZx3NBhPcA6cKb/71A6Ysatqjr 0M87pZnoYkeH6IUIflhaazt/mgl2UwQgA+QY1YlbZ6xpDVXAD+HXWt+ZKKixTDmOODjS 6P4g== 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 h185-v6si29474826pfc.172.2018.07.16.01.30.44; Mon, 16 Jul 2018 01:30:59 -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 S1731455AbeGPI4D (ORCPT + 99 others); Mon, 16 Jul 2018 04:56:03 -0400 Received: from foss.arm.com ([217.140.101.70]:54386 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731402AbeGPI4C (ORCPT ); Mon, 16 Jul 2018 04:56:02 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 4FD1815A1; Mon, 16 Jul 2018 01:29:47 -0700 (PDT) Received: from e110439-lin.cambridge.arm.com (e110439-lin.cambridge.arm.com [10.1.210.68]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 837DB3F5A0; Mon, 16 Jul 2018 01:29:44 -0700 (PDT) From: Patrick Bellasi To: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org Cc: Ingo Molnar , Peter Zijlstra , Tejun Heo , "Rafael J . Wysocki" , Viresh Kumar , Vincent Guittot , Paul Turner , Dietmar Eggemann , Morten Rasmussen , Juri Lelli , Todd Kjos , Joel Fernandes , Steve Muckle , Suren Baghdasaryan Subject: [PATCH v2 06/12] sched/cpufreq: uclamp: add utilization clamping for RT tasks Date: Mon, 16 Jul 2018 09:29:00 +0100 Message-Id: <20180716082906.6061-7-patrick.bellasi@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180716082906.6061-1-patrick.bellasi@arm.com> References: <20180716082906.6061-1-patrick.bellasi@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently schedutil enforces a maximum frequency when RT tasks are RUNNABLE. Such a mandatory policy can be made more tunable from userspace thus allowing for example to define a max frequency which is still reasonable for the execution of a specific RT workload. This will contribute to make the RT class more friendly for power/energy sensitive use-cases. This patch extends the usage of util_{min,max} to the RT scheduling class. Whenever a task in this class is RUNNABLE, the util required is defined by the constraints of the CPU control group the task belongs to. The IO wait boost value is thus subject to clamping for RT tasks too. This is to ensure that RT tasks as well as CFS ones are always subject to the set of current utilization clamping constraints. It's worth to notice that, by default, clamp values are min_util, max_util = (0, SCHED_CAPACITY_SCALE) and thus, RT tasks always run at the maximum OPP if not otherwise constrained by userspace. Signed-off-by: Patrick Bellasi Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Rafael J. Wysocki Cc: Viresh Kumar Cc: Todd Kjos Cc: Joel Fernandes Cc: Juri Lelli Cc: Dietmar Eggemann Cc: Morten Rasmussen Cc: linux-kernel@vger.kernel.org Cc: linux-pm@vger.kernel.org --- kernel/sched/cpufreq_schedutil.c | 42 +++++++++++++++++++------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c index 70aea6ec3c08..b05a63055e70 100644 --- a/kernel/sched/cpufreq_schedutil.c +++ b/kernel/sched/cpufreq_schedutil.c @@ -188,27 +188,35 @@ static void sugov_get_util(struct sugov_cpu *sg_cpu) sg_cpu->util_dl = cpu_util_dl(rq); } +/** + * sugov_aggregate_util() - Aggregate scheduling classes requests. + * @sg_cpu: the sugov data for the CPU to get utilization from + * + * Utilization required by DEADLINE must always be granted while, for + * FAIR, we use blocked utilization of IDLE CPUs as a mechanism to + * gracefully reduce the frequency when no tasks show up for longer + * periods of time. + * + * Ideally we would like to set util_dl as min/guaranteed freq and + * util_cfs + util_dl as requested freq. However, cpufreq is not yet + * ready for such an interface. So, we only do the latter for now. + * + * RT and CFS utilization are clamped, according to the current CPU + * constrains. They are individually clamped to ensure fairness across + * classes, meaning that CFS always gets (if possible) the (minimum) + * required bandwidth on top of that required by higher priority + * classes. + */ static unsigned long sugov_aggregate_util(struct sugov_cpu *sg_cpu) { + unsigned long util = sg_cpu->util_dl; struct rq *rq = cpu_rq(sg_cpu->cpu); - unsigned long util_cfs; if (rt_rq_is_runnable(&rq->rt)) - return sg_cpu->max; - - /* - * Utilization required by DEADLINE must always be granted while, for - * FAIR, we use blocked utilization of IDLE CPUs as a mechanism to - * gracefully reduce the frequency when no tasks show up for longer - * periods of time. - * - * Ideally we would like to set util_dl as min/guaranteed freq and - * util_cfs + util_dl as requested freq. However, cpufreq is not yet - * ready for such an interface. So, we only do the latter for now. - */ - util_cfs = uclamp_util(sg_cpu->cpu, sg_cpu->util_cfs); + util += uclamp_util(sg_cpu->cpu, sg_cpu->max); + util += uclamp_util(sg_cpu->cpu, sg_cpu->util_cfs); - return min(sg_cpu->max, (sg_cpu->util_dl + util_cfs)); + return min(sg_cpu->max, util); } /** @@ -276,8 +284,8 @@ static void sugov_iowait_boost(struct sugov_cpu *sg_cpu, u64 time, * * Since DL tasks have a much more advanced bandwidth control, it's * safe to assume that IO boost does not apply to those tasks. - * Instead, since for RT tasks we are already going to max, we don't - * rally care about clamping the IO boost max value for them too. + * Instead, for CFS and RT tasks we clamp the IO boost max value + * considering the current constraints for the CPU. */ max_boost = sg_cpu->iowait_boost_max; max_boost = uclamp_util(sg_cpu->cpu, max_boost); -- 2.17.1