On Fri, Nov 03, 2023 at 01:56 PM +0300, Dmitrii Gavrilov <ds-g...@yandex-team.ru> wrote: > Original goal of addition of drain_call_rcu to qmp_device_add was to cover > the failure case of qdev_device_add. It seems call of drain_call_rcu was > misplaced in 7bed89958bfbf40df what led to waiting for pending RCU callbacks > under happy path too. What led to overall performance degradation of > qmp_device_add. > > In this patch call of drain_call_rcu moved under handling of failure of > qdev_device_add. > > Signed-off-by: Dmitrii Gavrilov <ds-g...@yandex-team.ru>
I don't know the exact reason, but this commit caused udev events to show up much slower than before (~3s vs. ~23s) when a virtio-scsi device is hotplugged (I’ve tested this only on s390x). Importantly, this only happens when asynchronous SCSI scanning is disabled in the *guest* kernel (scsi_mod.scan=sync or CONFIG_SCSI_SCAN_ASYNC=n). The `udevadm monitor` output captured while hotplugging the device (using QEMU 012b170173bc ("system/qdev-monitor: move drain_call_rcu call under if (!dev) in qmp_device_add()")): … KERNEL[2.166575] add /devices/css0/0.0.0002/0.0.0002 (ccw) KERNEL[2.166594] bind /devices/css0/0.0.0002/0.0.0002 (ccw) KERNEL[2.166826] add /devices/css0/0.0.0002/0.0.0002/virtio2 (virtio) UDEV [2.166846] add /devices/css0/0.0.0002/0.0.0002 (ccw) UDEV [2.167013] bind /devices/css0/0.0.0002/0.0.0002 (ccw) KERNEL[2.167560] add /devices/virtual/workqueue/scsi_tmf_0 (workqueue) UDEV [2.167977] add /devices/virtual/workqueue/scsi_tmf_0 (workqueue) KERNEL[2.167987] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0 (scsi) KERNEL[2.167996] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/scsi_host/host0 (scsi_host) KERNEL[2.169113] change /0:0:0:0 (scsi) UDEV [2.169212] change /0:0:0:0 (scsi) KERNEL[2.199500] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0 (scsi) KERNEL[2.199513] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0 (scsi) KERNEL[2.199523] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0/scsi_device/0:0:0:0 (scsi_device) KERNEL[2.199532] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0 (scsi_disk) KERNEL[2.199564] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0/scsi_generic/sg0 (scsi_generic) KERNEL[2.199586] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0/bsg/0:0:0:0 (bsg) KERNEL[2.280482] add /devices/virtual/bdi/8:0 (bdi) UDEV [2.280634] add /devices/virtual/bdi/8:0 (bdi) KERNEL[3.060145] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0/block/sda (block) KERNEL[3.060160] bind /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0 (scsi) KERNEL[22.160147] bind /devices/css0/0.0.0002/0.0.0002/virtio2 (virtio) KERNEL[22.160161] add /bus/virtio/drivers/virtio_scsi (drivers) KERNEL[22.160169] add /module/virtio_scsi (module) UDEV [22.161078] add /devices/css0/0.0.0002/0.0.0002/virtio2 (virtio) UDEV [22.161339] add /bus/virtio/drivers/virtio_scsi (drivers) UDEV [22.161860] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0 (scsi) UDEV [22.161869] add /module/virtio_scsi (module) UDEV [22.161880] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0 (scsi) UDEV [22.161890] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/scsi_host/host0 (scsi_host) UDEV [22.161901] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0 (scsi) UDEV [22.161911] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0 (scsi_disk) UDEV [22.161924] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0/bsg/0:0:0:0 (bsg) UDEV [22.161937] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0/scsi_generic/sg0 (scsi_generic) UDEV [22.162123] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0/scsi_device/0:0:0:0 (scsi_device) UDEV [22.468924] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0/block/sda (block) UDEV [22.473955] bind /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0 (scsi) UDEV [22.473970] bind /devices/css0/0.0.0002/0.0.0002/virtio2 (virtio) The `udevadm monitor` output without this commit (QEMU 9876359990dd ("hw/scsi/lsi53c895a: add timer to scripts processing")): … KERNEL[2.091114] add /devices/virtual/workqueue/scsi_tmf_0 (workqueue) UDEV [2.091218] add /devices/virtual/workqueue/scsi_tmf_0 (workqueue) KERNEL[2.091408] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0 (scsi) KERNEL[2.091418] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/scsi_host/host0 (scsi_host) KERNEL[2.200461] bind /devices/css0/0.0.0002/0.0.0002/virtio2 (virtio) KERNEL[2.200473] add /bus/virtio/drivers/virtio_scsi (drivers) KERNEL[2.200481] add /module/virtio_scsi (module) UDEV [2.200634] add /module/virtio_scsi (module) UDEV [2.200678] add /devices/css0/0.0.0002/0.0.0002/virtio2 (virtio) UDEV [2.200746] add /bus/virtio/drivers/virtio_scsi (drivers) UDEV [2.200830] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0 (scsi) UDEV [2.200972] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/scsi_host/host0 (scsi_host) UDEV [2.201148] bind /devices/css0/0.0.0002/0.0.0002/virtio2 (virtio) KERNEL[2.201699] change /0:0:0:0 (scsi) KERNEL[2.201734] change /0:0:0:0 (scsi) UDEV [2.201815] change /0:0:0:0 (scsi) UDEV [2.201888] change /0:0:0:0 (scsi) KERNEL[2.222062] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0 (scsi) KERNEL[2.222074] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0 (scsi) KERNEL[2.222083] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0/scsi_device/0:0:0:0 (scsi_device) KERNEL[2.222092] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0 (scsi_disk) KERNEL[2.222104] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0/scsi_generic/sg0 (scsi_generic) KERNEL[2.222127] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0/bsg/0:0:0:0 (bsg) UDEV [2.222241] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0 (scsi) UDEV [2.222486] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0 (scsi) UDEV [2.222667] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0 (scsi_disk) UDEV [2.222715] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0/bsg/0:0:0:0 (bsg) UDEV [2.222877] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0/scsi_device/0:0:0:0 (scsi_device) UDEV [2.223116] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0/scsi_generic/sg0 (scsi_generic) KERNEL[2.303063] add /devices/virtual/bdi/8:0 (bdi) UDEV [2.303197] add /devices/virtual/bdi/8:0 (bdi) KERNEL[2.394175] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0/block/sda (block) KERNEL[2.394186] bind /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0 (scsi) UDEV [2.706054] add /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0/block/sda (block) UDEV [2.706075] bind /devices/css0/0.0.0002/0.0.0002/virtio2/host0/target0:0:0/0:0:0:0 (scsi) I’ve used as host kernel 6.7.0-rc3-00033-ge72f947b4f0d and guest kernel v6.5.0. QEMU 'info qtree' output when the device was hotplugged: bus: main-system-bus type System dev: s390-pcihost, id "" x-config-reg-migration-enabled = true bypass-iommu = false bus: s390-pcibus.0 type s390-pcibus bus: pci.0 type PCI dev: virtual-css-bridge, id "" css_dev_path = true bus: virtual-css type virtual-css-bus dev: virtio-scsi-ccw, id "scsi0" ioeventfd = true max_revision = 2 (0x2) devno = "fe.0.0002" dev_id = "fe.0.0002" subch_id = "fe.0.0002" bus: virtio-bus type virtio-ccw-bus dev: virtio-scsi-device, id "" num_queues = 1 (0x1) virtqueue_size = 256 (0x100) seg_max_adjust = true max_sectors = 65535 (0xffff) cmd_per_lun = 128 (0x80) hotplug = true param_change = true indirect_desc = true event_idx = true notify_on_empty = true any_layout = true iommu_platform = false packed = false queue_reset = true use-started = true use-disabled-flag = true x-disable-legacy-check = false bus: scsi0.0 type SCSI dev: scsi-generic, id "hostdev0" drive = "libvirt-1-backend" share-rw = false io_timeout = 30 (0x1e) channel = 0 (0x0) scsi-id = 0 (0x0) lun = 0 (0x0) … Any ideas? Thanks in advance. Kind regards, Marc