| From fb4dd00ad47f2a62f94d5dee969e2c2a4be5f699 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 7 Dec 2021 00:17:37 -0800 |
| Subject: vmxnet3: fix minimum vectors alloc issue |
| |
| From: Ronak Doshi <doshir@vmware.com> |
| |
| [ Upstream commit f71ef02f1a4a3c49962fa341ad8de19071f0f9bf ] |
| |
| 'Commit 39f9895a00f4 ("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: 39f9895a00f4 ("vmxnet3: add support for 32 Tx/Rx queues") |
| Signed-off-by: Ronak Doshi <doshir@vmware.com> |
| Acked-by: Guolin Yang <gyang@vmware.com> |
| Link: https://lore.kernel.org/r/20211207081737.14000-1-doshir@vmware.com |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/vmxnet3/vmxnet3_drv.c | 13 +++++++------ |
| 1 file changed, 7 insertions(+), 6 deletions(-) |
| |
| diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c |
| index 8799854bacb29..5b0215b7c1761 100644 |
| --- a/drivers/net/vmxnet3/vmxnet3_drv.c |
| +++ b/drivers/net/vmxnet3/vmxnet3_drv.c |
| @@ -3261,7 +3261,7 @@ vmxnet3_alloc_intr_resources(struct vmxnet3_adapter *adapter) |
| |
| #ifdef CONFIG_PCI_MSI |
| if (adapter->intr.type == VMXNET3_IT_MSIX) { |
| - int i, nvec; |
| + int i, nvec, nvec_allocated; |
| |
| nvec = adapter->share_intr == VMXNET3_INTR_TXSHARE ? |
| 1 : adapter->num_tx_queues; |
| @@ -3274,14 +3274,15 @@ vmxnet3_alloc_intr_resources(struct vmxnet3_adapter *adapter) |
| for (i = 0; i < nvec; i++) |
| adapter->intr.msix_entries[i].entry = i; |
| |
| - nvec = vmxnet3_acquire_msix_vectors(adapter, nvec); |
| - if (nvec < 0) |
| + nvec_allocated = vmxnet3_acquire_msix_vectors(adapter, nvec); |
| + if (nvec_allocated < 0) |
| goto msix_err; |
| |
| /* If we cannot allocate one MSIx vector per queue |
| * 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 |
| || adapter->num_rx_queues != 1) { |
| adapter->share_intr = VMXNET3_INTR_TXSHARE; |
| @@ -3291,14 +3292,14 @@ vmxnet3_alloc_intr_resources(struct vmxnet3_adapter *adapter) |
| } |
| } |
| |
| - adapter->intr.num_intrs = nvec; |
| + adapter->intr.num_intrs = nvec_allocated; |
| 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", nvec); |
| + "Limiting #rx queues to 1, try MSI.\n", nvec_allocated); |
| |
| adapter->intr.type = VMXNET3_IT_MSI; |
| } |
| -- |
| 2.33.0 |
| |