From: Dominik Csapak <d.csapak@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH qemu-server v2 6/6] hotplug: remove iothread if adding drive device failed
Date: Mon, 14 Sep 2026 10:54:35 +0200 [thread overview]
Message-ID: <20260914085725.1299009-7-d.csapak@proxmox.com> (raw)
In-Reply-To: <20260914085725.1299009-1-d.csapak@proxmox.com>
Otherwise it is left over after a failed attempt to add a drive with
iothreads. This also happens with virtio-scsi-single devices.
Modify the relevant test that highlighted this problem.
The failure can be tested by disabling hotplug, e.g. for a i440fx guest
one can use the following commandline switches:
-global PIIX4_PM.acpi-root-pci-hotplug=off
-global PIIX4_PM.acpi-pci-hotplug-with-bridge-support=off
-global pci-bridge.shpc=off
to disable hotplug on all pci bridges and the pci root bus.
The added regression tests would have failed without the code change.
Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
src/PVE/QemuServer.pm | 11 ++++++++++-
src/test/hotplug/disk-add-fail.conf | 19 +++++++++++++++++++
src/test/hotplug/disk-add-fail.conf.expected | 9 +++++++++
.../hotplug/disk-add-scsi-single-fail.conf | 19 +++++++++++++++++++
.../disk-add-scsi-single-fail.conf.expected | 4 ++++
5 files changed, 61 insertions(+), 1 deletion(-)
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-scsi-single-fail.conf
create mode 100644 src/test/hotplug/disk-add-scsi-single-fail.conf.expected
diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm
index 13318198..62fcc3db 100644
--- a/src/PVE/QemuServer.pm
+++ b/src/PVE/QemuServer.pm
@@ -3906,6 +3906,8 @@ sub vm_deviceplug {
if (my $err = $@) {
eval { qemu_drivedel($vmid, $deviceid); };
warn $@ if $@;
+ eval { qemu_iothread_del($vmid, $deviceid, $device) };
+ warn $@ if $@;
die $err;
}
} elsif ($deviceid =~ m/^(virtioscsi|scsihw)(\d+)$/) {
@@ -3925,7 +3927,14 @@ sub vm_deviceplug {
}
qemu_deviceadd($vmid, $devicefull);
- qemu_deviceaddverify($vmid, $deviceid);
+ eval { qemu_deviceaddverify($vmid, $deviceid) };
+ if (my $err = $@) {
+ if ($deviceid =~ m/^virtioscsi(\d+)$/ && $device->{iothread}) {
+ eval { qemu_iothread_del($vmid, $deviceid, $device) };
+ warn $@ if $@;
+ }
+ die $err;
+ }
} elsif ($deviceid =~ m/^(scsi)(\d+)$/) {
qemu_findorcreatescsihw($storecfg, $conf, $vmid, $device, $arch, $machine_type);
qemu_driveadd($storecfg, $vmid, $device);
diff --git a/src/test/hotplug/disk-add-fail.conf b/src/test/hotplug/disk-add-fail.conf
new file mode 100644
index 00000000..800b113e
--- /dev/null
+++ b/src/test/hotplug/disk-add-fail.conf
@@ -0,0 +1,19 @@
+# TEST: a disk that does not show up after hotplug is detached again
+# FAIL_DEVICE_ADD: virtio1
+# EXPECTED_ERROR: virtio1: hotplug problem - error on hotplug device 'virtio1'
+# STAYS_PENDING: 1
+bootdisk: scsi0
+cores: 2
+machine: pc-i440fx-10.1
+memory: 2048
+name: hotplug
+net0: virtio=A2:C0:43:77:08:A0,bridge=vmbr0
+ostype: l26
+scsi0: local:8006/vm-8006-disk-0.qcow2,size=32G
+scsihw: virtio-scsi-pci
+smbios1: uuid=7b10d7af-b932-4c66-b2c3-3996152ec465
+sockets: 1
+vmgenid: c773c261-d800-4348-9f5d-167fadd53cf8
+
+[PENDING]
+virtio1: local:8006/vm-8006-disk-1.qcow2,iothread=1,size=32G
diff --git a/src/test/hotplug/disk-add-fail.conf.expected b/src/test/hotplug/disk-add-fail.conf.expected
new file mode 100644
index 00000000..fb9d5de1
--- /dev/null
+++ b/src/test/hotplug/disk-add-fail.conf.expected
@@ -0,0 +1,9 @@
+storage activate_volumes ["local:8006/vm-8006-disk-1.qcow2"]
+qmp object-add {"id":"iothread-virtio1","qom-type":"iothread"}
+qmp object-del {"id":"throttle-drive-virtio1"}
+qmp object-add {"id":"throttle-drive-virtio1","limits":{},"qom-type":"throttle-group"}
+qmp blockdev-add {"detect-zeroes":"on","discard":"ignore","driver":"throttle","file":{"cache":{"direct":true,"no-flush":false},"detect-zeroes":"on","discard":"ignore","driver":"qcow2","file":{"aio":"io_uring","cache":{"direct":true,"no-flush":false},"detect-zeroes":"on","discard":"ignore","driver":"file","filename":"/var/lib/vz/images/8006/vm-8006-disk-1.qcow2","node-name":"ef4c217a7f08cf59741edc1790023f5","read-only":false},"node-name":"ff4c217a7f08cf59741edc1790023f5","read-only":false},"node-name":"drive-virtio1","read-only":false,"throttle-group":"throttle-drive-virtio1"}
+hmp device_add driver=virtio-blk-pci,drive=drive-virtio1,id=virtio1,bus=pci.0,addr=0xb,iothread=iothread-virtio1,write-cache=on
+qmp blockdev-del {"node-name":"drive-virtio1"}
+qmp object-del {"id":"throttle-drive-virtio1"}
+qmp object-del {"id":"iothread-virtio1"}
diff --git a/src/test/hotplug/disk-add-scsi-single-fail.conf b/src/test/hotplug/disk-add-scsi-single-fail.conf
new file mode 100644
index 00000000..d9a9a30f
--- /dev/null
+++ b/src/test/hotplug/disk-add-scsi-single-fail.conf
@@ -0,0 +1,19 @@
+# TEST: a virtio-scsi-single controller that does not show up after hotplug has its iothread removed again
+# FAIL_DEVICE_ADD: virtioscsi1
+# EXPECTED_ERROR: scsi1: hotplug problem - error on hotplug device 'virtioscsi1'
+# STAYS_PENDING: 1
+bootdisk: scsi0
+cores: 2
+machine: pc-i440fx-10.1
+memory: 2048
+name: hotplug
+net0: virtio=A2:C0:43:77:08:A0,bridge=vmbr0
+ostype: l26
+scsi0: local:8006/vm-8006-disk-0.qcow2,iothread=1,size=32G
+scsihw: virtio-scsi-single
+smbios1: uuid=7b10d7af-b932-4c66-b2c3-3996152ec465
+sockets: 1
+vmgenid: c773c261-d800-4348-9f5d-167fadd53cf8
+
+[PENDING]
+scsi1: local:8006/vm-8006-disk-1.qcow2,iothread=1,size=32G
diff --git a/src/test/hotplug/disk-add-scsi-single-fail.conf.expected b/src/test/hotplug/disk-add-scsi-single-fail.conf.expected
new file mode 100644
index 00000000..a2864a74
--- /dev/null
+++ b/src/test/hotplug/disk-add-scsi-single-fail.conf.expected
@@ -0,0 +1,4 @@
+storage activate_volumes ["local:8006/vm-8006-disk-1.qcow2"]
+qmp object-add {"id":"iothread-virtioscsi1","qom-type":"iothread"}
+hmp device_add driver=virtio-scsi-pci,id=virtioscsi1,bus=pci.3,addr=0x2,iothread=iothread-virtioscsi1
+qmp object-del {"id":"iothread-virtioscsi1"}
--
2.47.3
prev parent reply other threads:[~2026-09-14 8:58 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-14 8:54 [PATCH qemu-server v2 0/6] add hotplug tests and fix uncovered bugs Dominik Csapak
2026-09-14 8:54 ` [PATCH qemu-server v2 1/6] tests: hotplug: add initial hotplug test harness Dominik Csapak
2026-09-14 8:54 ` [PATCH qemu-server v2 2/6] tests: hotplug: add some test cases Dominik Csapak
2026-09-14 8:54 ` [PATCH qemu-server v2 3/6] tests: hotplug: add test case for adding scsi14 on qemu 11.1 Dominik Csapak
2026-09-14 8:54 ` [PATCH qemu-server v2 4/6] tests: hotplug: add cases for known defects Dominik Csapak
2026-09-14 8:54 ` [PATCH qemu-server v2 5/6] hotplug: fix vm_deviceplug call for 'tablet' and 'keyboard' on aarch64 Dominik Csapak
2026-09-14 8:54 ` Dominik Csapak [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260914085725.1299009-7-d.csapak@proxmox.com \
--to=d.csapak@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox