On Thu, 18 Apr 2024 11:31:21 -0400 Nirmal Patel <nirmal.patel@xxxxxxxxxxxxxxx> wrote: > VMD MSI remapping is disabled by default for all the CPUs with 28c0 > VMD deviceID. We used to disable remapping because drives supported > more vectors than the VMD so the performance was better without > remapping. Now with CPUs that support more than 64 (128 VMD MSIx > vectors for gen5) we no longer need to disable this feature. > > Note, pci_msix_vec_count() failure is translated to ENODEV per typical > expectations that drivers may return ENODEV when some driver-known > fundamental detail of the device is missing. > > Signed-off-by: Nirmal Patel <nirmal.patel@xxxxxxxxxxxxxxx> > --- > v1->v2: Updating commit message. > v2->v3: Use VMD MSI count instead of cpu count. > v3->v4: Updating commit message. > --- > drivers/pci/controller/vmd.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/drivers/pci/controller/vmd.c > b/drivers/pci/controller/vmd.c index 769eedeb8802..ba63af70bb63 100644 > --- a/drivers/pci/controller/vmd.c > +++ b/drivers/pci/controller/vmd.c > @@ -34,6 +34,8 @@ > #define MB2_SHADOW_OFFSET 0x2000 > #define MB2_SHADOW_SIZE 16 > > +#define VMD_MIN_MSI_VECTOR_COUNT 64 > + > enum vmd_features { > /* > * Device may contain registers which hint the physical > location of the @@ -807,13 +809,20 @@ static int > vmd_enable_domain(struct vmd_dev *vmd, unsigned long features) > sd->node = pcibus_to_node(vmd->dev->bus); > > + vmd->msix_count = pci_msix_vec_count(vmd->dev); > + if (vmd->msix_count < 0) > + return -ENODEV; > + > /* > * Currently MSI remapping must be enabled in guest > passthrough mode > * due to some missing interrupt remapping plumbing. This is > probably > * acceptable because the guest is usually CPU-limited and > MSI > * remapping doesn't become a performance bottleneck. > + * Disable MSI remapping only if supported by VMD hardware > and when > + * VMD MSI count is less than or equal to minimum MSI count. > */ > if (!(features & VMD_FEAT_CAN_BYPASS_MSI_REMAP) || > + vmd->msix_count > VMD_MIN_MSI_VECTOR_COUNT || > offset[0] || offset[1]) { > ret = vmd_alloc_irqs(vmd); > if (ret) Gentle ping! Thanks nirmal