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

[patch V3 09/35] PCI/MSI: Allocate MSI device data on first use



From: Thomas Gleixner <tglx@xxxxxxxxxxxxx>

Allocate MSI device data on first use, i.e. when a PCI driver invokes one
of the PCI/MSI enablement functions.

Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
Reviewed-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
Reviewed-by: Jason Gunthorpe <jgg@xxxxxxxxxx>
Acked-by: Bjorn Helgaas <bhelgaas@xxxxxxxxxx>
---
 drivers/pci/msi/msi.c |   20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -900,10 +900,12 @@ static int __pci_enable_msi_range(struct
 /* deprecated, don't use */
 int pci_enable_msi(struct pci_dev *dev)
 {
-       int rc = __pci_enable_msi_range(dev, 1, 1, NULL);
-       if (rc < 0)
-               return rc;
-       return 0;
+       int rc = msi_setup_device_data(&dev->dev);
+
+       if (!rc)
+               rc = __pci_enable_msi_range(dev, 1, 1, NULL);
+
+       return rc < 0 ? rc : 0;
 }
 EXPORT_SYMBOL(pci_enable_msi);
 
@@ -958,7 +960,11 @@ static int __pci_enable_msix_range(struc
 int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
                int minvec, int maxvec)
 {
-       return __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0);
+       int ret = msi_setup_device_data(&dev->dev);
+
+       if (!ret)
+               ret = __pci_enable_msix_range(dev, entries, minvec, maxvec, 
NULL, 0);
+       return ret;
 }
 EXPORT_SYMBOL(pci_enable_msix_range);
 
@@ -985,8 +991,12 @@ int pci_alloc_irq_vectors_affinity(struc
                                   struct irq_affinity *affd)
 {
        struct irq_affinity msi_default_affd = {0};
+       int ret = msi_setup_device_data(&dev->dev);
        int nvecs = -ENOSPC;
 
+       if (ret)
+               return ret;
+
        if (flags & PCI_IRQ_AFFINITY) {
                if (!affd)
                        affd = &msi_default_affd;




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.