From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [IPv6:2a0f:8001:1:32::40]) by lore.proxmox.com (Postfix) with ESMTPS id D3B391FF0AF for ; Thu, 10 Sep 2026 13:09:03 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 745E2216AD; Thu, 10 Sep 2026 13:08:39 +0200 (CEST) From: Dominik Csapak To: pve-devel@lists.proxmox.com Subject: [PATCH qemu-server 0/6] add hotplug tests and fix uncovered bugs Date: Thu, 10 Sep 2026 13:00:27 +0200 Message-ID: <20260910110832.2822954-1-d.csapak@proxmox.com> X-Mailer: git-send-email 2.47.3 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.485 Adjusted score from AWL reputation of From: address DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment (newer systems) RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: 6LZZCVZR3IJYEYANYK4UXTGGJNTNQUM6 X-Message-ID-Hash: 6LZZCVZR3IJYEYANYK4UXTGGJNTNQUM6 X-MailFrom: d.csapak@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Recently it was uncovered that hotplugging scsiX >= 14 does not work in all situations. Inspired by this, this attempts to add some hotplug regression tests by simulating the qmp/hmp environment, recording the calls and testing against some invariants. This uncovered two additional bugs in the hotplug code: * hotplugging a tablet device into an aarch64 vm fails * failure to hotplug a disk with iothreds leaves the iothread behind The series first adds the harness + refactor of shared code from the cfg2cmd tests, then adds some tests that behave ok, then adds some tests that show some defect and finally it fixes the two mentioned bugs. If wanted i can fix the bugs and add the relevant regression test in one step, but this way it is much more visible how they fail. Dominik Csapak (6): tests: hotplug: add initial hotplug test harness tests: hotplug: add some test cases tests: hotplug: add cases for known defects tests: hotplug: add test case for adding scsi14 on qemu 11.1 hotplug: fix vm_deviceplug call for 'tablet' and 'keyboard' on aarch64 hotplug: remove iothread if adding drive device failed src/PVE/QemuServer.pm | 29 +- src/test/CommandLineMocks.pm | 556 +++++++++++++ src/test/Makefile | 12 +- .../aarch64/disk-add-default-machine.conf | 20 + .../disk-add-default-machine.conf.expected | 28 + src/test/hotplug/aarch64/disk-add-virtio.conf | 20 + .../aarch64/disk-add-virtio.conf.expected | 29 + .../hotplug/aarch64/net-add-pci-bridge.conf | 20 + .../aarch64/net-add-pci-bridge.conf.expected | 28 + src/test/hotplug/aarch64/net-add.conf | 20 + .../hotplug/aarch64/net-add.conf.expected | 28 + src/test/hotplug/aarch64/tablet-disable.conf | 20 + .../aarch64/tablet-disable.conf.expected | 25 + src/test/hotplug/aarch64/tablet-enable.conf | 21 + .../aarch64/tablet-enable.conf.expected | 25 + .../hotplug/aarch64/x86-guest-net-add.conf | 18 + .../aarch64/x86-guest-net-add.conf.expected | 26 + src/test/hotplug/agent-fstrim.conf | 17 + src/test/hotplug/agent-fstrim.conf.expected | 20 + src/test/hotplug/balloon.conf | 18 + src/test/hotplug/balloon.conf.expected | 22 + src/test/hotplug/cdrom-eject.conf | 17 + src/test/hotplug/cdrom-eject.conf.expected | 24 + src/test/hotplug/cpu-add-too-many.conf | 18 + .../hotplug/cpu-add-too-many.conf.expected | 25 + src/test/hotplug/cpu-add.conf | 18 + src/test/hotplug/cpu-add.conf.expected | 23 + src/test/hotplug/cpu-remove.conf | 18 + src/test/hotplug/cpu-remove.conf.expected | 23 + src/test/hotplug/cpulimit.conf | 16 + src/test/hotplug/cpulimit.conf.expected | 21 + .../hotplug/disk-add-default-machine.conf | 16 + .../disk-add-default-machine.conf.expected | 25 + src/test/hotplug/disk-add-fail.conf | 17 + src/test/hotplug/disk-add-fail.conf.expected | 32 + src/test/hotplug/disk-add-legacy-drive.conf | 16 + .../disk-add-legacy-drive.conf.expected | 23 + src/test/hotplug/disk-add-scsi-single.conf | 16 + .../disk-add-scsi-single.conf.expected | 27 + src/test/hotplug/disk-add-scsi14-old.conf | 15 + .../hotplug/disk-add-scsi14-old.conf.expected | 23 + .../hotplug/disk-add-scsi14-qemu11.1.conf | 15 + .../disk-add-scsi14-qemu11.1.conf.expected | 24 + src/test/hotplug/disk-add-virtio.conf | 16 + .../hotplug/disk-add-virtio.conf.expected | 26 + src/test/hotplug/disk-remove-bootdisk.conf | 16 + .../disk-remove-bootdisk.conf.expected | 23 + src/test/hotplug/disk-remove-busy.conf | 18 + .../hotplug/disk-remove-busy.conf.expected | 25 + src/test/hotplug/disk-remove-scsi-single.conf | 17 + .../disk-remove-scsi-single.conf.expected | 25 + src/test/hotplug/disk-remove-virtio.conf | 17 + .../hotplug/disk-remove-virtio.conf.expected | 24 + src/test/hotplug/disk-skip-ide.conf | 16 + src/test/hotplug/disk-skip-ide.conf.expected | 22 + src/test/hotplug/disk-throttle.conf | 16 + src/test/hotplug/disk-throttle.conf.expected | 20 + src/test/hotplug/fast-plug.conf | 17 + src/test/hotplug/fast-plug.conf.expected | 20 + src/test/hotplug/memory-add.conf | 18 + src/test/hotplug/memory-add.conf.expected | 25 + src/test/hotplug/memory-remove.conf | 18 + src/test/hotplug/memory-remove.conf.expected | 25 + src/test/hotplug/net-add-fail.conf | 17 + src/test/hotplug/net-add-fail.conf.expected | 28 + src/test/hotplug/net-add-pci-bridge.conf | 16 + .../hotplug/net-add-pci-bridge.conf.expected | 25 + src/test/hotplug/net-add.conf | 16 + src/test/hotplug/net-add.conf.expected | 25 + src/test/hotplug/net-change-bridge.conf | 16 + .../hotplug/net-change-bridge.conf.expected | 25 + src/test/hotplug/net-change-model.conf | 16 + .../hotplug/net-change-model.conf.expected | 27 + src/test/hotplug/net-change-rate.conf | 16 + .../hotplug/net-change-rate.conf.expected | 20 + src/test/hotplug/net-hotplug-disabled.conf | 17 + .../net-hotplug-disabled.conf.expected | 23 + src/test/hotplug/net-remove.conf | 17 + src/test/hotplug/net-remove.conf.expected | 22 + src/test/hotplug/tablet-disable.conf | 16 + src/test/hotplug/tablet-disable.conf.expected | 21 + src/test/hotplug/tablet-enable.conf | 17 + src/test/hotplug/tablet-enable.conf.expected | 21 + src/test/hotplug/usb-add-spice.conf | 17 + src/test/hotplug/usb-add-spice.conf.expected | 23 + src/test/hotplug/usb-add.conf | 16 + src/test/hotplug/usb-add.conf.expected | 22 + src/test/hotplug/usb-remove-last.conf | 17 + .../hotplug/usb-remove-last.conf.expected | 21 + src/test/run_config2command_tests.pl | 552 +------------ src/test/run_hotplug_tests.pl | 780 ++++++++++++++++++ 91 files changed, 3160 insertions(+), 547 deletions(-) create mode 100644 src/test/CommandLineMocks.pm create mode 100644 src/test/hotplug/aarch64/disk-add-default-machine.conf create mode 100644 src/test/hotplug/aarch64/disk-add-default-machine.conf.expected create mode 100644 src/test/hotplug/aarch64/disk-add-virtio.conf create mode 100644 src/test/hotplug/aarch64/disk-add-virtio.conf.expected create mode 100644 src/test/hotplug/aarch64/net-add-pci-bridge.conf create mode 100644 src/test/hotplug/aarch64/net-add-pci-bridge.conf.expected create mode 100644 src/test/hotplug/aarch64/net-add.conf create mode 100644 src/test/hotplug/aarch64/net-add.conf.expected create mode 100644 src/test/hotplug/aarch64/tablet-disable.conf create mode 100644 src/test/hotplug/aarch64/tablet-disable.conf.expected create mode 100644 src/test/hotplug/aarch64/tablet-enable.conf create mode 100644 src/test/hotplug/aarch64/tablet-enable.conf.expected create mode 100644 src/test/hotplug/aarch64/x86-guest-net-add.conf create mode 100644 src/test/hotplug/aarch64/x86-guest-net-add.conf.expected create mode 100644 src/test/hotplug/agent-fstrim.conf create mode 100644 src/test/hotplug/agent-fstrim.conf.expected create mode 100644 src/test/hotplug/balloon.conf create mode 100644 src/test/hotplug/balloon.conf.expected create mode 100644 src/test/hotplug/cdrom-eject.conf create mode 100644 src/test/hotplug/cdrom-eject.conf.expected create mode 100644 src/test/hotplug/cpu-add-too-many.conf create mode 100644 src/test/hotplug/cpu-add-too-many.conf.expected create mode 100644 src/test/hotplug/cpu-add.conf create mode 100644 src/test/hotplug/cpu-add.conf.expected create mode 100644 src/test/hotplug/cpu-remove.conf create mode 100644 src/test/hotplug/cpu-remove.conf.expected create mode 100644 src/test/hotplug/cpulimit.conf create mode 100644 src/test/hotplug/cpulimit.conf.expected create mode 100644 src/test/hotplug/disk-add-default-machine.conf create mode 100644 src/test/hotplug/disk-add-default-machine.conf.expected create mode 100644 src/test/hotplug/disk-add-fail.conf create mode 100644 src/test/hotplug/disk-add-fail.conf.expected create mode 100644 src/test/hotplug/disk-add-legacy-drive.conf create mode 100644 src/test/hotplug/disk-add-legacy-drive.conf.expected create mode 100644 src/test/hotplug/disk-add-scsi-single.conf create mode 100644 src/test/hotplug/disk-add-scsi-single.conf.expected create mode 100644 src/test/hotplug/disk-add-scsi14-old.conf create mode 100644 src/test/hotplug/disk-add-scsi14-old.conf.expected create mode 100644 src/test/hotplug/disk-add-scsi14-qemu11.1.conf create mode 100644 src/test/hotplug/disk-add-scsi14-qemu11.1.conf.expected create mode 100644 src/test/hotplug/disk-add-virtio.conf create mode 100644 src/test/hotplug/disk-add-virtio.conf.expected create mode 100644 src/test/hotplug/disk-remove-bootdisk.conf create mode 100644 src/test/hotplug/disk-remove-bootdisk.conf.expected create mode 100644 src/test/hotplug/disk-remove-busy.conf create mode 100644 src/test/hotplug/disk-remove-busy.conf.expected create mode 100644 src/test/hotplug/disk-remove-scsi-single.conf create mode 100644 src/test/hotplug/disk-remove-scsi-single.conf.expected create mode 100644 src/test/hotplug/disk-remove-virtio.conf create mode 100644 src/test/hotplug/disk-remove-virtio.conf.expected create mode 100644 src/test/hotplug/disk-skip-ide.conf create mode 100644 src/test/hotplug/disk-skip-ide.conf.expected create mode 100644 src/test/hotplug/disk-throttle.conf create mode 100644 src/test/hotplug/disk-throttle.conf.expected create mode 100644 src/test/hotplug/fast-plug.conf create mode 100644 src/test/hotplug/fast-plug.conf.expected create mode 100644 src/test/hotplug/memory-add.conf create mode 100644 src/test/hotplug/memory-add.conf.expected create mode 100644 src/test/hotplug/memory-remove.conf create mode 100644 src/test/hotplug/memory-remove.conf.expected create mode 100644 src/test/hotplug/net-add-fail.conf create mode 100644 src/test/hotplug/net-add-fail.conf.expected create mode 100644 src/test/hotplug/net-add-pci-bridge.conf create mode 100644 src/test/hotplug/net-add-pci-bridge.conf.expected create mode 100644 src/test/hotplug/net-add.conf create mode 100644 src/test/hotplug/net-add.conf.expected create mode 100644 src/test/hotplug/net-change-bridge.conf create mode 100644 src/test/hotplug/net-change-bridge.conf.expected create mode 100644 src/test/hotplug/net-change-model.conf create mode 100644 src/test/hotplug/net-change-model.conf.expected create mode 100644 src/test/hotplug/net-change-rate.conf create mode 100644 src/test/hotplug/net-change-rate.conf.expected create mode 100644 src/test/hotplug/net-hotplug-disabled.conf create mode 100644 src/test/hotplug/net-hotplug-disabled.conf.expected create mode 100644 src/test/hotplug/net-remove.conf create mode 100644 src/test/hotplug/net-remove.conf.expected create mode 100644 src/test/hotplug/tablet-disable.conf create mode 100644 src/test/hotplug/tablet-disable.conf.expected create mode 100644 src/test/hotplug/tablet-enable.conf create mode 100644 src/test/hotplug/tablet-enable.conf.expected create mode 100644 src/test/hotplug/usb-add-spice.conf create mode 100644 src/test/hotplug/usb-add-spice.conf.expected create mode 100644 src/test/hotplug/usb-add.conf create mode 100644 src/test/hotplug/usb-add.conf.expected create mode 100644 src/test/hotplug/usb-remove-last.conf create mode 100644 src/test/hotplug/usb-remove-last.conf.expected create mode 100644 src/test/run_hotplug_tests.pl -- 2.47.3