> On Apr 30, 2017, at 6:17 PM, Michael S. Tsirkin <mst@xxxxxxxxxx> wrote: > > On Sun, Apr 30, 2017 at 12:29:55PM -0700, Jim Harris wrote: >> Some userspace drivers and frameworks only poll and do not >> require interrupts to be available and enabled on the >> PCI device. So remove the requirement that an IRQ is >> assigned. If an IRQ is not assigned and a userspace >> driver tries to read()/write(), the generic uio >> framework will just return -EIO. >> >> This allows binding uio_pci_generic to devices which >> cannot get an IRQ assigned, such as an NVMe controller >> behind Intel Volume Management Device (VMD), since VMD >> does not support INTx interrupts. >> >> Signed-off-by: Jim Harris <james.r.harris@xxxxxxxxx> > > Without interrupts, why do you want uio? All it does is > forward interrupts to userspace. Primarily so that a driver is bound to the device while using it from userspace. It can also be helpful to have the uioX sysfs symlinks to the underlying PCI config/resources. Some userspace drivers/frameworks such as DPDK and SPDK primarily run in polled-only mode - not using interrupts at all. But DPDK does provide a facility to drop into interrupt mode which uio facilitates. So looking ahead to NVMe devices behind a VMD endpoint, we want to be able to at least bind uio to these NVMe devices - DPDK/SPDK just will not be able to drop into interrupt mode on these devices. This is different obviously for vfio where we can allocate MSI/MSIX vectors. But for dev systems with IOMMU disabled, or passing a VMD endpoint to a guest VM, uio support is still desired. > >> --- >> drivers/uio/uio_pci_generic.c | 20 +++++++++----------- >> 1 file changed, 9 insertions(+), 11 deletions(-) >> >> diff --git a/drivers/uio/uio_pci_generic.c b/drivers/uio/uio_pci_generic.c >> index d0b508b68f3c..81c59b4f8552 100644 >> --- a/drivers/uio/uio_pci_generic.c >> +++ b/drivers/uio/uio_pci_generic.c >> @@ -66,14 +66,7 @@ static int probe(struct pci_dev *pdev, >> return err; >> } >> >> - if (!pdev->irq) { >> - dev_warn(&pdev->dev, "No IRQ assigned to device: " >> - "no support for interrupts?\n"); >> - pci_disable_device(pdev); >> - return -ENODEV; >> - } >> - >> - if (!pci_intx_mask_supported(pdev)) { >> + if (pci->irq && !pci_intx_mask_supported(pdev)) { >> err = -ENODEV; >> goto err_verify; >> } >> @@ -86,10 +79,15 @@ static int probe(struct pci_dev *pdev, >> >> gdev->info.name = "uio_pci_generic"; >> gdev->info.version = DRIVER_VERSION; >> - gdev->info.irq = pdev->irq; >> - gdev->info.irq_flags = IRQF_SHARED; >> - gdev->info.handler = irqhandler; >> gdev->pdev = pdev; >> + if (pdev->irq) { >> + gdev->info.irq = pdev->irq; >> + gdev->info.irq_flags = IRQF_SHARED; >> + gdev->info.handler = irqhandler; >> + } else { >> + dev_warn(&pdev->dev, "No IRQ assigned to device: " >> + "no support for interrupts?\n"); >> + } >> >> err = uio_register_device(&pdev->dev, &gdev->info); >> if (err) >> -- >> 2.12.2