[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <aKxI8D5mgLRyydb3@li-c6426e4c-27cf-11b2-a85c-95d65bc0de0e.ibm.com>
Date: Mon, 25 Aug 2025 16:58:48 +0530
From: Gautam Menghani <gautam@...ux.ibm.com>
To: Zihuan Zhang <zhangzihuan@...inos.cn>
Cc: "Rafael J . wysocki" <rafael@...nel.org>,
Viresh Kumar <viresh.kumar@...aro.org>,
Catalin Marinas <catalin.marinas@....com>,
Will Deacon <will@...nel.org>, Sean Christopherson <seanjc@...gle.com>,
Paolo Bonzini <pbonzini@...hat.com>,
Thomas Gleixner <tglx@...utronix.de>, Ingo Molnar <mingo@...hat.com>,
Borislav Petkov <bp@...en8.de>,
Dave Hansen <dave.hansen@...ux.intel.com>,
Markus Mayer <mmayer@...adcom.com>,
Florian Fainelli <florian.fainelli@...adcom.com>,
Srinivas Pandruvada <srinivas.pandruvada@...ux.intel.com>,
Madhavan Srinivasan <maddy@...ux.ibm.com>,
Michael Ellerman <mpe@...erman.id.au>,
Krzysztof Kozlowski <krzk@...nel.org>,
Alim Akhtar <alim.akhtar@...sung.com>,
Thierry Reding <thierry.reding@...il.com>,
Jonathan Hunter <jonathanh@...dia.com>,
MyungJoo Ham <myungjoo.ham@...sung.com>,
Kyungmin Park <kyungmin.park@...sung.com>,
Chanwoo Choi <cw00.choi@...sung.com>,
Jani Nikula <jani.nikula@...ux.intel.com>,
Joonas Lahtinen <joonas.lahtinen@...ux.intel.com>,
Rodrigo Vivi <rodrigo.vivi@...el.com>,
Tvrtko Ursulin <tursulin@...ulin.net>,
David Airlie <airlied@...il.com>, Simona Vetter <simona@...ll.ch>,
Daniel Lezcano <daniel.lezcano@...nel.org>,
Sascha Hauer <s.hauer@...gutronix.de>, Shawn Guo <shawnguo@...nel.org>,
Eduardo Valentin <edubezval@...il.com>, Keerthy <j-keerthy@...com>,
Matthias Brugger <matthias.bgg@...il.com>,
AngeloGioacchino Del Regno <angelogioacchino.delregno@...labora.com>,
zhenglifeng <zhenglifeng1@...wei.com>,
"H . Peter Anvin" <hpa@...or.com>, Zhang Rui <rui.zhang@...el.com>,
Len Brown <lenb@...nel.org>, Nicholas Piggin <npiggin@...il.com>,
Christophe Leroy <christophe.leroy@...roup.eu>,
Lukasz Luba <lukasz.luba@....com>,
Pengutronix Kernel Team <kernel@...gutronix.de>,
Beata Michalska <beata.michalska@....com>,
Fabio Estevam <festevam@...il.com>, Pavel Machek <pavel@...nel.org>,
Sumit Gupta <sumitg@...dia.com>,
Prasanna Kumar T S M <ptsm@...ux.microsoft.com>,
Sudeep Holla <sudeep.holla@....com>,
Yicong Yang <yangyicong@...ilicon.com>, linux-pm@...r.kernel.org,
x86@...nel.org, kvm@...r.kernel.org, linux-acpi@...r.kernel.org,
linuxppc-dev@...ts.ozlabs.org, linux-samsung-soc@...r.kernel.org,
linux-arm-kernel@...ts.infradead.org, linux-tegra@...r.kernel.org,
intel-gfx@...ts.freedesktop.org, dri-devel@...ts.freedesktop.org,
imx@...ts.linux.dev, linux-omap@...r.kernel.org,
linux-mediatek@...ts.infradead.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH v1] cpufreq: use __free() for all cpufreq_cpu_get()
references
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@...inos.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
Powered by blists - more mailing lists