Received: by 2002:a25:c205:0:0:0:0:0 with SMTP id s5csp6901551ybf; Fri, 6 Mar 2020 06:43:30 -0800 (PST) X-Google-Smtp-Source: ADFU+vu2gkwUC0DFBQxPPAFUnVOnxypaWsM4HGlKz/sz5szeVfC11BsaIWLBeuXx0CQA9T2kssWA X-Received: by 2002:a05:6830:15d8:: with SMTP id j24mr2935522otr.258.1583505810703; Fri, 06 Mar 2020 06:43:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1583505810; cv=none; d=google.com; s=arc-20160816; b=y8IweafesGZr0kLgQc4yIZUVZNKR77bw1AyQjFD7PkPU55cmbvwx3sLrwhdl8v89WG gMgrLmqHj/rkNPvMB7akFduatQCvmuBQ+Ulw/3+5idbPAUPMVSI5gk3lqgys4k/bhCK2 MMHd0cIAvsclJH0zl2uB2BxEt4Lf/DgIFLlapLehWcn4hRcsDk2LUM8GtRCmN983jaWg F/mkNLbnWXk30iVIKTq4Qw4b3Qk7KXBRn5IWvTJSkZURLakb42wFEW8Ize5K0B3l+SlL RRauzxZnWDOvVRt0Z99i2Kyvp+qvB1Gn/FME5kczwTEearX7xsDc9M+FYN0uZs7C0vcV pXsw== 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 :robot-unsubscribe:robot-id:message-id:mime-version:references :in-reply-to:cc:subject:to:reply-to:from:date; bh=16bJcWnhqH4tnAH6dEJqdWSFHdpXLzv0BRwzceoqykI=; b=DauIVkXvV+BUu3efYq/LkYFmMiv13ucgNW/sYwA0dDYsKu2WYhQ+VmaCBQVcSNrwbC H2EnptokSqa31YJJxfsJOyvt2uD1SonyIMoGmzAvY3hRo6bABP1820qH5N1VC7FCb030 PtgsIS9LXI+Jid6iu0kh76oZLNdT/vk1Fw7KWOJb+J7i/GopbFI8ynxSwFEd8+yw9Tzg 0Ie1LazN3wrD+U9uUUXySFZr5tPJJKqCmz1hf9HzZRnezQPa/TSZKXWSkJA1YGIV/Ngx iGozMCDcBT0NyoutzsLWpypN3YapNETpUyvpHrRp4s7xtyO/KudMBaqy4SZVWGvRyhZI RjsQ== 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 t15si1460981oth.176.2020.03.06.06.43.18; Fri, 06 Mar 2020 06:43:30 -0800 (PST) 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 S1727408AbgCFOmj (ORCPT + 99 others); Fri, 6 Mar 2020 09:42:39 -0500 Received: from Galois.linutronix.de ([193.142.43.55]:53881 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727306AbgCFOm2 (ORCPT ); Fri, 6 Mar 2020 09:42:28 -0500 Received: from [5.158.153.53] (helo=tip-bot2.lab.linutronix.de) by Galois.linutronix.de with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA256:256) (Exim 4.80) (envelope-from ) id 1jAEBC-0006PX-QI; Fri, 06 Mar 2020 15:42:23 +0100 Received: from [127.0.1.1] (localhost [IPv6:::1]) by tip-bot2.lab.linutronix.de (Postfix) with ESMTP id 86CF01C21D9; Fri, 6 Mar 2020 15:42:11 +0100 (CET) Date: Fri, 06 Mar 2020 14:42:11 -0000 From: "tip-bot2 for Thara Gopinath" Reply-to: linux-kernel@vger.kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip: sched/core] sched/pelt: Add support to track thermal pressure Cc: Vincent Guittot , Thara Gopinath , "Peter Zijlstra (Intel)" , Ingo Molnar , x86 , LKML In-Reply-To: <20200222005213.3873-2-thara.gopinath@linaro.org> References: <20200222005213.3873-2-thara.gopinath@linaro.org> MIME-Version: 1.0 Message-ID: <158350573124.28353.7802371753363408650.tip-bot2@tip-bot2> X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Linutronix-Spam-Score: -1.0 X-Linutronix-Spam-Level: - X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,SHORTCIRCUIT=-0.0001 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The following commit has been merged into the sched/core branch of tip: Commit-ID: 765047932f153265db6ef15be208d6cbfc03dc62 Gitweb: https://git.kernel.org/tip/765047932f153265db6ef15be208d6cbfc03dc62 Author: Thara Gopinath AuthorDate: Fri, 21 Feb 2020 19:52:05 -05:00 Committer: Ingo Molnar CommitterDate: Fri, 06 Mar 2020 12:57:17 +01:00 sched/pelt: Add support to track thermal pressure Extrapolating on the existing framework to track rt/dl utilization using pelt signals, add a similar mechanism to track thermal pressure. The difference here from rt/dl utilization tracking is that, instead of tracking time spent by a CPU running a RT/DL task through util_avg, the average thermal pressure is tracked through load_avg. This is because thermal pressure signal is weighted time "delta" capacity unlike util_avg which is binary. "delta capacity" here means delta between the actual capacity of a CPU and the decreased capacity a CPU due to a thermal event. In order to track average thermal pressure, a new sched_avg variable avg_thermal is introduced. Function update_thermal_load_avg can be called to do the periodic bookkeeping (accumulate, decay and average) of the thermal pressure. Reviewed-by: Vincent Guittot Signed-off-by: Thara Gopinath Signed-off-by: Peter Zijlstra (Intel) Signed-off-by: Ingo Molnar Link: https://lkml.kernel.org/r/20200222005213.3873-2-thara.gopinath@linaro.org --- include/trace/events/sched.h | 4 ++++ init/Kconfig | 4 ++++ kernel/sched/pelt.c | 31 +++++++++++++++++++++++++++++++ kernel/sched/pelt.h | 31 +++++++++++++++++++++++++++++++ kernel/sched/sched.h | 3 +++ 5 files changed, 73 insertions(+) diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h index 9c3ebb7..ed168b0 100644 --- a/include/trace/events/sched.h +++ b/include/trace/events/sched.h @@ -618,6 +618,10 @@ DECLARE_TRACE(pelt_dl_tp, TP_PROTO(struct rq *rq), TP_ARGS(rq)); +DECLARE_TRACE(pelt_thermal_tp, + TP_PROTO(struct rq *rq), + TP_ARGS(rq)); + DECLARE_TRACE(pelt_irq_tp, TP_PROTO(struct rq *rq), TP_ARGS(rq)); diff --git a/init/Kconfig b/init/Kconfig index 20a6ac3..275c848 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -451,6 +451,10 @@ config HAVE_SCHED_AVG_IRQ depends on IRQ_TIME_ACCOUNTING || PARAVIRT_TIME_ACCOUNTING depends on SMP +config SCHED_THERMAL_PRESSURE + bool "Enable periodic averaging of thermal pressure" + depends on SMP + config BSD_PROCESS_ACCT bool "BSD Process Accounting" depends on MULTIUSER diff --git a/kernel/sched/pelt.c b/kernel/sched/pelt.c index c40d57a..b647d04 100644 --- a/kernel/sched/pelt.c +++ b/kernel/sched/pelt.c @@ -368,6 +368,37 @@ int update_dl_rq_load_avg(u64 now, struct rq *rq, int running) return 0; } +#ifdef CONFIG_SCHED_THERMAL_PRESSURE +/* + * thermal: + * + * load_sum = \Sum se->avg.load_sum but se->avg.load_sum is not tracked + * + * util_avg and runnable_load_avg are not supported and meaningless. + * + * Unlike rt/dl utilization tracking that track time spent by a cpu + * running a rt/dl task through util_avg, the average thermal pressure is + * tracked through load_avg. This is because thermal pressure signal is + * time weighted "delta" capacity unlike util_avg which is binary. + * "delta capacity" = actual capacity - + * capped capacity a cpu due to a thermal event. + */ + +int update_thermal_load_avg(u64 now, struct rq *rq, u64 capacity) +{ + if (___update_load_sum(now, &rq->avg_thermal, + capacity, + capacity, + capacity)) { + ___update_load_avg(&rq->avg_thermal, 1); + trace_pelt_thermal_tp(rq); + return 1; + } + + return 0; +} +#endif + #ifdef CONFIG_HAVE_SCHED_AVG_IRQ /* * irq: diff --git a/kernel/sched/pelt.h b/kernel/sched/pelt.h index afff644..eb034d9 100644 --- a/kernel/sched/pelt.h +++ b/kernel/sched/pelt.h @@ -7,6 +7,26 @@ int __update_load_avg_cfs_rq(u64 now, struct cfs_rq *cfs_rq); int update_rt_rq_load_avg(u64 now, struct rq *rq, int running); int update_dl_rq_load_avg(u64 now, struct rq *rq, int running); +#ifdef CONFIG_SCHED_THERMAL_PRESSURE +int update_thermal_load_avg(u64 now, struct rq *rq, u64 capacity); + +static inline u64 thermal_load_avg(struct rq *rq) +{ + return READ_ONCE(rq->avg_thermal.load_avg); +} +#else +static inline int +update_thermal_load_avg(u64 now, struct rq *rq, u64 capacity) +{ + return 0; +} + +static inline u64 thermal_load_avg(struct rq *rq) +{ + return 0; +} +#endif + #ifdef CONFIG_HAVE_SCHED_AVG_IRQ int update_irq_load_avg(struct rq *rq, u64 running); #else @@ -159,6 +179,17 @@ update_dl_rq_load_avg(u64 now, struct rq *rq, int running) } static inline int +update_thermal_load_avg(u64 now, struct rq *rq, u64 capacity) +{ + return 0; +} + +static inline u64 thermal_load_avg(struct rq *rq) +{ + return 0; +} + +static inline int update_irq_load_avg(struct rq *rq, u64 running) { return 0; diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 2a0caf3..6c839f8 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -961,6 +961,9 @@ struct rq { #ifdef CONFIG_HAVE_SCHED_AVG_IRQ struct sched_avg avg_irq; #endif +#ifdef CONFIG_SCHED_THERMAL_PRESSURE + struct sched_avg avg_thermal; +#endif u64 idle_stamp; u64 avg_idle;