virt-manager/003-cpu-Prefer-maximum-mode-for-many-emulated-guests.patch

241 lines
10 KiB
Diff

Subject: cpu: Prefer maximum mode for many emulated guests
From: Andrea Bolognani abologna@redhat.com Fri Dec 6 23:02:29 2024 +0100
Date: Tue Dec 10 14:01:32 2024 +0100:
Git: 8af438dd58cafe90d591eef25e7510c313cf3036
The actual default CPU at the QEMU level is often a relatively
poor choice, which is stuck with just baseline functionality
and can sometimes not run modern guests at all.
Whenever possible, prefer maximum mode for a much nicer out of
the box experience.
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
diff --git a/tests/data/cli/compare/virt-install-aarch64-machdefault.xml b/tests/data/cli/compare/virt-install-aarch64-machdefault.xml
index f88a0fc17..d17c82573 100644
--- a/tests/data/cli/compare/virt-install-aarch64-machdefault.xml
+++ b/tests/data/cli/compare/virt-install-aarch64-machdefault.xml
@@ -18,9 +18,7 @@
<features>
<acpi/>
</features>
- <cpu mode="custom" match="exact">
- <model>cortex-a57</model>
- </cpu>
+ <cpu mode="maximum"/>
<clock offset="utc"/>
<devices>
<emulator>/usr/bin/qemu-system-aarch64</emulator>
diff --git a/tests/data/cli/compare/virt-install-aarch64-machvirt.xml b/tests/data/cli/compare/virt-install-aarch64-machvirt.xml
index f88a0fc17..d17c82573 100644
--- a/tests/data/cli/compare/virt-install-aarch64-machvirt.xml
+++ b/tests/data/cli/compare/virt-install-aarch64-machvirt.xml
@@ -18,9 +18,7 @@
<features>
<acpi/>
</features>
- <cpu mode="custom" match="exact">
- <model>cortex-a57</model>
- </cpu>
+ <cpu mode="maximum"/>
<clock offset="utc"/>
<devices>
<emulator>/usr/bin/qemu-system-aarch64</emulator>
diff --git a/tests/data/cli/compare/virt-install-arm-defaultmach-f20.xml b/tests/data/cli/compare/virt-install-arm-defaultmach-f20.xml
index b56d07880..bc8006252 100644
--- a/tests/data/cli/compare/virt-install-arm-defaultmach-f20.xml
+++ b/tests/data/cli/compare/virt-install-arm-defaultmach-f20.xml
@@ -15,6 +15,7 @@
<initrd>/f19-arm.initrd</initrd>
<cmdline>foo</cmdline>
</os>
+ <cpu mode="maximum"/>
<clock offset="utc"/>
<devices>
<emulator>/usr/bin/qemu-system-arm</emulator>
diff --git a/tests/data/cli/compare/virt-install-arm-virt-f20.xml b/tests/data/cli/compare/virt-install-arm-virt-f20.xml
index 9d2001697..dc74281b7 100644
--- a/tests/data/cli/compare/virt-install-arm-virt-f20.xml
+++ b/tests/data/cli/compare/virt-install-arm-virt-f20.xml
@@ -15,6 +15,7 @@
<initrd>/f19-arm.initrd</initrd>
<cmdline>console=ttyAMA0,1234 rw root=/dev/vda3</cmdline>
</os>
+ <cpu mode="maximum"/>
<clock offset="utc"/>
<devices>
<emulator>/usr/bin/qemu-system-arm</emulator>
diff --git a/tests/data/cli/compare/virt-install-riscv64-cdrom.xml b/tests/data/cli/compare/virt-install-riscv64-cdrom.xml
index 35cd1e712..1d6bd923c 100644
--- a/tests/data/cli/compare/virt-install-riscv64-cdrom.xml
+++ b/tests/data/cli/compare/virt-install-riscv64-cdrom.xml
@@ -14,6 +14,7 @@
<boot dev="cdrom"/>
<boot dev="hd"/>
</os>
+ <cpu mode="maximum"/>
<clock offset="utc"/>
<devices>
<emulator>/usr/bin/qemu-system-riscv64</emulator>
@@ -92,6 +93,7 @@
<type arch="riscv64" machine="virt">hvm</type>
<boot dev="hd"/>
</os>
+ <cpu mode="maximum"/>
<clock offset="utc"/>
<devices>
<emulator>/usr/bin/qemu-system-riscv64</emulator>
diff --git a/tests/data/cli/compare/virt-install-riscv64-cloud-init.xml b/tests/data/cli/compare/virt-install-riscv64-cloud-init.xml
index b83937ca5..815f93ea0 100644
--- a/tests/data/cli/compare/virt-install-riscv64-cloud-init.xml
+++ b/tests/data/cli/compare/virt-install-riscv64-cloud-init.xml
@@ -12,6 +12,7 @@
<os firmware="efi">
<type arch="riscv64" machine="virt">hvm</type>
</os>
+ <cpu mode="maximum"/>
<clock offset="utc"/>
<devices>
<emulator>/usr/bin/qemu-system-riscv64</emulator>
@@ -87,6 +88,7 @@
<type arch="riscv64" machine="virt">hvm</type>
<boot dev="hd"/>
</os>
+ <cpu mode="maximum"/>
<clock offset="utc"/>
<devices>
<emulator>/usr/bin/qemu-system-riscv64</emulator>
diff --git a/tests/data/cli/compare/virt-install-riscv64-graphics.xml b/tests/data/cli/compare/virt-install-riscv64-graphics.xml
index 659dae74f..04ab41933 100644
--- a/tests/data/cli/compare/virt-install-riscv64-graphics.xml
+++ b/tests/data/cli/compare/virt-install-riscv64-graphics.xml
@@ -13,6 +13,7 @@
<type arch="riscv64" machine="virt">hvm</type>
<boot dev="hd"/>
</os>
+ <cpu mode="maximum"/>
<clock offset="utc"/>
<devices>
<emulator>/usr/bin/qemu-system-riscv64</emulator>
diff --git a/tests/data/cli/compare/virt-install-riscv64-headless.xml b/tests/data/cli/compare/virt-install-riscv64-headless.xml
index 939e71b2a..27328a123 100644
--- a/tests/data/cli/compare/virt-install-riscv64-headless.xml
+++ b/tests/data/cli/compare/virt-install-riscv64-headless.xml
@@ -13,6 +13,7 @@
<type arch="riscv64" machine="virt">hvm</type>
<boot dev="hd"/>
</os>
+ <cpu mode="maximum"/>
<clock offset="utc"/>
<devices>
<emulator>/usr/bin/qemu-system-riscv64</emulator>
diff --git a/tests/data/cli/compare/virt-install-riscv64-kernel-boot.xml b/tests/data/cli/compare/virt-install-riscv64-kernel-boot.xml
index 640e5ee0d..c3714594a 100644
--- a/tests/data/cli/compare/virt-install-riscv64-kernel-boot.xml
+++ b/tests/data/cli/compare/virt-install-riscv64-kernel-boot.xml
@@ -15,6 +15,7 @@
<initrd>/initrd.img</initrd>
<cmdline>root=/dev/vda2</cmdline>
</os>
+ <cpu mode="maximum"/>
<clock offset="utc"/>
<devices>
<emulator>/usr/bin/qemu-system-riscv64</emulator>
diff --git a/tests/data/cli/compare/virt-install-riscv64-unattended.xml b/tests/data/cli/compare/virt-install-riscv64-unattended.xml
index 0a9f88b4e..7fdb32d04 100644
--- a/tests/data/cli/compare/virt-install-riscv64-unattended.xml
+++ b/tests/data/cli/compare/virt-install-riscv64-unattended.xml
@@ -12,6 +12,7 @@
<os firmware="efi">
<type arch="riscv64" machine="virt">hvm</type>
</os>
+ <cpu mode="maximum"/>
<clock offset="utc"/>
<devices>
<emulator>/usr/bin/qemu-system-riscv64</emulator>
@@ -90,6 +91,7 @@
<type arch="riscv64" machine="virt">hvm</type>
<boot dev="hd"/>
</os>
+ <cpu mode="maximum"/>
<clock offset="utc"/>
<devices>
<emulator>/usr/bin/qemu-system-riscv64</emulator>
diff --git a/tests/test_cli.py b/tests/test_cli.py
index 03c3316e1..dc9c156da 100644
--- a/tests/test_cli.py
+++ b/tests/test_cli.py
@@ -1247,7 +1247,7 @@ c.add_compare("--connect %(URI-KVM-ARMV7L)s --disk %(EXISTIMG1)s --import --os-v
c.add_valid("--arch aarch64 --osinfo fedora19 --nodisks --pxe --connect " + utils.URIs.kvm_x86_nodomcaps, grep="Libvirt version does not support UEFI") # attempt to default to aarch64 UEFI, but it fails, but should only print warnings
c.add_invalid("--arch aarch64 --nodisks --pxe --connect " + utils.URIs.kvm_x86, grep="OS name is required") # catch missing osinfo for non-x86
-c.add_compare("--arch aarch64 --osinfo fedora19 --machine virt --boot kernel=/f19-arm.kernel,initrd=/f19-arm.initrd,kernel_args=\"console=ttyAMA0,1234 rw root=/dev/vda3\" --disk %(EXISTIMG1)s", "aarch64-machvirt")
+c.add_compare("--arch aarch64 --osinfo fedora19 --machine virt --cpu default --boot kernel=/f19-arm.kernel,initrd=/f19-arm.initrd,kernel_args=\"console=ttyAMA0,1234 rw root=/dev/vda3\" --disk %(EXISTIMG1)s", "aarch64-machvirt")
c.add_compare("--arch aarch64 --osinfo fedora19 --boot kernel=/f19-arm.kernel,initrd=/f19-arm.initrd,kernel_args=\"console=ttyAMA0,1234 rw root=/dev/vda3\" --disk %(EXISTIMG1)s", "aarch64-machdefault")
c.add_compare("--arch aarch64 --cdrom %(ISO-F26-NETINST)s --boot loader=CODE.fd,nvram.template=VARS.fd --disk %(EXISTIMG1)s --cpu none --events on_crash=preserve,on_reboot=destroy,on_poweroff=restart", "aarch64-cdrom") # cdrom test, but also --cpu none override, --events override, and headless
c.add_compare("--connect %(URI-KVM-AARCH64)s --disk %(EXISTIMG1)s --import --os-variant fedora21 --panic default --graphics vnc", "aarch64-kvm-import") # --import test, but also test --panic no-op, and --graphics
diff --git a/virtinst/domain/cpu.py b/virtinst/domain/cpu.py
index 91a9481cf..cc4053f88 100644
--- a/virtinst/domain/cpu.py
+++ b/virtinst/domain/cpu.py
@@ -275,11 +275,26 @@ class DomainCpu(XMLBuilder):
SPECIAL_MODE_HOST_PASSTHROUGH, SPECIAL_MODE_MAXIMUM,
SPECIAL_MODE_CLEAR, SPECIAL_MODE_APP_DEFAULT]
+ def _should_use_maximum_cpu_mode(self, guest, domcaps):
+ if (domcaps.supports_maximum_cpu_mode() and
+ guest.type == "qemu" and
+ (guest.os.is_x86() or
+ guest.os.is_arm_machvirt() or
+ guest.os.is_riscv_virt() or
+ guest.os.is_loongarch64())):
+ return True
+
+ return False
+
def _get_app_default_mode(self, guest):
# Depending on if libvirt+qemu is new enough, we prefer
# host-passthrough, then host-model, and finally host-model-only
+ # Emulated guests use maximum mode if available
domcaps = guest.lookup_domcaps()
+ if (self._should_use_maximum_cpu_mode(guest, domcaps)):
+ return self.SPECIAL_MODE_MAXIMUM
+
if domcaps.supports_safe_host_passthrough():
return self.SPECIAL_MODE_HOST_PASSTHROUGH
@@ -460,9 +475,12 @@ class DomainCpu(XMLBuilder):
if guest.os.is_arm_machvirt() and guest.type == "kvm":
self.mode = self.SPECIAL_MODE_HOST_PASSTHROUGH
- elif guest.os.is_arm64() and guest.os.is_arm_machvirt():
- # -M virt defaults to a 32bit CPU, even if using aarch64
- self.set_model(guest, "cortex-a57")
-
elif guest.os.is_x86() and guest.type == "kvm":
self._set_cpu_x86_kvm_default(guest)
+
+ else:
+ domcaps = guest.lookup_domcaps()
+
+ # Prefer to emulate a feature-rich CPU instead of a basic one
+ if (self._should_use_maximum_cpu_mode(guest, domcaps)):
+ self.set_special_mode(guest, self.SPECIAL_MODE_MAXIMUM)
diff --git a/virtinst/domcapabilities.py b/virtinst/domcapabilities.py
index 3a19591d9..5d82a351e 100644
--- a/virtinst/domcapabilities.py
+++ b/virtinst/domcapabilities.py
@@ -382,6 +382,10 @@ class DomainCapabilities(XMLBuilder):
return (m and m.supported and
"on" in m.get_enum("hostPassthroughMigratable").get_values())
+ def supports_maximum_cpu_mode(self):
+ m = self.cpu.get_mode("maximum")
+ return (m and m.supported)
+
def get_cpu_models(self):
models = []