[PATCH] pci, msi: return if alloc_msi_entry for MSI-X failed v2

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

 



In current code it continues setup even if alloc_msi_entry for MSI-X
is failed due to lack of memory.  It means arch_setup_msi_irqs() might
be called with msi_desc entries less than its argument nvec.

At least x86's arch_setup_msi_irqs() uses list_for_each_entry() for
dev->msi_list that suspected to have entries same numbers as nvec, and
it doesn't check the number of allocated vectors and passed arg nvec.
Therefore it will result in success of pci_enable_msix(), with less
vectors allocated than requested.

This patch fixes the error route to return the number of entries can be
allocated (or -ENOMEM), instead of continuing the setup.  It will let
drivers to retry pci_enable_msix() with less number of entries.

v2: we should return -ENOMEM if it fails with i==0.

Signed-off-by: Hidetoshi Seto <seto.hidetoshi@xxxxxxxxxxxxxx>
Tested-by: Hidetoshi Seto <seto.hidetoshi@xxxxxxxxxxxxxx>
---
 drivers/pci/msi.c |    8 ++++++--
 1 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index 6f2e629..247464d 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -445,8 +445,12 @@ static int msix_capability_init(struct pci_dev *dev,
 	/* MSI-X Table Initialization */
 	for (i = 0; i < nvec; i++) {
 		entry = alloc_msi_entry(dev);
-		if (!entry)
-			break;
+		if (!entry) {
+			if (!i)
+				return -ENOMEM;
+			msi_free_irqs(dev);
+			return i;
+		}
 
  		j = entries[i].entry;
 		entry->msi_attrib.is_msix = 1;
-- 
1.6.3

--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux