Re: [PATCH] uio/uio_pci_generic: don't fail probe if pdev->irq == NULL

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> 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




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux