Commit f71ef02f authored by Ronak Doshi's avatar Ronak Doshi Committed by Jakub Kicinski

vmxnet3: fix minimum vectors alloc issue

'Commit 39f9895a ("vmxnet3: add support for 32 Tx/Rx queues")'
added support for 32Tx/Rx queues. Within that patch, value of
VMXNET3_LINUX_MIN_MSIX_VECT was updated.

However, there is a case (numvcpus = 2) which actually requires 3
intrs which matches VMXNET3_LINUX_MIN_MSIX_VECT which then is
treated as failure by stack to allocate more vectors. This patch
fixes this issue.

Fixes: 39f9895a ("vmxnet3: add support for 32 Tx/Rx queues")
Signed-off-by: default avatarRonak Doshi <doshir@vmware.com>
Acked-by: default avatarGuolin Yang <gyang@vmware.com>
Link: https://lore.kernel.org/r/20211207081737.14000-1-doshir@vmware.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent e195e9b5
...@@ -3261,7 +3261,7 @@ vmxnet3_alloc_intr_resources(struct vmxnet3_adapter *adapter) ...@@ -3261,7 +3261,7 @@ vmxnet3_alloc_intr_resources(struct vmxnet3_adapter *adapter)
#ifdef CONFIG_PCI_MSI #ifdef CONFIG_PCI_MSI
if (adapter->intr.type == VMXNET3_IT_MSIX) { if (adapter->intr.type == VMXNET3_IT_MSIX) {
int i, nvec; int i, nvec, nvec_allocated;
nvec = adapter->share_intr == VMXNET3_INTR_TXSHARE ? nvec = adapter->share_intr == VMXNET3_INTR_TXSHARE ?
1 : adapter->num_tx_queues; 1 : adapter->num_tx_queues;
...@@ -3274,14 +3274,15 @@ vmxnet3_alloc_intr_resources(struct vmxnet3_adapter *adapter) ...@@ -3274,14 +3274,15 @@ vmxnet3_alloc_intr_resources(struct vmxnet3_adapter *adapter)
for (i = 0; i < nvec; i++) for (i = 0; i < nvec; i++)
adapter->intr.msix_entries[i].entry = i; adapter->intr.msix_entries[i].entry = i;
nvec = vmxnet3_acquire_msix_vectors(adapter, nvec); nvec_allocated = vmxnet3_acquire_msix_vectors(adapter, nvec);
if (nvec < 0) if (nvec_allocated < 0)
goto msix_err; goto msix_err;
/* If we cannot allocate one MSIx vector per queue /* If we cannot allocate one MSIx vector per queue
* then limit the number of rx queues to 1 * then limit the number of rx queues to 1
*/ */
if (nvec == VMXNET3_LINUX_MIN_MSIX_VECT) { if (nvec_allocated == VMXNET3_LINUX_MIN_MSIX_VECT &&
nvec != VMXNET3_LINUX_MIN_MSIX_VECT) {
if (adapter->share_intr != VMXNET3_INTR_BUDDYSHARE if (adapter->share_intr != VMXNET3_INTR_BUDDYSHARE
|| adapter->num_rx_queues != 1) { || adapter->num_rx_queues != 1) {
adapter->share_intr = VMXNET3_INTR_TXSHARE; adapter->share_intr = VMXNET3_INTR_TXSHARE;
...@@ -3291,14 +3292,14 @@ vmxnet3_alloc_intr_resources(struct vmxnet3_adapter *adapter) ...@@ -3291,14 +3292,14 @@ vmxnet3_alloc_intr_resources(struct vmxnet3_adapter *adapter)
} }
} }
adapter->intr.num_intrs = nvec; adapter->intr.num_intrs = nvec_allocated;
return; return;
msix_err: msix_err:
/* If we cannot allocate MSIx vectors use only one rx queue */ /* If we cannot allocate MSIx vectors use only one rx queue */
dev_info(&adapter->pdev->dev, dev_info(&adapter->pdev->dev,
"Failed to enable MSI-X, error %d. " "Failed to enable MSI-X, error %d. "
"Limiting #rx queues to 1, try MSI.\n", nvec); "Limiting #rx queues to 1, try MSI.\n", nvec_allocated);
adapter->intr.type = VMXNET3_IT_MSI; adapter->intr.type = VMXNET3_IT_MSI;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment