241 lines
10 KiB
Diff
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 = []
|
|
|