PCI: Make the "entries" argument to pci_enable_msix() optional
authorChristoph Hellwig <hch@lst.de>
Tue, 12 Jul 2016 09:20:16 +0000 (18:20 +0900)
committerBjorn Helgaas <bhelgaas@google.com>
Thu, 21 Jul 2016 20:49:43 +0000 (15:49 -0500)
The "entries" argument isn't needed if the list of entries does not contain
any holes.  Make it optional so that we can avoid the need to allocate a
msix_entry structure for this (common) case.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Alexander Gordeev <agordeev@redhat.com>
drivers/pci/msi.c

index a385f39be6f7d1a0aa7333abccf7997d1e7d63c5..98ace67c5f4d19a71793b40a188b836ef3af3e65 100644 (file)
@@ -695,7 +695,10 @@ static int msix_setup_entries(struct pci_dev *dev, void __iomem *base,
 
                entry->msi_attrib.is_msix       = 1;
                entry->msi_attrib.is_64         = 1;
-               entry->msi_attrib.entry_nr      = entries[i].entry;
+               if (entries)
+                       entry->msi_attrib.entry_nr = entries[i].entry;
+               else
+                       entry->msi_attrib.entry_nr = i;
                entry->msi_attrib.default_irq   = dev->irq;
                entry->mask_base                = base;
                entry->nvec_used                = 1;
@@ -713,11 +716,11 @@ static void msix_program_entries(struct pci_dev *dev,
        int i = 0;
 
        for_each_pci_msi_entry(entry, dev) {
-               entries[i].vector = entry->irq;
+               if (entries)
+                       entries[i++].vector = entry->irq;
                entry->masked = readl(pci_msix_desc_addr(entry) +
                                PCI_MSIX_ENTRY_VECTOR_CTRL);
                msix_mask_irq(entry, 1);
-               i++;
        }
 }
 
@@ -930,7 +933,7 @@ EXPORT_SYMBOL(pci_msix_vec_count);
 /**
  * pci_enable_msix - configure device's MSI-X capability structure
  * @dev: pointer to the pci_dev data structure of MSI-X device function
- * @entries: pointer to an array of MSI-X entries
+ * @entries: pointer to an array of MSI-X entries (optional)
  * @nvec: number of MSI-X irqs requested for allocation by device driver
  *
  * Setup the MSI-X capability structure of device function with the number
@@ -950,22 +953,21 @@ int pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries, int nvec)
        if (!pci_msi_supported(dev, nvec))
                return -EINVAL;
 
-       if (!entries)
-               return -EINVAL;
-
        nr_entries = pci_msix_vec_count(dev);
        if (nr_entries < 0)
                return nr_entries;
        if (nvec > nr_entries)
                return nr_entries;
 
-       /* Check for any invalid entries */
-       for (i = 0; i < nvec; i++) {
-               if (entries[i].entry >= nr_entries)
-                       return -EINVAL;         /* invalid entry */
-               for (j = i + 1; j < nvec; j++) {
-                       if (entries[i].entry == entries[j].entry)
-                               return -EINVAL; /* duplicate entry */
+       if (entries) {
+               /* Check for any invalid entries */
+               for (i = 0; i < nvec; i++) {
+                       if (entries[i].entry >= nr_entries)
+                               return -EINVAL;         /* invalid entry */
+                       for (j = i + 1; j < nvec; j++) {
+                               if (entries[i].entry == entries[j].entry)
+                                       return -EINVAL; /* duplicate entry */
+                       }
                }
        }
        WARN_ON(!!dev->msix_enabled);