From cc1810363579b8d6bf7dd8d681b831f33209bbb0 Mon Sep 17 00:00:00 2001 From: Thomas Lamprecht Date: Thu, 21 Oct 2021 09:51:22 +0200 Subject: [PATCH] cfg2cmd: switch off ACPI hotplug on bridges for q35 VMs See commit 17858a1695 (hw/acpi/ich9: Set ACPI PCI hot-plug as default on Q35)[0] in upstream QEMU repository for details about why the change was made. As that change affects systemds predictable interface naming[1], e.g., by going from a previously `ens18` name to `enp6s18`, it may have rather bad effects for users that did not setup some .link files to enforce a specific naming by an more stable information like the NIC's MAC-Address The alternative would be making the preferred mode of hotplug an option like `hotplug-mode=`, but it does not seems like one would like to change that much in the first place... Note the changes to the tests and especially the tests with q35 machines that did not change. [0]: https://gitlab.com/qemu-project/qemu/-/commit/17858a1695 [1]: https://www.freedesktop.org/software/systemd/man/systemd.net-naming-scheme.html#Naming Signed-off-by: Thomas Lamprecht Acked-by: Wolfgang Bumiller Reviewed-by: Dominik Csapak Tested-by: Dominik Csapak Signed-off-by: Thomas Lamprecht --- PVE/QemuServer.pm | 29 +++++++++++++++++++ .../q35-linux-hostpci-multifunction.conf.cmd | 1 + test/cfg2cmd/q35-linux-hostpci.conf.cmd | 1 + test/cfg2cmd/q35-simple.conf.cmd | 1 + 4 files changed, 32 insertions(+) diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index 669f4f8d..763c4128 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -2158,6 +2158,31 @@ sub new_meta_info_string { ); } +sub qemu_created_version_fixups { + my ($conf, $forcemachine, $kvmver) = @_; + + my $meta = parse_meta_info($conf->{meta}) // {}; + my $forced_vers = PVE::QemuServer::Machine::extract_version($forcemachine); + + # check if we need to apply some handling for VMs that always use the latest machine version but + # had a machine version transition happen that affected HW such that, e.g., an OS config change + # would be required (we do not want to pin machine version for non-windows OS type) + if ( + (!defined($conf->{machine}) || $conf->{machine} =~ m/^(?:pc|q35|virt)$/) # non-versioned machine + && (!defined($meta->{'creation-qemu'}) || !min_version($meta->{'creation-qemu'}, 6, 1)) # created before 6.1 + && (!$forced_vers || min_version($forced_vers, 6, 1)) # handle snapshot-rollback/migrations + && min_version($kvmver, 6, 1) # only need to apply the change since 6.1 + ) { + my $q35 = PVE::QemuServer::Machine::machine_type_is_q35($conf); + if ($q35 && $conf->{ostype} && $conf->{ostype} eq 'l26') { + # this changed to default-on in Q 6.1 for q35 machines, it will mess with PCI slot view + # and thus with the predictable interface naming of systemd + return ['-global', 'ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off']; + } + } + return; +} + PVE::JSONSchema::register_format('pve-qm-usb-device', \&verify_usb_device); sub verify_usb_device { my ($value, $noerr) = @_; @@ -3554,6 +3579,10 @@ sub config_to_command { } } + if (defined(my $fixups = qemu_created_version_fixups($conf, $forcemachine, $kvmver))) { + push @$cmd, $fixups->@*; + } + if ($conf->{vmgenid}) { push @$devices, '-device', 'vmgenid,guid='.$conf->{vmgenid}; } diff --git a/test/cfg2cmd/q35-linux-hostpci-multifunction.conf.cmd b/test/cfg2cmd/q35-linux-hostpci-multifunction.conf.cmd index 1f9beda8..d3939069 100644 --- a/test/cfg2cmd/q35-linux-hostpci-multifunction.conf.cmd +++ b/test/cfg2cmd/q35-linux-hostpci-multifunction.conf.cmd @@ -11,6 +11,7 @@ -smbios 'type=1,uuid=3dd750ce-d910-44d0-9493-525c0be4e687' \ -drive 'if=pflash,unit=0,format=raw,readonly=on,file=/usr/share/pve-edk2-firmware//OVMF_CODE.fd' \ -drive 'if=pflash,unit=1,format=qcow2,id=drive-efidisk0,file=/var/lib/vz/images/100/vm-100-disk-1.qcow2' \ + -global 'ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off' \ -smp '2,sockets=2,cores=1,maxcpus=2' \ -nodefaults \ -boot 'menu=on,strict=on,reboot-timeout=1000,splash=/usr/share/qemu-server/bootsplash.jpg' \ diff --git a/test/cfg2cmd/q35-linux-hostpci.conf.cmd b/test/cfg2cmd/q35-linux-hostpci.conf.cmd index dd1becef..5da5c354 100644 --- a/test/cfg2cmd/q35-linux-hostpci.conf.cmd +++ b/test/cfg2cmd/q35-linux-hostpci.conf.cmd @@ -11,6 +11,7 @@ -smbios 'type=1,uuid=3dd750ce-d910-44d0-9493-525c0be4e687' \ -drive 'if=pflash,unit=0,format=raw,readonly=on,file=/usr/share/pve-edk2-firmware//OVMF_CODE.fd' \ -drive 'if=pflash,unit=1,format=qcow2,id=drive-efidisk0,file=/var/lib/vz/images/100/vm-100-disk-1.qcow2' \ + -global 'ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off' \ -smp '2,sockets=2,cores=1,maxcpus=2' \ -nodefaults \ -boot 'menu=on,strict=on,reboot-timeout=1000,splash=/usr/share/qemu-server/bootsplash.jpg' \ diff --git a/test/cfg2cmd/q35-simple.conf.cmd b/test/cfg2cmd/q35-simple.conf.cmd index 5045caf8..1c97a890 100644 --- a/test/cfg2cmd/q35-simple.conf.cmd +++ b/test/cfg2cmd/q35-simple.conf.cmd @@ -11,6 +11,7 @@ -smbios 'type=1,uuid=3dd750ce-d910-44d0-9493-525c0be4e687' \ -drive 'if=pflash,unit=0,format=raw,readonly=on,file=/usr/share/pve-edk2-firmware//OVMF_CODE.fd' \ -drive 'if=pflash,unit=1,format=qcow2,id=drive-efidisk0,file=/var/lib/vz/images/100/vm-100-disk-1.qcow2' \ + -global 'ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off' \ -smp '2,sockets=1,cores=2,maxcpus=2' \ -nodefaults \ -boot 'menu=on,strict=on,reboot-timeout=1000,splash=/usr/share/qemu-server/bootsplash.jpg' \