On Tue, 18 Apr 2023 10:29:19 -0700 Reinette Chatre <reinette.chatre@xxxxxxxxx> wrote: > 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@xxxxxxxxxx> > Signed-off-by: Reinette Chatre <reinette.chatre@xxxxxxxxx> > --- > Changes since V2: > - New patch. (Alex) > > drivers/vfio/pci/vfio_pci_core.c | 5 ++++- > include/linux/vfio_pci_core.h | 1 + > 2 files changed, 5 insertions(+), 1 deletion(-) > > diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c > index ae0e161c7fc9..a3635a8e54c8 100644 > --- a/drivers/vfio/pci/vfio_pci_core.c > +++ b/drivers/vfio/pci/vfio_pci_core.c > @@ -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; > diff --git a/include/linux/vfio_pci_core.h b/include/linux/vfio_pci_core.h > index 148fd1ae6c1c..4f070f2d6fde 100644 > --- a/include/linux/vfio_pci_core.h > +++ b/include/linux/vfio_pci_core.h > @@ -67,6 +67,7 @@ struct vfio_pci_core_device { > u8 msix_bar; > u16 msix_size; > u32 msix_offset; > + bool has_dyn_msix; > u32 rbar[7]; > bool pci_2_3; > bool virq_disabled; Nit, the whole data structure probably needs to be sorted with pahole, but creating a hole here for locality to other msix fields should probably be secondary to keeping the structure well packed, which suggests including this new field among the bools below. Thanks, Alex