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