public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
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





      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
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal