Thread (5 messages) 5 messages, 3 authors, 2025-08-26

Re: [PATCH v1] cpufreq: use __free() for all cpufreq_cpu_get() references

From: Zihuan Zhang <hidden>
Date: 2025-08-26 00:30:11
Also in: dri-devel, imx, intel-gfx, kvm, linux-acpi, linux-mediatek, linux-omap, linux-pm, linux-samsung-soc, linux-tegra, lkml

在 2025/8/25 19:28, Gautam Menghani 写道:
On Mon, Aug 25, 2025 at 05:28:33PM +0800, Zihuan Zhang wrote:
quoted
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
Sorry about that.

Although we did compile-test it, some configs are not enabled by default 
so we missed this issue. I’ll fix it in the next version.

Thanks for catching this!



Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help