[PATCH 1/2] PCI: Provide sensible irq vector alloc/free routines
Christoph Hellwig
hch at lst.de
Thu May 12 00:35:52 PDT 2016
Hi Alex,
what do you think about the incremental patch below? This should
address the concerns about the strange PPC bridges, although I don't
have a way to test one:
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index a510484..32ce65e 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -1177,6 +1177,7 @@ int pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int nr_vecs,
if (WARN_ON_ONCE(dev->msi_enabled || dev->msix_enabled))
return -EINVAL;
+retry:
if (!pci_msi_supported(dev, 1))
goto use_legacy_irq;
@@ -1191,17 +1192,26 @@ int pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int nr_vecs,
if (!dev->irqs)
return -ENOMEM;
- if (dev->msix_cap && !(flags & PCI_IRQ_NOMSIX))
+ if (dev->msix_cap && !(flags & PCI_IRQ_NOMSIX)) {
ret = __pci_enable_msix(dev, nr_vecs);
- else
+ if (ret < 0)
+ flags |= PCI_IRQ_NOMSIX;
+ } else {
ret = __pci_enable_msi(dev, nr_vecs);
- if (ret)
- goto out_free_irqs;
+ }
- return 0;
+ /* if we succeeded getting all vectors return the number we got: */
+ if (!ret)
+ return nr_vecs;
-out_free_irqs:
kfree(dev->irqs);
+ /* if ret is positive it's the numbers of vectors we can use, retry: */
+ if (ret > 0) {
+ nr_vecs = ret;
+ goto retry;
+ }
+
+ /* no MSI or MSI-X vectors available, fall back to the legacy IRQ: */
use_legacy_irq:
dev->irqs = &dev->irq;
return 1;
More information about the Linux-nvme
mailing list