Re: [PATCH v1] cpufreq: use __free() for all cpufreq_cpu_get() references
From: Gautam Menghani <hidden>
Date: 2025-08-25 11:30:15
Also in:
dri-devel, imx, intel-gfx, kvm, linux-acpi, linux-mediatek, linux-omap, linux-pm, linux-samsung-soc, linux-tegra, lkml
On Mon, Aug 25, 2025 at 05:28:33PM +0800, Zihuan Zhang wrote:
quoted hunk ↗ jump to hunk
This patch replaces all remaining uses of cpufreq_cpu_get() with the __free(cpufreq_cpu_put) annotation. Motivation: - Ensures automatic cleanup of policy references when they go out of scope, reducing the risk of forgetting to call cpufreq_cpu_put() on early return or error paths. - Brings the code in line with the latest kernel coding style and best practices for managing reference-counted objects. - No functional changes are introduced; behavior remains the same, but reference counting is now safer and easier to maintain. Signed-off-by: Zihuan Zhang <redacted> --- arch/arm64/kernel/topology.c | 9 +++---- arch/x86/kvm/x86.c | 10 ++++---- drivers/acpi/processor_thermal.c | 13 ++++------ drivers/cpufreq/brcmstb-avs-cpufreq.c | 4 +--- drivers/cpufreq/cppc_cpufreq.c | 4 +--- drivers/cpufreq/intel_pstate.c | 3 +-- drivers/cpufreq/longhaul.c | 3 +-- drivers/cpufreq/mediatek-cpufreq.c | 6 ++--- drivers/cpufreq/powernv-cpufreq.c | 6 ++--- drivers/cpufreq/s5pv210-cpufreq.c | 3 +-- drivers/cpufreq/tegra186-cpufreq.c | 3 +-- drivers/devfreq/governor_passive.c | 19 ++++----------- drivers/gpu/drm/i915/gt/intel_llc.c | 3 +-- drivers/macintosh/windfarm_cpufreq_clamp.c | 4 +--- drivers/powercap/dtpm_cpu.c | 24 ++++++------------- drivers/thermal/imx_thermal.c | 7 ++---- .../ti-soc-thermal/ti-thermal-common.c | 5 +--- kernel/power/energy_model.c | 7 ++---- 18 files changed, 40 insertions(+), 93 deletions(-)diff --git a/arch/arm64/kernel/topology.c b/arch/arm64/kernel/topology.c index 5d07ee85bdae..e3cb6d54f35b 100644 --- a/arch/arm64/kernel/topology.c +++ b/arch/arm64/kernel/topology.c@@ -307,17 +307,16 @@ int arch_freq_get_on_cpu(int cpu) */ if (!housekeeping_cpu(cpu, HK_TYPE_TICK) || time_is_before_jiffies(last_update + msecs_to_jiffies(AMU_SAMPLE_EXP_MS))) { - struct cpufreq_policy *policy = cpufreq_cpu_get(cpu); + struct cpufreq_policy *policy __free(put_cpufreq_policy); int ref_cpu; + policy = cpufreq_cpu_get(cpu); if (!policy) return -EINVAL; if (!cpumask_intersects(policy->related_cpus, - housekeeping_cpumask(HK_TYPE_TICK))) { - cpufreq_cpu_put(policy); + housekeeping_cpumask(HK_TYPE_TICK))) return -EOPNOTSUPP; - } for_each_cpu_wrap(ref_cpu, policy->cpus, cpu + 1) { if (ref_cpu == start_cpu) {@@ -329,8 +328,6 @@ int arch_freq_get_on_cpu(int cpu) break; } - cpufreq_cpu_put(policy); - if (ref_cpu >= nr_cpu_ids) /* No alternative to pull info from */ return -EAGAIN;diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index a1c49bc681c4..2a825f4ec701 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c@@ -9492,16 +9492,14 @@ static void kvm_timer_init(void) max_tsc_khz = tsc_khz; if (IS_ENABLED(CONFIG_CPU_FREQ)) { - struct cpufreq_policy *policy; + struct cpufreq_policy *policy __free(put_cpufreq_policy); int cpu; cpu = get_cpu(); policy = cpufreq_cpu_get(cpu); - if (policy) { - if (policy->cpuinfo.max_freq) - max_tsc_khz = policy->cpuinfo.max_freq; - cpufreq_cpu_put(policy); - } + if (policy && policy->cpuinfo.max_freq) + max_tsc_khz = policy->cpuinfo.max_freq; + put_cpu(); } cpufreq_register_notifier(&kvmclock_cpufreq_notifier_block,diff --git a/drivers/acpi/processor_thermal.c b/drivers/acpi/processor_thermal.c index 1219adb11ab9..8367a81c4842 100644 --- a/drivers/acpi/processor_thermal.c +++ b/drivers/acpi/processor_thermal.c@@ -64,17 +64,14 @@ static int phys_package_first_cpu(int cpu) static int cpu_has_cpufreq(unsigned int cpu) { - struct cpufreq_policy *policy; + struct cpufreq_policy *policy __free(put_cpufreq_policy); 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)@@ -95,7 +92,7 @@ static int cpufreq_get_cur_state(unsigned int cpu) static int cpufreq_set_cur_state(unsigned int cpu, int state) { - struct cpufreq_policy *policy; + struct cpufreq_policy *policy __free(put_cpufreq_policy); struct acpi_processor *pr; unsigned long max_freq; int i, ret;@@ -127,8 +124,6 @@ static int cpufreq_set_cur_state(unsigned int cpu, int state) max_freq = (policy->cpuinfo.max_freq * (100 - reduction_step(i) * cpufreq_thermal_reduction_pctg)) / 100; - cpufreq_cpu_put(policy); - ret = freq_qos_update_request(&pr->thermal_req, max_freq); if (ret < 0) { pr_warn("Failed to update thermal freq constraint: CPU%d (%d)\n",diff --git a/drivers/cpufreq/brcmstb-avs-cpufreq.c b/drivers/cpufreq/brcmstb-avs-cpufreq.c index 5940d262374f..71450cca8e9f 100644 --- a/drivers/cpufreq/brcmstb-avs-cpufreq.c +++ b/drivers/cpufreq/brcmstb-avs-cpufreq.c@@ -480,7 +480,7 @@ static bool brcm_avs_is_firmware_loaded(struct private_data *priv) static unsigned int brcm_avs_cpufreq_get(unsigned int cpu) { - struct cpufreq_policy *policy = cpufreq_cpu_get(cpu); + struct cpufreq_policy *policy __free(put_cpufreq_policy) = cpufreq_cpu_get(cpu); struct private_data *priv; if (!policy)@@ -488,8 +488,6 @@ static unsigned int brcm_avs_cpufreq_get(unsigned int cpu) priv = policy->driver_data; - cpufreq_cpu_put(policy); - return brcm_avs_get_frequency(priv->base); }diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c index 4a17162a392d..7183754b1f31 100644 --- a/drivers/cpufreq/cppc_cpufreq.c +++ b/drivers/cpufreq/cppc_cpufreq.c@@ -726,7 +726,7 @@ static int cppc_get_perf_ctrs_sample(int cpu, static unsigned int cppc_cpufreq_get_rate(unsigned int cpu) { struct cppc_perf_fb_ctrs fb_ctrs_t0 = {0}, fb_ctrs_t1 = {0}; - struct cpufreq_policy *policy = cpufreq_cpu_get(cpu); + struct cpufreq_policy *policy __free(put_cpufreq_policy) = cpufreq_cpu_get(cpu); struct cppc_cpudata *cpu_data; u64 delivered_perf; int ret;@@ -736,8 +736,6 @@ static unsigned int cppc_cpufreq_get_rate(unsigned int cpu) cpu_data = policy->driver_data; - cpufreq_cpu_put(policy); - ret = cppc_get_perf_ctrs_sample(cpu, &fb_ctrs_t0, &fb_ctrs_t1); if (ret) { if (ret == -EFAULT)diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c index f366d35c5840..fb962140af56 100644 --- a/drivers/cpufreq/intel_pstate.c +++ b/drivers/cpufreq/intel_pstate.c@@ -1698,7 +1698,7 @@ static ssize_t store_no_turbo(struct kobject *a, struct kobj_attribute *b, static void update_qos_request(enum freq_qos_req_type type) { struct freq_qos_request *req; - struct cpufreq_policy *policy; + struct cpufreq_policy *policy __free(put_cpufreq_policy); int i; for_each_possible_cpu(i) {@@ -1710,7 +1710,6 @@ static void update_qos_request(enum freq_qos_req_type type) continue; req = policy->driver_data; - cpufreq_cpu_put(policy); if (!req) continue;diff --git a/drivers/cpufreq/longhaul.c b/drivers/cpufreq/longhaul.c index ba0e08c8486a..ae5596919671 100644 --- a/drivers/cpufreq/longhaul.c +++ b/drivers/cpufreq/longhaul.c@@ -950,7 +950,7 @@ static int __init longhaul_init(void) static void __exit longhaul_exit(void) { - struct cpufreq_policy *policy = cpufreq_cpu_get(0); + struct cpufreq_policy *policy __free(put_cpufreq_policy) = cpufreq_cpu_get(0); int i; for (i = 0; i < numscales; i++) {@@ -968,7 +968,6 @@ static void __exit longhaul_exit(void) } } - cpufreq_cpu_put(policy); cpufreq_unregister_driver(&longhaul_driver); kfree(longhaul_table); }diff --git a/drivers/cpufreq/mediatek-cpufreq.c b/drivers/cpufreq/mediatek-cpufreq.c index f3f02c4b6888..1fae060e16d9 100644 --- a/drivers/cpufreq/mediatek-cpufreq.c +++ b/drivers/cpufreq/mediatek-cpufreq.c@@ -320,7 +320,7 @@ static int mtk_cpufreq_opp_notifier(struct notifier_block *nb, struct dev_pm_opp *new_opp; struct mtk_cpu_dvfs_info *info; unsigned long freq, volt; - struct cpufreq_policy *policy; + struct cpufreq_policy *policy __free(put_cpufreq_policy); int ret = 0; info = container_of(nb, struct mtk_cpu_dvfs_info, opp_nb);@@ -354,11 +354,9 @@ static int mtk_cpufreq_opp_notifier(struct notifier_block *nb, dev_pm_opp_put(new_opp); policy = cpufreq_cpu_get(info->opp_cpu); - if (policy) { + if (policy) cpufreq_driver_target(policy, freq / 1000, CPUFREQ_RELATION_L); - cpufreq_cpu_put(policy); - } } }diff --git a/drivers/cpufreq/powernv-cpufreq.c b/drivers/cpufreq/powernv-cpufreq.c index 7d9a5f656de8..ea9d78bbeb38 100644 --- a/drivers/cpufreq/powernv-cpufreq.c +++ b/drivers/cpufreq/powernv-cpufreq.c@@ -892,7 +892,7 @@ static int powernv_cpufreq_reboot_notifier(struct notifier_block *nb, unsigned long action, void *unused) { int cpu; - struct cpufreq_policy *cpu_policy; + struct cpufreq_policy *policy __free(put_cpufreq_policy);
There's a typo here. I got a compile error because of wrong variable name. Thanks, Gautam