| From d405ec23df13e6df599f5bd965a55d13420366b8 Mon Sep 17 00:00:00 2001 |
| From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com> |
| Date: Tue, 12 Aug 2025 14:57:06 +0200 |
| Subject: ACPI: processor: perflib: Move problematic pr->performance check |
| |
| From: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| |
| commit d405ec23df13e6df599f5bd965a55d13420366b8 upstream. |
| |
| Commit d33bd88ac0eb ("ACPI: processor: perflib: Fix initial _PPC limit |
| application") added a pr->performance check that prevents the frequency |
| QoS request from being added when the given processor has no performance |
| object. Unfortunately, this causes a WARN() in freq_qos_remove_request() |
| to trigger on an attempt to take the given CPU offline later because the |
| frequency QoS object has not been added for it due to the missing |
| performance object. |
| |
| Address this by moving the pr->performance check before calling |
| acpi_processor_get_platform_limit() so it only prevents a limit from |
| being set for the CPU if the performance object is not present. This |
| way, the frequency QoS request is added as it was before the above |
| commit and it is present all the time along with the CPU's cpufreq |
| policy regardless of whether or not the CPU is online. |
| |
| Fixes: d33bd88ac0eb ("ACPI: processor: perflib: Fix initial _PPC limit application") |
| Tested-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Cc: 5.4+ <stable@vger.kernel.org> # 5.4+ |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Link: https://patch.msgid.link/2801421.mvXUDI8C0e@rafael.j.wysocki |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/acpi/processor_perflib.c | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/acpi/processor_perflib.c |
| +++ b/drivers/acpi/processor_perflib.c |
| @@ -181,7 +181,7 @@ void acpi_processor_ppc_init(struct cpuf |
| struct acpi_processor *pr = per_cpu(processors, cpu); |
| int ret; |
| |
| - if (!pr || !pr->performance) |
| + if (!pr) |
| continue; |
| |
| /* |
| @@ -198,6 +198,9 @@ void acpi_processor_ppc_init(struct cpuf |
| pr_err("Failed to add freq constraint for CPU%d (%d)\n", |
| cpu, ret); |
| |
| + if (!pr->performance) |
| + continue; |
| + |
| ret = acpi_processor_get_platform_limit(pr); |
| if (ret) |
| pr_err("Failed to update freq constraint for CPU%d (%d)\n", |