qemu/hw/virtio
Cédric Le Goater 1b889d6e39 virtio-iommu: Clear IOMMUDevice when VFIO device is unplugged
When a VFIO device is hoplugged in a VM using virtio-iommu, IOMMUPciBus
and IOMMUDevice cache entries are created in the .get_address_space()
handler of the machine IOMMU device. However, these entries are never
destroyed, not even when the VFIO device is detached from the machine.
This can lead to an assert if the device is reattached again.

When reattached, the .get_address_space() handler reuses an
IOMMUDevice entry allocated when the VFIO device was first attached.
virtio_iommu_set_host_iova_ranges() is called later on from the
.set_iommu_device() handler an fails with an assert on 'probe_done'
because the device appears to have been already probed when this is
not the case.

The IOMMUDevice entry is allocated in pci_device_iommu_address_space()
called from under vfio_realize(), the VFIO PCI realize handler. Since
pci_device_unset_iommu_device() is called from vfio_exitfn(), a sub
function of the PCIDevice unrealize() handler, it seems that the
.unset_iommu_device() handler is the best place to release resources
allocated at realize time. Clear the IOMMUDevice cache entry there to
fix hotplug.

Fixes: 817ef10da2 ("virtio-iommu: Implement set|unset]_iommu_device() callbacks")
Signed-off-by: Cédric Le Goater <clg@redhat.com>
Message-Id: <20240701101453.203985-1-clg@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
2024-07-03 18:14:07 -04:00
..
Kconfig
meson.build
trace-events
trace.h
vdpa-dev-pci.c
vdpa-dev.c
vhost-backend.c
vhost-iova-tree.c
vhost-iova-tree.h
vhost-scsi-pci.c
vhost-shadow-virtqueue.c
vhost-shadow-virtqueue.h
vhost-stub.c
vhost-user-base.c hw/virtio: Free vqs after vhost_dev_cleanup() 2024-07-01 17:16:05 -04:00
vhost-user-blk-pci.c
vhost-user-device-pci.c
vhost-user-device.c
vhost-user-fs-pci.c
vhost-user-fs.c vhost/vhost-user: Add VIRTIO_F_NOTIFICATION_DATA to vhost feature bits 2024-07-01 14:56:23 -04:00
vhost-user-gpio-pci.c
vhost-user-gpio.c
vhost-user-i2c-pci.c
vhost-user-i2c.c
vhost-user-input-pci.c
vhost-user-input.c
vhost-user-rng-pci.c
vhost-user-rng.c
vhost-user-scmi-pci.c
vhost-user-scmi.c
vhost-user-scsi-pci.c
vhost-user-snd-pci.c
vhost-user-snd.c
vhost-user-vsock-pci.c
vhost-user-vsock.c vhost/vhost-user: Add VIRTIO_F_NOTIFICATION_DATA to vhost feature bits 2024-07-01 14:56:23 -04:00
vhost-user.c vhost-user: Skip unnecessary duplicated VHOST_USER_SET_LOG_BASE requests 2024-07-01 17:16:05 -04:00
vhost-vdpa.c
vhost-vsock-common.c vhost-vsock: add VIRTIO_F_RING_PACKED to feature_bits 2024-07-01 14:56:23 -04:00
vhost-vsock-pci.c
vhost-vsock.c
vhost.c vhost: Perform memory section dirty scans once per iteration 2024-07-01 14:56:23 -04:00
virtio-9p-pci.c
virtio-acpi.c
virtio-balloon-pci.c
virtio-balloon.c
virtio-blk-pci.c
virtio-bus.c
virtio-config-io.c
virtio-crypto-pci.c
virtio-crypto.c
virtio-hmp-cmds.c
virtio-input-host-pci.c
virtio-input-pci.c
virtio-iommu-pci.c
virtio-iommu.c virtio-iommu: Clear IOMMUDevice when VFIO device is unplugged 2024-07-03 18:14:07 -04:00
virtio-md-pci.c hw/mem/memory-device: Remove legacy_align from memory_device_pre_plug() 2024-06-19 12:40:49 +02:00
virtio-md-stubs.c
virtio-mem-pci.c
virtio-mem-pci.h
virtio-mem.c
virtio-mmio.c virtio-mmio: Handle extra notification data 2024-07-01 14:56:23 -04:00
virtio-net-pci.c
virtio-pci.c virtio-pci: implement No_Soft_Reset bit 2024-07-01 17:16:05 -04:00
virtio-pmem-pci.c
virtio-pmem-pci.h
virtio-pmem.c
virtio-qmp.c
virtio-qmp.h
virtio-rng-pci.c
virtio-rng.c
virtio-scsi-pci.c
virtio-serial-pci.c
virtio-stub.c
virtio.c virtio: remove virtio_tswap16s() call in vring_packed_event_read() 2024-07-03 18:14:07 -04:00