Re: [PATCH v4 02/10] ACPI: processor: thermal: Use scope-based cleanup helper
From: Jonathan Cameron <jonathan.cameron@huawei.com>
Date: 2025-09-05 09:45:26
Also in:
dri-devel, imx, intel-gfx, linux-acpi, linux-arm-kernel, linux-omap, linux-pm, lkml
On Wed, 3 Sep 2025 15:23:31 +0200 "Rafael J. Wysocki" [off-list ref] wrote:
On Wed, Sep 3, 2025 at 3:18 PM Zihuan Zhang [off-list ref] wrote:quoted
Replace the manual cpufreq_cpu_put() with __free(put_cpufreq_policy) annotation for policy references. This reduces the risk of reference counting mistakes and aligns the code with the latest kernel style. No functional change intended. Signed-off-by: Zihuan Zhang <redacted> --- drivers/acpi/processor_thermal.c | 37 ++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 16 deletions(-)diff --git a/drivers/acpi/processor_thermal.c b/drivers/acpi/processor_thermal.c index 1219adb11ab9..5043f17d27b7 100644 --- a/drivers/acpi/processor_thermal.c +++ b/drivers/acpi/processor_thermal.c@@ -62,19 +62,14 @@ static int phys_package_first_cpu(int cpu) return 0; } -static int cpu_has_cpufreq(unsigned int cpu) +static bool cpu_has_cpufreq(unsigned int cpu) { - struct cpufreq_policy *policy; + struct cpufreq_policy *policy __free(put_cpufreq_policy) = cpufreq_cpu_get(cpu);
I'd put the order back as it was. See docs in cleanup.h, it is fine to
declare local variables inline if they are being use with __free()
That way if the simple check on acpi_process_cpu_freq_init fails no
get needs to occur.
So something like
static bool cpu_has_cpufreq(unsigned int cpu)
{
if (!acpi_processor_cpufreq_init)
return 0;
struct cpufreq_policy *policy __free(put_cpufreq_policy) = cpufreq_cpu_get(cpu);
return policy != NULL; //Personally I find !! on a pointer a bit weird :)
}
quoted
if (!acpi_processor_cpufreq_init) return 0; - policy = cpufreq_cpu_get(cpu); - if (policy) { - cpufreq_cpu_put(policy); - return 1; - } - return 0; + return !!policy; } static int cpufreq_get_max_state(unsigned int cpu)@@ -93,9 +88,23 @@ static int cpufreq_get_cur_state(unsigned int cpu) return reduction_step(cpu); } +static long long cpufreq_get_max_freq(unsigned int cpu) +{ + long long max_freq; + struct cpufreq_policy *policy __free(put_cpufreq_policy) = + cpufreq_cpu_get(cpu);
Format consistently. If you are going to wrap to 80 chars here then do it for the cpu_has_cpufreq() line that is identical to this.
quoted
+ + if (!policy) + return -EINVAL; + + max_freq = (policy->cpuinfo.max_freq * + (100 - reduction_step(cpu) * cpufreq_thermal_reduction_pctg)) / 100; + + return max_freq; +} + static int cpufreq_set_cur_state(unsigned int cpu, int state) { - struct cpufreq_policy *policy; struct acpi_processor *pr; unsigned long max_freq; int i, ret;@@ -120,14 +129,10 @@ static int cpufreq_set_cur_state(unsigned int cpu, int state) if (unlikely(!freq_qos_request_active(&pr->thermal_req))) continue; - policy = cpufreq_cpu_get(i); - if (!policy) - return -EINVAL; - - max_freq = (policy->cpuinfo.max_freq * - (100 - reduction_step(i) * cpufreq_thermal_reduction_pctg)) / 100; + max_freq = cpufreq_get_max_freq(cpu); - cpufreq_cpu_put(policy); + if (max_freq == -EINVAL) + return -EINVAL;Please also move the code below to the new function so it does not need to return a value.quoted
ret = freq_qos_update_request(&pr->thermal_req, max_freq); if (ret < 0) { --