]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
x86/xen: disable CPU idle and frequency drivers for PVH dom0
authorRoger Pau Monne <roger.pau@citrix.com>
Mon, 7 Apr 2025 10:18:41 +0000 (12:18 +0200)
committerJuergen Gross <jgross@suse.com>
Tue, 8 Apr 2025 11:15:56 +0000 (13:15 +0200)
When running as a PVH dom0 the ACPI tables exposed to Linux are (mostly)
the native ones, thus exposing the C and P states, that can lead to
attachment of CPU idle and frequency drivers.  However the entity in
control of the CPU C and P states is Xen, as dom0 doesn't have a full view
of the system load, neither has all CPUs assigned and identity pinned.

Like it's done for classic PV guests, prevent Linux from using idle or
frequency state drivers when running as a PVH dom0.

On an AMD EPYC 7543P system without this fix a Linux PVH dom0 will keep the
host CPUs spinning at 100% even when dom0 is completely idle, as it's
attempting to use the acpi_idle driver.

Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Jason Andryuk <jason.andryuk@amd.com>
Signed-off-by: Juergen Gross <jgross@suse.com>
Message-ID: <20250407101842.67228-1-roger.pau@citrix.com>

arch/x86/xen/enlighten_pvh.c

index 0e3d930bcb89e8836ae7ba435f958b45da64437c..9d25d9373945cbe1167db018fd3d56aa28de4365 100644 (file)
@@ -1,5 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0
 #include <linux/acpi.h>
+#include <linux/cpufreq.h>
+#include <linux/cpuidle.h>
 #include <linux/export.h>
 #include <linux/mm.h>
 
@@ -123,8 +125,23 @@ static void __init pvh_arch_setup(void)
 {
        pvh_reserve_extra_memory();
 
-       if (xen_initial_domain())
+       if (xen_initial_domain()) {
                xen_add_preferred_consoles();
+
+               /*
+                * Disable usage of CPU idle and frequency drivers: when
+                * running as hardware domain the exposed native ACPI tables
+                * causes idle and/or frequency drivers to attach and
+                * malfunction.  It's Xen the entity that controls the idle and
+                * frequency states.
+                *
+                * For unprivileged domains the exposed ACPI tables are
+                * fabricated and don't contain such data.
+                */
+               disable_cpuidle();
+               disable_cpufreq();
+               WARN_ON(xen_set_default_idle());
+       }
 }
 
 void __init xen_pvh_init(struct boot_params *boot_params)