Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp1761270imm; Sun, 15 Jul 2018 16:29:49 -0700 (PDT) X-Google-Smtp-Source: AAOMgpdBFj25HizNhfySLYQKEeXd5qD2p8s5ky7vs3WG+d/SZp9aCNyvZKeNyd5OnoWr7wnVvJDM X-Received: by 2002:a65:5683:: with SMTP id v3-v6mr13251298pgs.176.1531697389830; Sun, 15 Jul 2018 16:29:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1531697389; cv=none; d=google.com; s=arc-20160816; b=b0hzksvM0kEDuGHO0xSTDHy75w0UbdHCvPIxuC10pQ9L4iODl0aBB5LxY+nA1LSCUW IMaGWsO2mlyaLVhCLzYM1pQwq+C3cDrW3mhM6nH0fES72jvingswAcdrgnjGw43jpMwK lyCcJTciu0/qfmraaQvXQwf1N/rvESWLgKIucC7IXU5ddwzrF9hy5QDYUy5Ih+IomS2/ tLzl6RrTFKABCBfEC+nM0iVMN0VW8H0lXawkrIRpJFBloXvWz3QfRFLD3sZj5B4R+qsh vip4mEqsSnFrD/8GxjcDTwU2IQfTVAJBD3d9DZbtsSALxWpY4nlkWoS0Ci7L2rNnM968 8C6g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-disposition :content-transfer-encoding:mime-version:robot-unsubscribe:robot-id :git-commit-id:subject:to:references:in-reply-to:reply-to:cc :message-id:from:date:arc-authentication-results; bh=SCe4k1YgfaQAEayl09sKQcJ63d+TEWNom8lo3g8ltoM=; b=MxpzgRVZpER4SdqWQsZselKt4Rf8UqDEv2z4jP8UPeYvNhh+uKUdHCzX7+peLU9cso KYWHb7Ld7b2/j80p/kcyjlsqdJB7951fEdMD5MsopVfIeEq3jIFxlbop5PjhGTG2Qyjm xEolh7J92YSCUfZIozJZXCvdecU1og6pupCYoWGyrqpCQmRewFRxUpMUpHFwy/0hHhaG JCz8IMhLcMyxL4RsyvYoYHlPtjW+u5cIuCY5S5VHrEgtIvrgE/UU9SjGkXsCgu9wmf01 vr0TWoIDRoi8+QRbC4dVZtOsCSvf+YaGLfF0xkEl6v3x7D/3uB+Ku7F08XaBJbWe8q2J UZvg== 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 h18-v6si27621573pgd.238.2018.07.15.16.29.35; Sun, 15 Jul 2018 16:29:49 -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 S1728158AbeGOXxb (ORCPT + 99 others); Sun, 15 Jul 2018 19:53:31 -0400 Received: from terminus.zytor.com ([198.137.202.136]:36599 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727091AbeGOXxb (ORCPT ); Sun, 15 Jul 2018 19:53:31 -0400 Received: from terminus.zytor.com (localhost [127.0.0.1]) by terminus.zytor.com (8.15.2/8.15.2) with ESMTPS id w6FNSbui921387 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sun, 15 Jul 2018 16:28:37 -0700 Received: (from tipbot@localhost) by terminus.zytor.com (8.15.2/8.15.2/Submit) id w6FNSbUR921384; Sun, 15 Jul 2018 16:28:37 -0700 Date: Sun, 15 Jul 2018 16:28:37 -0700 X-Authentication-Warning: terminus.zytor.com: tipbot set sender to tipbot@zytor.com using -f From: tip-bot for Vincent Guittot Message-ID: Cc: hpa@zytor.com, vincent.guittot@linaro.org, linux-kernel@vger.kernel.org, torvalds@linux-foundation.org, tglx@linutronix.de, mingo@kernel.org, peterz@infradead.org, viresh.kumar@linaro.org Reply-To: linux-kernel@vger.kernel.org, vincent.guittot@linaro.org, hpa@zytor.com, viresh.kumar@linaro.org, peterz@infradead.org, mingo@kernel.org, tglx@linutronix.de, torvalds@linux-foundation.org In-Reply-To: <1530200714-4504-6-git-send-email-vincent.guittot@linaro.org> References: <1530200714-4504-6-git-send-email-vincent.guittot@linaro.org> To: linux-tip-commits@vger.kernel.org Subject: [tip:sched/core] cpufreq/schedutil: Use DL utilization tracking Git-Commit-ID: 8cc90515a4fa419ccfc4703ff127699cdcb96839 X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00, T_DATE_IN_FUTURE_96_Q autolearn=ham autolearn_force=no version=3.4.1 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on terminus.zytor.com Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: 8cc90515a4fa419ccfc4703ff127699cdcb96839 Gitweb: https://git.kernel.org/tip/8cc90515a4fa419ccfc4703ff127699cdcb96839 Author: Vincent Guittot AuthorDate: Thu, 28 Jun 2018 17:45:08 +0200 Committer: Ingo Molnar CommitDate: Sun, 15 Jul 2018 23:51:21 +0200 cpufreq/schedutil: Use DL utilization tracking Now that we have both the DL class bandwidth requirement and the DL class utilization, we can detect when CPU is fully used so we should run at max. Otherwise, we keep using the DL bandwidth requirement to define the utilization of the CPU. Signed-off-by: Vincent Guittot Signed-off-by: Peter Zijlstra (Intel) Acked-by: Viresh Kumar Cc: Linus Torvalds Cc: Morten.Rasmussen@arm.com Cc: Peter Zijlstra Cc: Thomas Gleixner Cc: claudio@evidence.eu.com Cc: daniel.lezcano@linaro.org Cc: dietmar.eggemann@arm.com Cc: joel@joelfernandes.org Cc: juri.lelli@redhat.com Cc: luca.abeni@santannapisa.it Cc: patrick.bellasi@arm.com Cc: quentin.perret@arm.com Cc: rjw@rjwysocki.net Cc: valentin.schneider@arm.com Link: http://lkml.kernel.org/r/1530200714-4504-6-git-send-email-vincent.guittot@linaro.org Signed-off-by: Ingo Molnar --- kernel/sched/cpufreq_schedutil.c | 23 +++++++++++++++++------ kernel/sched/sched.h | 7 ++++++- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c index da29b5a33adb..07760bc7f69a 100644 --- a/kernel/sched/cpufreq_schedutil.c +++ b/kernel/sched/cpufreq_schedutil.c @@ -56,6 +56,7 @@ struct sugov_cpu { /* The fields below are only needed when sharing a policy: */ unsigned long util_cfs; unsigned long util_dl; + unsigned long bw_dl; unsigned long util_rt; unsigned long max; @@ -187,6 +188,7 @@ static void sugov_get_util(struct sugov_cpu *sg_cpu) sg_cpu->max = arch_scale_cpu_capacity(NULL, sg_cpu->cpu); sg_cpu->util_cfs = cpu_util_cfs(rq); sg_cpu->util_dl = cpu_util_dl(rq); + sg_cpu->bw_dl = cpu_bw_dl(rq); sg_cpu->util_rt = cpu_util_rt(rq); } @@ -198,20 +200,29 @@ static unsigned long sugov_aggregate_util(struct sugov_cpu *sg_cpu) if (rt_rq_is_runnable(&rq->rt)) return sg_cpu->max; - util = sg_cpu->util_dl; - util += sg_cpu->util_cfs; + util = sg_cpu->util_cfs; util += sg_cpu->util_rt; + if ((util + sg_cpu->util_dl) >= sg_cpu->max) + 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 + * As there is still idle time on the CPU, we need to compute the + * utilization level of the CPU. + * + * Bandwidth required by DEADLINE must always be granted while, for + * FAIR and RT, 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. */ + + /* Add DL bandwidth requirement */ + util += sg_cpu->bw_dl; + return min(sg_cpu->max, util); } @@ -367,7 +378,7 @@ static inline bool sugov_cpu_is_busy(struct sugov_cpu *sg_cpu) { return false; } */ static inline void ignore_dl_rate_limit(struct sugov_cpu *sg_cpu, struct sugov_policy *sg_policy) { - if (cpu_util_dl(cpu_rq(sg_cpu->cpu)) > sg_cpu->util_dl) + if (cpu_bw_dl(cpu_rq(sg_cpu->cpu)) > sg_cpu->bw_dl) sg_policy->need_freq_update = true; } diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index ab8b5296b5f6..9028f268f867 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -2199,11 +2199,16 @@ static inline void cpufreq_update_util(struct rq *rq, unsigned int flags) {} #endif #ifdef CONFIG_CPU_FREQ_GOV_SCHEDUTIL -static inline unsigned long cpu_util_dl(struct rq *rq) +static inline unsigned long cpu_bw_dl(struct rq *rq) { return (rq->dl.running_bw * SCHED_CAPACITY_SCALE) >> BW_SHIFT; } +static inline unsigned long cpu_util_dl(struct rq *rq) +{ + return READ_ONCE(rq->avg_dl.util_avg); +} + static inline unsigned long cpu_util_cfs(struct rq *rq) { unsigned long util = READ_ONCE(rq->cfs.avg.util_avg);