| From 52d4012329518fe161d8d2221fe463241c809b35 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 14 Jun 2021 20:10:30 +0100 |
| Subject: thermal/cpufreq_cooling: Update offline CPUs per-cpu thermal_pressure |
| |
| From: Lukasz Luba <lukasz.luba@arm.com> |
| |
| [ Upstream commit 2ad8ccc17d1e4270cf65a3f2a07a7534aa23e3fb ] |
| |
| The thermal pressure signal gives information to the scheduler about |
| reduced CPU capacity due to thermal. It is based on a value stored in |
| a per-cpu 'thermal_pressure' variable. The online CPUs will get the |
| new value there, while the offline won't. Unfortunately, when the CPU |
| is back online, the value read from per-cpu variable might be wrong |
| (stale data). This might affect the scheduler decisions, since it |
| sees the CPU capacity differently than what is actually available. |
| |
| Fix it by making sure that all online+offline CPUs would get the |
| proper value in their per-cpu variable when thermal framework sets |
| capping. |
| |
| Fixes: f12e4f66ab6a3 ("thermal/cpu-cooling: Update thermal pressure in case of a maximum frequency capping") |
| Signed-off-by: Lukasz Luba <lukasz.luba@arm.com> |
| Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> |
| Acked-by: Viresh Kumar <viresh.kumar@linaro.org> |
| Link: https://lore.kernel.org/r/20210614191030.22241-1-lukasz.luba@arm.com |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/thermal/cpufreq_cooling.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/drivers/thermal/cpufreq_cooling.c b/drivers/thermal/cpufreq_cooling.c |
| index 3f6a69ccc173..6e1d6a31ee4f 100644 |
| --- a/drivers/thermal/cpufreq_cooling.c |
| +++ b/drivers/thermal/cpufreq_cooling.c |
| @@ -443,7 +443,7 @@ static int cpufreq_set_cur_state(struct thermal_cooling_device *cdev, |
| ret = freq_qos_update_request(&cpufreq_cdev->qos_req, frequency); |
| if (ret >= 0) { |
| cpufreq_cdev->cpufreq_state = state; |
| - cpus = cpufreq_cdev->policy->cpus; |
| + cpus = cpufreq_cdev->policy->related_cpus; |
| max_capacity = arch_scale_cpu_capacity(cpumask_first(cpus)); |
| capacity = frequency * max_capacity; |
| capacity /= cpufreq_cdev->policy->cpuinfo.max_freq; |
| -- |
| 2.30.2 |
| |