lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <c19b9a8c-bb7d-4d71-89d0-eb98c70a9a85@kylinos.cn>
Date: Tue, 26 Aug 2025 08:29:46 +0800
From: Zihuan Zhang <zhangzihuan@...inos.cn>
To: Gautam Menghani <gautam@...ux.ibm.com>
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


在 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@...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

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!




Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ