Re: [PATCH 2/2] cpufreq: Update CPU capacity reduction in store_scaling_max_freq()

From: Viresh Kumar
Date: Mon Oct 10 2022 - 01:40:22 EST


Would be good to always CC Scheduler maintainers for such a patch.

On 30-09-22, 10:48, Lukasz Luba wrote:
> When the new max frequency value is stored, the task scheduler must
> know about it. The scheduler uses the CPUs capacity information in the
> task placement. Use the existing mechanism which provides information
> about reduced CPU capacity to the scheduler due to thermal capping.
>
> Signed-off-by: Lukasz Luba <lukasz.luba@xxxxxxx>
> ---
> drivers/cpufreq/cpufreq.c | 18 +++++++++++++++++-
> 1 file changed, 17 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> index 1f8b93f42c76..205d9ea9c023 100644
> --- a/drivers/cpufreq/cpufreq.c
> +++ b/drivers/cpufreq/cpufreq.c
> @@ -27,6 +27,7 @@
> #include <linux/slab.h>
> #include <linux/suspend.h>
> #include <linux/syscore_ops.h>
> +#include <linux/thermal.h>
> #include <linux/tick.h>
> #include <linux/units.h>
> #include <trace/events/power.h>
> @@ -718,6 +719,8 @@ static ssize_t show_scaling_cur_freq(struct cpufreq_policy *policy, char *buf)
> static ssize_t store_scaling_max_freq
> (struct cpufreq_policy *policy, const char *buf, size_t count)
> {
> + unsigned int frequency;
> + struct cpumask *cpus;
> unsigned long val;
> int ret;
>
> @@ -726,7 +729,20 @@ static ssize_t store_scaling_max_freq
> return -EINVAL;
>
> ret = freq_qos_update_request(policy->max_freq_req, val);
> - return ret >= 0 ? count : ret;
> + if (ret >= 0) {
> + /*
> + * Make sure that the task scheduler sees these CPUs
> + * capacity reduction. Use the thermal pressure mechanism
> + * to propagate this information to the scheduler.
> + */
> + cpus = policy->related_cpus;

No need of this, just use related_cpus directly.

> + frequency = __resolve_freq(policy, val, CPUFREQ_RELATION_HE);
> + arch_update_thermal_pressure(cpus, frequency);

I wonder if using the thermal-pressure API here is the right thing to
do. It is a change coming from User, which may or may not be
thermal-related.

> +
> + ret = count;
> + }
> +
> + return ret;
> }
>
> static ssize_t store_scaling_min_freq
> --
> 2.17.1

--
viresh