On Mon, Aug 25, 2025 at 05:28:33PM +0800, Zihuan Zhang wrote: > 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 <zhangzih...@kylinos.cn> > --- > 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