]> www.infradead.org Git - nvme.git/commitdiff
vfio/pci: Virtualize zero INTx PIN if no pdev->irq
authorAlex Williamson <alex.williamson@redhat.com>
Thu, 20 Mar 2025 19:41:42 +0000 (13:41 -0600)
committerAlex Williamson <alex.williamson@redhat.com>
Mon, 14 Apr 2025 14:31:45 +0000 (08:31 -0600)
Typically pdev->irq is consistent with whether the device itself
supports INTx, where device support is reported via the PIN register.
Therefore the PIN register is often already zero if pdev->irq is zero.

Recently virtualization of the PIN register was expanded to include
the case where the device supports INTx but the platform does not
route the interrupt.  This is reported by a value of IRQ_NOTCONNECTED
on some architectures.  Other architectures just report zero for
pdev->irq.

We already disallow INTx setup if pdev->irq is zero, therefore add
this to the PIN register virtualization criteria so that a consistent
view is provided to userspace through virtualized config space and
ioctls.

Reported-by: Shivaprasad G Bhat <sbhat@linux.ibm.com>
Link: https://lore.kernel.org/all/174231895238.2295.12586708771396482526.stgit@linux.ibm.com/
Tested-by: Shivaprasad G Bhat <sbhat@linux.ibm.com>
Link: https://lore.kernel.org/r/20250320194145.2816379-1-alex.williamson@redhat.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
drivers/vfio/pci/vfio_pci_config.c

index 14437396d72118d8b462ad570aa8bb86a253ef04..8f02f236b5b4bad22049d61a2472695a91587c2f 100644 (file)
@@ -1815,7 +1815,7 @@ int vfio_config_init(struct vfio_pci_core_device *vdev)
        }
 
        if (!IS_ENABLED(CONFIG_VFIO_PCI_INTX) || vdev->nointx ||
-           vdev->pdev->irq == IRQ_NOTCONNECTED)
+           !vdev->pdev->irq || vdev->pdev->irq == IRQ_NOTCONNECTED)
                vconfig[PCI_INTERRUPT_PIN] = 0;
 
        ret = vfio_cap_init(vdev);