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);