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>] [day] [month] [year] [list]
Message-ID: <20260116094555.2978887-1-zhangpengjie2@huawei.com>
Date: Fri, 16 Jan 2026 17:45:55 +0800
From: Pengjie Zhang <zhangpengjie2@...wei.com>
To: <rafael@...nel.org>, <viresh.kumar@...aro.org>
CC: <linux-pm@...r.kernel.org>, <linux-kernel@...r.kernel.org>,
	<zhanjie9@...ilicon.com>, <zhenglifeng1@...wei.com>, <lihuisong@...wei.com>,
	<yubowen8@...wei.com>, <linhongye@...artners.com>, <linuxarm@...wei.com>,
	<jonathan.cameron@...wei.com>, <zhangpengjie2@...wei.com>,
	<wangzhi12@...wei.com>
Subject: [PATCH] cpufreq: cppc: Use lowest_nonlinear_perf as a soft minimum limit

The ACPI 6.5 specification describes "Lowest Performance" as the absolute
lowest performance level of the platform. It notes:

"Selecting a performance level lower than the lowest nonlinear performance
level may actually cause an efficiency penalty, but should reduce the
instantaneous power consumption of the processor. In traditional terms,
this represents the T-state range of performance levels."

Currently, the cpufreq core initializes the minimum QoS request to 0.
While this allows userspace to modify limits, it causes the CPU frequency
to drop below lowest_nonlinear_perf by default. This hurts performance with
negligible power savings.

To fix this, implement a "soft" limit in cppc_verify_policy(). If the
policy minimum is still the default (0), it is clamped to
lowest_nonlinear_perf. However, if userspace has explicitly set a lower
limit, that configuration takes precedence.

Signed-off-by: Pengjie Zhang <zhangpengjie2@...wei.com>
---
 drivers/cpufreq/cppc_cpufreq.c | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c
index 9eac77c4f294..59aa1721438b 100644
--- a/drivers/cpufreq/cppc_cpufreq.c
+++ b/drivers/cpufreq/cppc_cpufreq.c
@@ -301,9 +301,23 @@ static unsigned int cppc_cpufreq_fast_switch(struct cpufreq_policy *policy,
 	return target_freq;
 }
 
-static int cppc_verify_policy(struct cpufreq_policy_data *policy)
+static int cppc_verify_policy(struct cpufreq_policy_data *policy_data)
 {
-	cpufreq_verify_within_cpu_limits(policy);
+	if (policy_data->min == FREQ_QOS_MIN_DEFAULT_VALUE) {
+		struct cpufreq_policy *policy __free(put_cpufreq_policy) =
+					      cpufreq_cpu_get(policy_data->cpu);
+		struct cppc_cpudata *cpu_data;
+
+		if (!policy)
+			return -EINVAL;
+
+		cpu_data = policy->driver_data;
+		policy_data->min = cppc_perf_to_khz(&cpu_data->perf_caps,
+			cpu_data->perf_caps.lowest_nonlinear_perf);
+	}
+
+	cpufreq_verify_within_cpu_limits(policy_data);
+
 	return 0;
 }
 
-- 
2.33.0


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ