Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp1466492pxb; Sat, 16 Oct 2021 10:37:13 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyMFqDvDMnCgPv1SQh5QA6xtTceQrkDb6kT7sA/OvBIHYM438fSs3FFgMX5M9OuLv8h3y67 X-Received: by 2002:a63:e24b:: with SMTP id y11mr14665727pgj.452.1634405833027; Sat, 16 Oct 2021 10:37:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1634405833; cv=none; d=google.com; s=arc-20160816; b=ywIheJBXrcXMUzuuMakkWe9+PmnswFvYmrLLdDuLLadCxXS0hPU404qHnNHvwDTSMy +J0xEj73jjkEiMG1renK5pE/KU7kjnu9EfBU4XSBGG5if8vS4klmdKPp5D+W+LzSQcZc 4DX6BEHt03CxjGQ5gm/EcwrLBxnltUAB+yQvEGfPKQY/wISEKrUN5+LqYkOqG63N9dE2 SmHzhRb8HruH+Kz1+sCSWVs2d9q9lM0BlQ2ouLymJ6LWjBU206Svsf42KFk2Q752+o3y HQkN6B4God5QVJuhZeLrFZoDWSS003n6TrGy5nunIPtukYyOS0neiUVIKJUaE5AA+8QS y1Pw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from; bh=6wLP5dKuugCVFUaGHIQtxhTKKAUJNJ7LlSxc7ikCODg=; b=YLkT/PzfNJsUCp6XYapFxUQjL7i9DUJD2JcVekIF31k76+lK24aMt1n9OptWsNHj9x qDAMPL6fjB/3bWnr3oLn0IcmfnpAmMRpIz3+eo6puNIqi032z5Jnh5h9OLetrvRYhB1p 7vRyWTSFholxAodA0m5VmdXrAlni3X/X0F2qeb65Cz5zxrXPsufP7P/8g3Eci0JT0p4j 4s5p0V4JJQtw8scPXll+33n+m66d+9bLDu50xtz1pX1+FVFQM1xr6dul8niXY30PHIjd wt+Is7fayR6jl1KsNQ6zjsCkpvut/DND9z39r/DyZ8NH3pljP8wuzHAHqs8aWR48+XVv SLuA== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b6si12327635plx.206.2021.10.16.10.36.58; Sat, 16 Oct 2021 10:37:13 -0700 (PDT) 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240753AbhJOOsM (ORCPT + 99 others); Fri, 15 Oct 2021 10:48:12 -0400 Received: from foss.arm.com ([217.140.110.172]:44052 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235318AbhJOOsL (ORCPT ); Fri, 15 Oct 2021 10:48:11 -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 8CE4F1515; Fri, 15 Oct 2021 07:46:04 -0700 (PDT) Received: from e123648.arm.com (unknown [10.57.23.184]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 909993F66F; Fri, 15 Oct 2021 07:46:01 -0700 (PDT) From: Lukasz Luba To: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, lukasz.luba@arm.com, sudeep.holla@arm.com, will@kernel.org, catalin.marinas@arm.com, linux@armlinux.org.uk, gregkh@linuxfoundation.org, rafael@kernel.org, viresh.kumar@linaro.org, amitk@kernel.org, daniel.lezcano@linaro.org, amit.kachhap@gmail.com, thara.gopinath@linaro.org, bjorn.andersson@linaro.org, agross@kernel.org Subject: [PATCH v2 1/5] arch_topology: Introduce thermal pressure update function Date: Fri, 15 Oct 2021 15:45:46 +0100 Message-Id: <20211015144550.23719-2-lukasz.luba@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211015144550.23719-1-lukasz.luba@arm.com> References: <20211015144550.23719-1-lukasz.luba@arm.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The thermal pressure is a mechanism which is used for providing information about reduced CPU performance to the scheduler. Usually code has to convert the value from frequency units into capacity units, which are understandable by the scheduler. Create a common conversion code which can be just used via a handy API. Signed-off-by: Lukasz Luba --- arch/arm/include/asm/topology.h | 1 + arch/arm64/include/asm/topology.h | 1 + drivers/base/arch_topology.c | 36 ++++++++++++++++++++++++++++++- include/linux/arch_topology.h | 3 +++ include/linux/sched/topology.h | 7 ++++++ 5 files changed, 47 insertions(+), 1 deletion(-) diff --git a/arch/arm/include/asm/topology.h b/arch/arm/include/asm/topology.h index 470299ee2fba..aee6c456c085 100644 --- a/arch/arm/include/asm/topology.h +++ b/arch/arm/include/asm/topology.h @@ -24,6 +24,7 @@ /* Replace task scheduler's default thermal pressure API */ #define arch_scale_thermal_pressure topology_get_thermal_pressure #define arch_set_thermal_pressure topology_set_thermal_pressure +#define arch_thermal_pressure_update topology_thermal_pressure_update #else diff --git a/arch/arm64/include/asm/topology.h b/arch/arm64/include/asm/topology.h index ec2db3419c41..c997015402bc 100644 --- a/arch/arm64/include/asm/topology.h +++ b/arch/arm64/include/asm/topology.h @@ -33,6 +33,7 @@ void update_freq_counters_refs(void); /* Replace task scheduler's default thermal pressure API */ #define arch_scale_thermal_pressure topology_get_thermal_pressure #define arch_set_thermal_pressure topology_set_thermal_pressure +#define arch_thermal_pressure_update topology_thermal_pressure_update #include diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c index 43407665918f..1fa28b5afdb2 100644 --- a/drivers/base/arch_topology.c +++ b/drivers/base/arch_topology.c @@ -25,6 +25,7 @@ static DEFINE_PER_CPU(struct scale_freq_data __rcu *, sft_data); static struct cpumask scale_freq_counters_mask; static bool scale_freq_invariant; +static DEFINE_PER_CPU(u32, freq_factor) = 1; static bool supports_scale_freq_counters(const struct cpumask *cpus) { @@ -168,6 +169,40 @@ void topology_set_thermal_pressure(const struct cpumask *cpus, } EXPORT_SYMBOL_GPL(topology_set_thermal_pressure); +/** + * topology_thermal_pressure_update() - Update thermal pressure for CPUs + * @cpus : The related CPUs for which capacity has been reduced + * @capped_freq : The maximum allowed frequency that CPUs can run at + * + * Update the value of thermal pressure for all @cpus in the mask. The + * cpumask should include all (online+offline) affected CPUs, to avoid + * operating on stale data when hot-plug is used for some CPUs. The + * @capped_freq must be less or equal to the max possible frequency and + * reflects the currently allowed max CPUs frequency due to thermal capping. + * The @capped_freq must be provided in kHz. + */ +void topology_thermal_pressure_update(const struct cpumask *cpus, + unsigned long capped_freq) +{ + unsigned long max_capacity, capacity; + int cpu; + + if (!cpus) + return; + + cpu = cpumask_first(cpus); + max_capacity = arch_scale_cpu_capacity(cpu); + + /* Convert to MHz scale which is used in 'freq_factor' */ + capped_freq /= 1000; + + capacity = mult_frac(capped_freq, max_capacity, + per_cpu(freq_factor, cpu)); + + arch_set_thermal_pressure(cpus, max_capacity - capacity); +} +EXPORT_SYMBOL_GPL(topology_thermal_pressure_update); + static ssize_t cpu_capacity_show(struct device *dev, struct device_attribute *attr, char *buf) @@ -220,7 +255,6 @@ static void update_topology_flags_workfn(struct work_struct *work) update_topology = 0; } -static DEFINE_PER_CPU(u32, freq_factor) = 1; static u32 *raw_capacity; static int free_raw_capacity(void) diff --git a/include/linux/arch_topology.h b/include/linux/arch_topology.h index f180240dc95f..9e183621a59b 100644 --- a/include/linux/arch_topology.h +++ b/include/linux/arch_topology.h @@ -59,6 +59,9 @@ static inline unsigned long topology_get_thermal_pressure(int cpu) void topology_set_thermal_pressure(const struct cpumask *cpus, unsigned long th_pressure); +void topology_thermal_pressure_update(const struct cpumask *cpus, + unsigned long capped_freq); + struct cpu_topology { int thread_id; int core_id; diff --git a/include/linux/sched/topology.h b/include/linux/sched/topology.h index 8f0f778b7c91..990d14814427 100644 --- a/include/linux/sched/topology.h +++ b/include/linux/sched/topology.h @@ -266,6 +266,13 @@ void arch_set_thermal_pressure(const struct cpumask *cpus, { } #endif +#ifndef arch_thermal_pressure_update +static __always_inline +void arch_thermal_pressure_update(const struct cpumask *cpus, + unsigned long capped_frequency) +{ } +#endif + static inline int task_node(const struct task_struct *p) { return cpu_to_node(task_cpu(p)); -- 2.17.1