Skip to content

Commit 6419b0b

Browse files
committed
ACPI: processor: perflib: Fix initial _PPC limit application
JIRA: https://issues.redhat.com/browse/RHEL-114091 commit d33bd88 Author: Jiayi Li <lijiayi@kylinos.cn> Date: Mon, 21 Jul 2025 15:21:48 +0000 If the BIOS sets a _PPC frequency limit upfront, it will fail to take effect due to a call ordering issue. Namely, freq_qos_update_request() is called before freq_qos_add_request() for the given request causing the constraint update to be ignored. The call sequence in question is as follows: cpufreq_policy_online() acpi_cpufreq_cpu_init() acpi_processor_register_performance() acpi_processor_get_performance_info() acpi_processor_get_platform_limit() freq_qos_update_request(&perflib_req) <- inactive QoS request blocking_notifier_call_chain(&cpufreq_policy_notifier_list, CPUFREQ_CREATE_POLICY) acpi_processor_notifier() acpi_processor_ppc_init() freq_qos_add_request(&perflib_req) <- QoS request activation Address this by adding an acpi_processor_get_platform_limit() call to acpi_processor_ppc_init(), after the perflib_req activation via freq_qos_add_request(), which causes the initial _PPC limit to be picked up as appropriate. However, also ensure that the _PPC limit will not be picked up in the cases when the cpufreq driver does not call acpi_processor_register_performance() by adding a pr->performance check to the related_cpus loop in acpi_processor_ppc_init(). Fixes: d15ce41 ("ACPI: cpufreq: Switch to QoS requests instead of cpufreq notifier") Signed-off-by: Jiayi Li <lijiayi@kylinos.cn> Link: https://patch.msgid.link/20250721032606.3459369-1-lijiayi@kylinos.cn [ rjw: Consolidate pr-related checks in acpi_processor_ppc_init() ] [ rjw: Subject and changelog adjustments ] Cc: 5.4+ <stable@vger.kernel.org> # 5.4+: 2d8b39a ACPI: processor: Avoid NULL pointer dereferences at init time Cc: 5.4+ <stable@vger.kernel.org> # 5.4+: 3000ce3 cpufreq: Use per-policy frequency QoS Cc: 5.4+ <stable@vger.kernel.org> # 5.4+: a1bb46c ACPI: processor: Add QoS requests for all CPUs Cc: 5.4+ <stable@vger.kernel.org> # 5.4+ Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Signed-off-by: Mark Langsdorf <mlangsdo@redhat.com>
1 parent 7e67a0a commit 6419b0b

File tree

1 file changed

+9
-1
lines changed

1 file changed

+9
-1
lines changed

drivers/acpi/processor_perflib.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,11 +172,14 @@ void acpi_processor_ppc_init(struct cpufreq_policy *policy)
172172
{
173173
unsigned int cpu;
174174

175+
if (ignore_ppc == 1)
176+
return;
177+
175178
for_each_cpu(cpu, policy->related_cpus) {
176179
struct acpi_processor *pr = per_cpu(processors, cpu);
177180
int ret;
178181

179-
if (!pr)
182+
if (!pr || !pr->performance)
180183
continue;
181184

182185
/*
@@ -192,6 +195,11 @@ void acpi_processor_ppc_init(struct cpufreq_policy *policy)
192195
if (ret < 0)
193196
pr_err("Failed to add freq constraint for CPU%d (%d)\n",
194197
cpu, ret);
198+
199+
ret = acpi_processor_get_platform_limit(pr);
200+
if (ret)
201+
pr_err("Failed to update freq constraint for CPU%d (%d)\n",
202+
cpu, ret);
195203
}
196204
}
197205

0 commit comments

Comments
 (0)