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 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 @@ - - cortex-a57 - + /usr/bin/qemu-system-aarch64 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 @@ - - cortex-a57 - + /usr/bin/qemu-system-aarch64 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 @@ /f19-arm.initrd foo + /usr/bin/qemu-system-arm 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 @@ /f19-arm.initrd console=ttyAMA0,1234 rw root=/dev/vda3 + /usr/bin/qemu-system-arm 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 @@ + /usr/bin/qemu-system-riscv64 @@ -92,6 +93,7 @@ hvm + /usr/bin/qemu-system-riscv64 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 @@ hvm + /usr/bin/qemu-system-riscv64 @@ -87,6 +88,7 @@ hvm + /usr/bin/qemu-system-riscv64 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 @@ hvm + /usr/bin/qemu-system-riscv64 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 @@ hvm + /usr/bin/qemu-system-riscv64 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.img root=/dev/vda2 + /usr/bin/qemu-system-riscv64 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 @@ hvm + /usr/bin/qemu-system-riscv64 @@ -90,6 +91,7 @@ hvm + /usr/bin/qemu-system-riscv64 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 = []