All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexander Gordeev <agordeev@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: Alexander Gordeev <agordeev@redhat.com>,
	Shreyas Bhatewara <sbhatewara@vmware.com>,
	"VMware, Inc." <pv-drivers@vmware.com>,
	netdev@vger.kernel.org, linux-pci@vger.kernel.org
Subject: [PATCH 33/34] vmxnet3: Fix MSI-X/MSI enablement code
Date: Fri, 31 Jan 2014 16:08:52 +0100	[thread overview]
Message-ID: <30f15232ede6abf6de8421554a17ca1a093ac951.1391172839.git.agordeev@redhat.com> (raw)
In-Reply-To: <cover.1391172839.git.agordeev@redhat.com>

This update cleans up the MSI-X/MSI enablement code, fixes
vmxnet3_acquire_msix_vectors() invalid return values and
enables a dead code in case VMXNET3_LINUX_MIN_MSIX_VECT
MSI-X vectors were allocated.

Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
---
 drivers/net/vmxnet3/vmxnet3_drv.c |  101 +++++++++++++++++--------------------
 1 files changed, 46 insertions(+), 55 deletions(-)

diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c
index 3be786f..3a17797 100644
--- a/drivers/net/vmxnet3/vmxnet3_drv.c
+++ b/drivers/net/vmxnet3/vmxnet3_drv.c
@@ -2729,47 +2729,44 @@ vmxnet3_read_mac_addr(struct vmxnet3_adapter *adapter, u8 *mac)
 /*
  * Enable MSIx vectors.
  * Returns :
- *	0 on successful enabling of required vectors,
  *	VMXNET3_LINUX_MIN_MSIX_VECT when only minimum number of vectors required
- *	 could be enabled.
- *	number of vectors which can be enabled otherwise (this number is smaller
+ *	 were enabled.
+ *	number of vectors which were enabled otherwise (this number is greater
  *	 than VMXNET3_LINUX_MIN_MSIX_VECT)
  */
 
 static int
-vmxnet3_acquire_msix_vectors(struct vmxnet3_adapter *adapter,
-			     int vectors)
+vmxnet3_acquire_msix_vectors(struct vmxnet3_adapter *adapter, int nvec)
 {
-	int err = 0, vector_threshold;
-	vector_threshold = VMXNET3_LINUX_MIN_MSIX_VECT;
-
-	while (vectors >= vector_threshold) {
-		err = pci_enable_msix(adapter->pdev, adapter->intr.msix_entries,
-				      vectors);
+	do {
+		int err = pci_enable_msix(adapter->pdev,
+					  adapter->intr.msix_entries, nvec);
 		if (!err) {
-			adapter->intr.num_intrs = vectors;
-			return 0;
+			return nvec;
 		} else if (err < 0) {
 			dev_err(&adapter->netdev->dev,
-				   "Failed to enable MSI-X, error: %d\n", err);
-			vectors = 0;
-		} else if (err < vector_threshold) {
-			break;
+				"Failed to enable MSI-X, error: %d\n", err);
+			return err;
+		} else if (err < VMXNET3_LINUX_MIN_MSIX_VECT) {
+			dev_info(&adapter->pdev->dev,
+				 "Number of MSI-X which can be allocated "
+				 "is lower than min threshold required.\n");
+			return -ENOSPC;
 		} else {
 			/* If fails to enable required number of MSI-x vectors
 			 * try enabling minimum number of vectors required.
 			 */
 			dev_err(&adapter->netdev->dev,
-				"Failed to enable %d MSI-X, trying %d instead\n",
-				    vectors, vector_threshold);
-			vectors = vector_threshold;
+				"Failed to enable %d MSI-X, trying %d\n",
+				nvec, VMXNET3_LINUX_MIN_MSIX_VECT);
+			nvec = VMXNET3_LINUX_MIN_MSIX_VECT;
 		}
-	}
+	} while (nvec >= VMXNET3_LINUX_MIN_MSIX_VECT);
 
-	dev_info(&adapter->pdev->dev,
-		 "Number of MSI-X interrupts which can be allocated "
-		 "is lower than min threshold required.\n");
-	return err;
+	/*
+	 * Should never get here
+	 */
+	return -ENOSPC;
 }
 
 
@@ -2796,56 +2793,50 @@ vmxnet3_alloc_intr_resources(struct vmxnet3_adapter *adapter)
 
 #ifdef CONFIG_PCI_MSI
 	if (adapter->intr.type == VMXNET3_IT_MSIX) {
-		int vector, err = 0;
-
-		adapter->intr.num_intrs = (adapter->share_intr ==
-					   VMXNET3_INTR_TXSHARE) ? 1 :
-					   adapter->num_tx_queues;
-		adapter->intr.num_intrs += (adapter->share_intr ==
-					   VMXNET3_INTR_BUDDYSHARE) ? 0 :
-					   adapter->num_rx_queues;
-		adapter->intr.num_intrs += 1;		/* for link event */
-
-		adapter->intr.num_intrs = (adapter->intr.num_intrs >
-					   VMXNET3_LINUX_MIN_MSIX_VECT
-					   ? adapter->intr.num_intrs :
-					   VMXNET3_LINUX_MIN_MSIX_VECT);
-
-		for (vector = 0; vector < adapter->intr.num_intrs; vector++)
-			adapter->intr.msix_entries[vector].entry = vector;
-
-		err = vmxnet3_acquire_msix_vectors(adapter,
-						   adapter->intr.num_intrs);
+		int i, nvec;
+
+		nvec  = adapter->share_intr == VMXNET3_INTR_TXSHARE ?
+			1 : adapter->num_tx_queues;
+		nvec += adapter->share_intr == VMXNET3_INTR_BUDDYSHARE ?
+			0 : adapter->num_rx_queues;
+		nvec += 1;	/* for link event */
+		nvec = nvec > VMXNET3_LINUX_MIN_MSIX_VECT ?
+		       nvec : VMXNET3_LINUX_MIN_MSIX_VECT;
+
+		for (i = 0; i < nvec; i++)
+			adapter->intr.msix_entries[i].entry = i;
+
+		nvec = vmxnet3_acquire_msix_vectors(adapter, nvec);
+		if (nvec < 0)
+			goto msix_err;
+
 		/* If we cannot allocate one MSIx vector per queue
 		 * then limit the number of rx queues to 1
 		 */
-		if (err == VMXNET3_LINUX_MIN_MSIX_VECT) {
+		if (nvec == VMXNET3_LINUX_MIN_MSIX_VECT) {
 			if (adapter->share_intr != VMXNET3_INTR_BUDDYSHARE
 			    || adapter->num_rx_queues != 1) {
 				adapter->share_intr = VMXNET3_INTR_TXSHARE;
 				netdev_err(adapter->netdev,
 					   "Number of rx queues : 1\n");
 				adapter->num_rx_queues = 1;
-				adapter->intr.num_intrs =
-						VMXNET3_LINUX_MIN_MSIX_VECT;
 			}
-			return;
 		}
-		if (!err)
-			return;
 
+		adapter->intr.num_intrs = nvec;
+		return;
+
+msix_err:
 		/* If we cannot allocate MSIx vectors use only one rx queue */
 		dev_info(&adapter->pdev->dev,
 			 "Failed to enable MSI-X, error %d. "
-			 "Limiting #rx queues to 1, try MSI.\n", err);
+			 "Limiting #rx queues to 1, try MSI.\n", nvec);
 
 		adapter->intr.type = VMXNET3_IT_MSI;
 	}
 
 	if (adapter->intr.type == VMXNET3_IT_MSI) {
-		int err;
-		err = pci_enable_msi(adapter->pdev);
-		if (!err) {
+		if (!pci_enable_msi(adapter->pdev)) {
 			adapter->num_rx_queues = 1;
 			adapter->intr.num_intrs = 1;
 			return;
-- 
1.7.7.6


  parent reply	other threads:[~2014-01-31 15:09 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-01-31 15:46 [PATCH 00/34] net: Use pci_enable_msix_range() Alexander Gordeev
2014-01-31 15:46 ` Alexander Gordeev
2014-01-31 15:08 ` [PATCH 01/34] bnx2: " Alexander Gordeev
2014-01-31 21:30   ` David Miller
2014-02-11  0:38     ` Bjorn Helgaas
2014-02-11  1:08       ` Bjorn Helgaas
2014-02-12 13:26         ` Alexander Gordeev
2014-02-12 17:00           ` Bjorn Helgaas
2014-02-12 18:08             ` Alexander Gordeev
2014-02-11  8:01       ` Alexander Gordeev
2014-01-31 15:08 ` [PATCH 02/34] bnx2x: " Alexander Gordeev
2014-01-31 19:11   ` Sergei Shtylyov
2014-01-31 15:08 ` [PATCH 03/34] tg3: " Alexander Gordeev
2014-01-31 15:08 ` [PATCH 04/34] bna: " Alexander Gordeev
2014-01-31 15:08 ` [PATCH 05/34] cxgb3: Remove superfluous call to pci_disable_msix() Alexander Gordeev
2014-01-31 15:08 ` [PATCH 06/34] cxgb3: Use pci_enable_msix_range() Alexander Gordeev
2014-01-31 15:08 ` [PATCH 07/34] cxgb4: " Alexander Gordeev
2014-01-31 15:08 ` [PATCH 08/34] cxgb4vf: Remove superfluous call to pci_disable_msix() Alexander Gordeev
2014-01-31 15:08 ` [PATCH 09/34] cxgb4vf: Use pci_enable_msix_range() Alexander Gordeev
2014-01-31 15:08 ` [PATCH 10/34] enic: " Alexander Gordeev
2014-01-31 15:08 ` [PATCH 11/34] benet: " Alexander Gordeev
2014-02-03  6:21   ` Sathya Perla
2014-01-31 15:08 ` [PATCH 12/34] e1000e: " Alexander Gordeev
2014-01-31 15:08   ` Alexander Gordeev
2014-01-31 19:17   ` Sergei Shtylyov
2014-01-31 15:08 ` [PATCH 13/34] i40e: " Alexander Gordeev
2014-01-31 15:08   ` Alexander Gordeev
2014-01-31 15:08 ` [PATCH 14/34] igb: " Alexander Gordeev
2014-01-31 15:08   ` Alexander Gordeev
2014-01-31 15:08 ` [PATCH 15/34] igbvf: " Alexander Gordeev
2014-01-31 15:08   ` Alexander Gordeev
2014-01-31 15:08 ` [PATCH 16/34] ixgbe: " Alexander Gordeev
2014-01-31 15:08   ` Alexander Gordeev
2014-01-31 15:08 ` [PATCH 17/34] ixgbevf: " Alexander Gordeev
2014-01-31 19:20   ` Sergei Shtylyov
2014-01-31 15:08 ` [PATCH 18/34] mlx4: " Alexander Gordeev
2014-01-31 19:22   ` Sergei Shtylyov
2014-02-02  9:43   ` Amir Vadai
2014-01-31 15:08 ` [PATCH 19/34] mlx5: " Alexander Gordeev
2014-01-31 15:08 ` [PATCH 20/34] myri10ge: " Alexander Gordeev
2014-01-31 19:24   ` Sergei Shtylyov
2014-02-01 14:13     ` Hyong-Youb Kim
2014-01-31 15:08 ` [PATCH 21/34] s2io: " Alexander Gordeev
2014-01-31 15:08 ` [PATCH 22/34] vxge: " Alexander Gordeev
2014-01-31 15:08 ` [PATCH 23/34] forcedeth: Fix invalid errno reporting in nv_request_irq() Alexander Gordeev
2014-01-31 15:08 ` [PATCH 24/34] forcedeth: Cleanup MSI-X to MSI to INTx fallback code Alexander Gordeev
2014-01-31 15:08 ` [PATCH 25/34] forcedeth: Use pci_enable_msix_range() Alexander Gordeev
2014-01-31 15:08 ` [PATCH 26/34] netxen: " Alexander Gordeev
2014-01-31 15:08 ` [PATCH 27/34] qlcnic: Cleanup qlcnic_enable_msix() return values Alexander Gordeev
2014-01-31 15:08 ` [PATCH 28/34] qlcnic: Use pci_enable_msix_range() Alexander Gordeev
2014-01-31 15:08 ` [PATCH 29/34] qlge: Get rid of an redundant assignment Alexander Gordeev
2014-01-31 15:08 ` [PATCH 30/34] qlge: Use pci_enable_msix_range() Alexander Gordeev
2014-01-31 15:08 ` [PATCH 31/34] efx: " Alexander Gordeev
2014-01-31 17:21   ` Shradha Shah
2014-01-31 15:08 ` [PATCH 32/34] niu: " Alexander Gordeev
2014-01-31 15:08 ` Alexander Gordeev [this message]
2014-01-31 15:08 ` [PATCH 34/34] vmxnet3: " Alexander Gordeev

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=30f15232ede6abf6de8421554a17ca1a093ac951.1391172839.git.agordeev@redhat.com \
    --to=agordeev@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pv-drivers@vmware.com \
    --cc=sbhatewara@vmware.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.