vfio/pci: Probe and store ability to support dynamic MSI-X
authorReinette Chatre <reinette.chatre@intel.com>
Thu, 11 May 2023 15:44:36 +0000 (08:44 -0700)
committerAlex Williamson <alex.williamson@redhat.com>
Tue, 23 May 2023 21:49:03 +0000 (15:49 -0600)
Not all MSI-X devices support dynamic MSI-X allocation. Whether
a device supports dynamic MSI-X should be queried using
pci_msix_can_alloc_dyn().

Instead of scattering code with pci_msix_can_alloc_dyn(),
probe this ability once and store it as a property of the
virtual device.

Suggested-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/f1ae022c060ecb7e527f4f53c8ccafe80768da47.1683740667.git.reinette.chatre@intel.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
drivers/vfio/pci/vfio_pci_core.c
include/linux/vfio_pci_core.h

index ae0e161c7fc959ae3dfcae66a5bcf19d18c306ad..a3635a8e54c855b28203eff104252598b9a4c458 100644 (file)
@@ -530,8 +530,11 @@ int vfio_pci_core_enable(struct vfio_pci_core_device *vdev)
                vdev->msix_bar = table & PCI_MSIX_TABLE_BIR;
                vdev->msix_offset = table & PCI_MSIX_TABLE_OFFSET;
                vdev->msix_size = ((flags & PCI_MSIX_FLAGS_QSIZE) + 1) * 16;
-       } else
+               vdev->has_dyn_msix = pci_msix_can_alloc_dyn(pdev);
+       } else {
                vdev->msix_bar = 0xFF;
+               vdev->has_dyn_msix = false;
+       }
 
        if (!vfio_vga_disabled() && vfio_pci_is_vga(pdev))
                vdev->has_vga = true;
index adb47e2914d7451293cadaee43f0c4a4225e057c..562e8754869da6c6a5c46c2dd55b4775c27b0722 100644 (file)
@@ -68,6 +68,7 @@ struct vfio_pci_core_device {
        u16                     msix_size;
        u32                     msix_offset;
        u32                     rbar[7];
+       bool                    has_dyn_msix:1;
        bool                    pci_2_3:1;
        bool                    virq_disabled:1;
        bool                    reset_works:1;