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

Reply via email to