Alex Williamson <alex.william...@redhat.com> writes: > We were relying on msix_unset_vector_notifiers() to release all the > vectors when we disable MSI-X, but this only happens when MSI-X is > still enabled on the device. Perform further cleanup by releasing > any remaining vectors listed as in-use after this call. This caused > a leak of IRQ routes on hotplug depending on how the guest OS prepared > the device for removal. > > Signed-off-by: Alex Williamson <alex.william...@redhat.com> > Cc: qemu-sta...@nongnu.org > --- > hw/misc/vfio.c | 12 ++++++++++++ > 1 file changed, 12 insertions(+) > > diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c > index f7f8a19..355b018 100644 > --- a/hw/misc/vfio.c > +++ b/hw/misc/vfio.c > @@ -878,8 +878,20 @@ static void vfio_disable_msi_common(VFIODevice *vdev) > > static void vfio_disable_msix(VFIODevice *vdev) > { > + int i; > + > msix_unset_vector_notifiers(&vdev->pdev); > > + /* > + * MSI-X will only release vectors if MSI-X is still enabled on the > + * device, check through the rest and release it ourselves if necessary. > + */ > + for (i = 0; i < vdev->nr_vectors; i++) { > + if (vdev->msi_vectors[i].use) { > + vfio_msix_vector_release(&vdev->pdev, i); > + } > + } > + > if (vdev->nr_vectors) { > vfio_disable_irqindex(vdev, VFIO_PCI_MSIX_IRQ_INDEX); > }
Reviewed-by: Bandan Das <b...@redhat.com>