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(-)
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 <zhangzihuan@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);
rebooting = true;
for_each_online_cpu(cpu) {
@@ -900,7 +900,6 @@ static int powernv_cpufreq_reboot_notifier(struct notifier_block *nb,
if (!cpu_policy)
continue;
powernv_cpufreq_target_index(cpu_policy, get_nominal_index());
- cpufreq_cpu_put(cpu_policy);
}
return NOTIFY_DONE;
@@ -913,7 +912,7 @@ static struct notifier_block powernv_cpufreq_reboot_nb = {
static void powernv_cpufreq_work_fn(struct work_struct *work)
{
struct chip *chip = container_of(work, struct chip, throttle);
- struct cpufreq_policy *policy;
+ struct cpufreq_policy *policy __free(put_cpufreq_policy);
unsigned int cpu;
cpumask_t mask;
@@ -935,7 +934,6 @@ static void powernv_cpufreq_work_fn(struct work_struct *work)
index = cpufreq_table_find_index_c(policy, policy->cur, false);
powernv_cpufreq_target_index(policy, index);
cpumask_andnot(&mask, &mask, policy->cpus);
- cpufreq_cpu_put(policy);
}
out:
cpus_read_unlock();
diff --git a/drivers/cpufreq/s5pv210-cpufreq.c b/drivers/cpufreq/s5pv210-cpufreq.c
index 76c888ed8d16..95f1568e9530 100644
--- a/drivers/cpufreq/s5pv210-cpufreq.c
+++ b/drivers/cpufreq/s5pv210-cpufreq.c
@@ -555,7 +555,7 @@ static int s5pv210_cpufreq_reboot_notifier_event(struct notifier_block *this,
unsigned long event, void *ptr)
{
int ret;
- struct cpufreq_policy *policy;
+ struct cpufreq_policy *policy __free(put_cpufreq_policy);
policy = cpufreq_cpu_get(0);
if (!policy) {
@@ -564,7 +564,6 @@ static int s5pv210_cpufreq_reboot_notifier_event(struct notifier_block *this,
}
ret = cpufreq_driver_target(policy, SLEEP_FREQ, 0);
- cpufreq_cpu_put(policy);
if (ret < 0)
return NOTIFY_BAD;
diff --git a/drivers/cpufreq/tegra186-cpufreq.c b/drivers/cpufreq/tegra186-cpufreq.c
index cbabb726c664..4d71e262a729 100644
--- a/drivers/cpufreq/tegra186-cpufreq.c
+++ b/drivers/cpufreq/tegra186-cpufreq.c
@@ -105,7 +105,7 @@ static unsigned int tegra186_cpufreq_get(unsigned int cpu)
{
struct tegra186_cpufreq_data *data = cpufreq_get_driver_data();
struct tegra186_cpufreq_cluster *cluster;
- struct cpufreq_policy *policy;
+ struct cpufreq_policy *policy __free(put_cpufreq_policy);
unsigned int edvd_offset, cluster_id;
u32 ndiv;
@@ -117,7 +117,6 @@ static unsigned int tegra186_cpufreq_get(unsigned int cpu)
ndiv = readl(data->regs + edvd_offset) & EDVD_CORE_VOLT_FREQ_F_MASK;
cluster_id = data->cpus[policy->cpu].bpmp_cluster_id;
cluster = &data->clusters[cluster_id];
- cpufreq_cpu_put(policy);
return (cluster->ref_clk_khz * ndiv) / cluster->div;
}
diff --git a/drivers/devfreq/governor_passive.c b/drivers/devfreq/governor_passive.c
index 953cf9a1e9f7..cba58684ee06 100644
--- a/drivers/devfreq/governor_passive.c
+++ b/drivers/devfreq/governor_passive.c
@@ -80,7 +80,7 @@ static int get_target_freq_with_cpufreq(struct devfreq *devfreq,
struct devfreq_passive_data *p_data =
(struct devfreq_passive_data *)devfreq->data;
struct devfreq_cpu_data *parent_cpu_data;
- struct cpufreq_policy *policy;
+ struct cpufreq_policy *policy __free(put_cpufreq_policy);
unsigned long cpu, cpu_cur, cpu_min, cpu_max, cpu_percent;
unsigned long dev_min, dev_max;
unsigned long freq = 0;
@@ -94,10 +94,8 @@ static int get_target_freq_with_cpufreq(struct devfreq *devfreq,
}
parent_cpu_data = get_parent_cpu_data(p_data, policy);
- if (!parent_cpu_data) {
- cpufreq_cpu_put(policy);
+ if (!parent_cpu_data)
continue;
- }
/* Get target freq via required opps */
cpu_cur = parent_cpu_data->cur_freq * HZ_PER_KHZ;
@@ -106,7 +104,6 @@ static int get_target_freq_with_cpufreq(struct devfreq *devfreq,
devfreq->opp_table, &cpu_cur);
if (freq) {
*target_freq = max(freq, *target_freq);
- cpufreq_cpu_put(policy);
continue;
}
@@ -121,7 +118,6 @@ static int get_target_freq_with_cpufreq(struct devfreq *devfreq,
freq = dev_min + mult_frac(dev_max - dev_min, cpu_percent, 100);
*target_freq = max(freq, *target_freq);
- cpufreq_cpu_put(policy);
}
return ret;
@@ -256,7 +252,7 @@ static int cpufreq_passive_register_notifier(struct devfreq *devfreq)
struct device *dev = devfreq->dev.parent;
struct opp_table *opp_table = NULL;
struct devfreq_cpu_data *parent_cpu_data;
- struct cpufreq_policy *policy;
+ struct cpufreq_policy *policy __free(put_cpufreq_policy);
struct device *cpu_dev;
unsigned int cpu;
int ret;
@@ -280,16 +276,14 @@ static int cpufreq_passive_register_notifier(struct devfreq *devfreq)
}
parent_cpu_data = get_parent_cpu_data(p_data, policy);
- if (parent_cpu_data) {
- cpufreq_cpu_put(policy);
+ if (parent_cpu_data)
continue;
- }
parent_cpu_data = kzalloc(sizeof(*parent_cpu_data),
GFP_KERNEL);
if (!parent_cpu_data) {
ret = -ENOMEM;
- goto err_put_policy;
+ goto err;
}
cpu_dev = get_cpu_device(cpu);
@@ -314,7 +308,6 @@ static int cpufreq_passive_register_notifier(struct devfreq *devfreq)
parent_cpu_data->max_freq = policy->cpuinfo.max_freq;
list_add_tail(&parent_cpu_data->node, &p_data->cpu_data_list);
- cpufreq_cpu_put(policy);
}
mutex_lock(&devfreq->lock);
@@ -327,8 +320,6 @@ static int cpufreq_passive_register_notifier(struct devfreq *devfreq)
err_free_cpu_data:
kfree(parent_cpu_data);
-err_put_policy:
- cpufreq_cpu_put(policy);
err:
return ret;
diff --git a/drivers/gpu/drm/i915/gt/intel_llc.c b/drivers/gpu/drm/i915/gt/intel_llc.c
index 1d19c073ba2e..53cef2ab133d 100644
--- a/drivers/gpu/drm/i915/gt/intel_llc.c
+++ b/drivers/gpu/drm/i915/gt/intel_llc.c
@@ -29,13 +29,12 @@ static struct intel_gt *llc_to_gt(struct intel_llc *llc)
static unsigned int cpu_max_MHz(void)
{
- struct cpufreq_policy *policy;
+ struct cpufreq_policy *policy __free(put_cpufreq_policy);
unsigned int max_khz;
policy = cpufreq_cpu_get(0);
if (policy) {
max_khz = policy->cpuinfo.max_freq;
- cpufreq_cpu_put(policy);
} else {
/*
* Default to measured freq if none found, PCU will ensure we
diff --git a/drivers/macintosh/windfarm_cpufreq_clamp.c b/drivers/macintosh/windfarm_cpufreq_clamp.c
index 28d18ef22bbb..f05e2167481f 100644
--- a/drivers/macintosh/windfarm_cpufreq_clamp.c
+++ b/drivers/macintosh/windfarm_cpufreq_clamp.c
@@ -62,7 +62,7 @@ static const struct wf_control_ops clamp_ops = {
static int __init wf_cpufreq_clamp_init(void)
{
- struct cpufreq_policy *policy;
+ struct cpufreq_policy *policy __free(put_cpufreq_policy);
struct wf_control *clamp;
struct device *dev;
int ret;
@@ -79,8 +79,6 @@ static int __init wf_cpufreq_clamp_init(void)
ret = freq_qos_add_request(&policy->constraints, &qos_req, FREQ_QOS_MAX,
max_freq);
- cpufreq_cpu_put(policy);
-
if (ret < 0) {
pr_err("%s: Failed to add freq constraint (%d)\n", __func__,
ret);
diff --git a/drivers/powercap/dtpm_cpu.c b/drivers/powercap/dtpm_cpu.c
index 99390ec1481f..65117569d0f3 100644
--- a/drivers/powercap/dtpm_cpu.c
+++ b/drivers/powercap/dtpm_cpu.c
@@ -144,19 +144,16 @@ static int update_pd_power_uw(struct dtpm *dtpm)
static void pd_release(struct dtpm *dtpm)
{
struct dtpm_cpu *dtpm_cpu = to_dtpm_cpu(dtpm);
- struct cpufreq_policy *policy;
+ struct cpufreq_policy *policy __free(put_cpufreq_policy);
if (freq_qos_request_active(&dtpm_cpu->qos_req))
freq_qos_remove_request(&dtpm_cpu->qos_req);
policy = cpufreq_cpu_get(dtpm_cpu->cpu);
- if (policy) {
+ if (policy)
for_each_cpu(dtpm_cpu->cpu, policy->related_cpus)
per_cpu(dtpm_per_cpu, dtpm_cpu->cpu) = NULL;
- cpufreq_cpu_put(policy);
- }
-
kfree(dtpm_cpu);
}
@@ -192,7 +189,7 @@ static int cpuhp_dtpm_cpu_online(unsigned int cpu)
static int __dtpm_cpu_setup(int cpu, struct dtpm *parent)
{
struct dtpm_cpu *dtpm_cpu;
- struct cpufreq_policy *policy;
+ struct cpufreq_policy *policy __free(put_cpufreq_policy);
struct em_perf_state *table;
struct em_perf_domain *pd;
char name[CPUFREQ_NAME_LEN];
@@ -207,16 +204,12 @@ static int __dtpm_cpu_setup(int cpu, struct dtpm *parent)
return 0;
pd = em_cpu_get(cpu);
- if (!pd || em_is_artificial(pd)) {
- ret = -EINVAL;
- goto release_policy;
- }
+ if (!pd || em_is_artificial(pd))
+ return -EINVAL;
dtpm_cpu = kzalloc(sizeof(*dtpm_cpu), GFP_KERNEL);
- if (!dtpm_cpu) {
- ret = -ENOMEM;
- goto release_policy;
- }
+ if (!dtpm_cpu)
+ return -ENOMEM;
dtpm_init(&dtpm_cpu->dtpm, &dtpm_ops);
dtpm_cpu->cpu = cpu;
@@ -239,7 +232,6 @@ static int __dtpm_cpu_setup(int cpu, struct dtpm *parent)
if (ret < 0)
goto out_dtpm_unregister;
- cpufreq_cpu_put(policy);
return 0;
out_dtpm_unregister:
@@ -251,8 +243,6 @@ static int __dtpm_cpu_setup(int cpu, struct dtpm *parent)
per_cpu(dtpm_per_cpu, cpu) = NULL;
kfree(dtpm_cpu);
-release_policy:
- cpufreq_cpu_put(policy);
return ret;
}
diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c
index 38c993d1bcb3..1478ccb99553 100644
--- a/drivers/thermal/imx_thermal.c
+++ b/drivers/thermal/imx_thermal.c
@@ -543,7 +543,7 @@ static int imx_thermal_register_legacy_cooling(struct imx_thermal_data *data)
struct device_node *np;
int ret = 0;
- data->policy = cpufreq_cpu_get(0);
+ data->policy __free(put_cpufreq_policy) = cpufreq_cpu_get(0);
if (!data->policy) {
pr_debug("%s: CPUFreq policy not found\n", __func__);
return -EPROBE_DEFER;
@@ -553,10 +553,8 @@ static int imx_thermal_register_legacy_cooling(struct imx_thermal_data *data)
if (!np || !of_property_present(np, "#cooling-cells")) {
data->cdev = cpufreq_cooling_register(data->policy);
- if (IS_ERR(data->cdev)) {
+ if (IS_ERR(data->cdev))
ret = PTR_ERR(data->cdev);
- cpufreq_cpu_put(data->policy);
- }
}
of_node_put(np);
@@ -567,7 +565,6 @@ static int imx_thermal_register_legacy_cooling(struct imx_thermal_data *data)
static void imx_thermal_unregister_legacy_cooling(struct imx_thermal_data *data)
{
cpufreq_cooling_unregister(data->cdev);
- cpufreq_cpu_put(data->policy);
}
#else
diff --git a/drivers/thermal/ti-soc-thermal/ti-thermal-common.c b/drivers/thermal/ti-soc-thermal/ti-thermal-common.c
index 0cf0826b805a..7ce023bf01b5 100644
--- a/drivers/thermal/ti-soc-thermal/ti-thermal-common.c
+++ b/drivers/thermal/ti-soc-thermal/ti-thermal-common.c
@@ -234,7 +234,7 @@ int ti_thermal_register_cpu_cooling(struct ti_bandgap *bgp, int id)
if (!data)
return -EINVAL;
- data->policy = cpufreq_cpu_get(0);
+ data->policy __free(put_cpufreq_policy) = cpufreq_cpu_get(0);
if (!data->policy) {
pr_debug("%s: CPUFreq policy not found\n", __func__);
return -EPROBE_DEFER;
@@ -246,7 +246,6 @@ int ti_thermal_register_cpu_cooling(struct ti_bandgap *bgp, int id)
int ret = PTR_ERR(data->cool_dev);
dev_err(bgp->dev, "Failed to register cpu cooling device %d\n",
ret);
- cpufreq_cpu_put(data->policy);
return ret;
}
@@ -263,8 +262,6 @@ int ti_thermal_unregister_cpu_cooling(struct ti_bandgap *bgp, int id)
if (!IS_ERR_OR_NULL(data)) {
cpufreq_cooling_unregister(data->cool_dev);
- if (data->policy)
- cpufreq_cpu_put(data->policy);
}
return 0;
diff --git a/kernel/power/energy_model.c b/kernel/power/energy_model.c
index ea7995a25780..4f91112c10bd 100644
--- a/kernel/power/energy_model.c
+++ b/kernel/power/energy_model.c
@@ -451,7 +451,7 @@ static void
em_cpufreq_update_efficiencies(struct device *dev, struct em_perf_state *table)
{
struct em_perf_domain *pd = dev->em_pd;
- struct cpufreq_policy *policy;
+ struct cpufreq_policy *policy __free(put_cpufreq_policy);
int found = 0;
int i, cpu;
@@ -479,8 +479,6 @@ em_cpufreq_update_efficiencies(struct device *dev, struct em_perf_state *table)
found++;
}
- cpufreq_cpu_put(policy);
-
if (!found)
return;
@@ -787,7 +785,7 @@ static void em_check_capacity_update(void)
/* Check if CPUs capacity has changed than update EM */
for_each_possible_cpu(cpu) {
- struct cpufreq_policy *policy;
+ struct cpufreq_policy *policy __free(put_cpufreq_policy);
struct em_perf_domain *pd;
struct device *dev;
@@ -801,7 +799,6 @@ static void em_check_capacity_update(void)
msecs_to_jiffies(1000));
break;
}
- cpufreq_cpu_put(policy);
dev = get_cpu_device(cpu);
pd = em_pd_get(dev);
--
2.25.1
On Mon, Aug 25, 2025 at 11:29 AM Zihuan Zhang <zhangzihuan@kylinos.cn> 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 <zhangzihuan@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(-) This changes different pieces of code maintained by different people and the changes are not interdependent AFAICS, so better send it as a series of separate patches. Thanks!
在 2025/8/25 22:13, Rafael J. Wysocki 写道: > On Mon, Aug 25, 2025 at 11:29 AM Zihuan Zhang <zhangzihuan@kylinos.cn> 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 <zhangzihuan@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(-) > This changes different pieces of code maintained by different people > and the changes are not interdependent AFAICS, so better send it as a > series of separate patches. > > Thanks! Thanks for the suggestion. I agree, splitting it into a series will make the review much clearer.
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 <zhangzihuan@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
在 2025/8/25 19:28, Gautam Menghani 写道:
> 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 <zhangzihuan@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
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!
© 2016 - 2026 Red Hat, Inc.