| From 67f2fc93c6a444392870f61f512b4ce09a6b8f03 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 13 Jul 2021 16:21:28 +0200 |
| Subject: sfc: ensure correct number of XDP queues |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Íñigo Huguet <ihuguet@redhat.com> |
| |
| [ Upstream commit 788bc000d4c2f25232db19ab3a0add0ba4e27671 ] |
| |
| Commit 99ba0ea616aa ("sfc: adjust efx->xdp_tx_queue_count with the real |
| number of initialized queues") intended to fix a problem caused by a |
| round up when calculating the number of XDP channels and queues. |
| However, this was not the real problem. The real problem was that the |
| number of XDP TX queues had been reduced to half in |
| commit e26ca4b53582 ("sfc: reduce the number of requested xdp ev queues"), |
| but the variable xdp_tx_queue_count had remained the same. |
| |
| Once the correct number of XDP TX queues is created again in the |
| previous patch of this series, this also can be reverted since the error |
| doesn't actually exist. |
| |
| Only in the case that there is a bug in the code we can have different |
| values in xdp_queue_number and efx->xdp_tx_queue_count. Because of this, |
| and per Edward Cree's suggestion, I add instead a WARN_ON to catch if it |
| happens again in the future. |
| |
| Note that the number of allocated queues can be higher than the number |
| of used ones due to the round up, as explained in the existing comment |
| in the code. That's why we also have to stop increasing xdp_queue_number |
| beyond efx->xdp_tx_queue_count. |
| |
| Signed-off-by: Íñigo Huguet <ihuguet@redhat.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/sfc/efx_channels.c | 15 ++++++++------- |
| 1 file changed, 8 insertions(+), 7 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/sfc/efx_channels.c b/drivers/net/ethernet/sfc/efx_channels.c |
| index 5b71f8a03a6d..bb48a139dd15 100644 |
| --- a/drivers/net/ethernet/sfc/efx_channels.c |
| +++ b/drivers/net/ethernet/sfc/efx_channels.c |
| @@ -892,18 +892,20 @@ int efx_set_channels(struct efx_nic *efx) |
| if (efx_channel_is_xdp_tx(channel)) { |
| efx_for_each_channel_tx_queue(tx_queue, channel) { |
| tx_queue->queue = next_queue++; |
| - netif_dbg(efx, drv, efx->net_dev, "Channel %u TXQ %u is XDP %u, HW %u\n", |
| - channel->channel, tx_queue->label, |
| - xdp_queue_number, tx_queue->queue); |
| + |
| /* We may have a few left-over XDP TX |
| * queues owing to xdp_tx_queue_count |
| * not dividing evenly by EFX_MAX_TXQ_PER_CHANNEL. |
| * We still allocate and probe those |
| * TXQs, but never use them. |
| */ |
| - if (xdp_queue_number < efx->xdp_tx_queue_count) |
| + if (xdp_queue_number < efx->xdp_tx_queue_count) { |
| + netif_dbg(efx, drv, efx->net_dev, "Channel %u TXQ %u is XDP %u, HW %u\n", |
| + channel->channel, tx_queue->label, |
| + xdp_queue_number, tx_queue->queue); |
| efx->xdp_tx_queues[xdp_queue_number] = tx_queue; |
| - xdp_queue_number++; |
| + xdp_queue_number++; |
| + } |
| } |
| } else { |
| efx_for_each_channel_tx_queue(tx_queue, channel) { |
| @@ -915,8 +917,7 @@ int efx_set_channels(struct efx_nic *efx) |
| } |
| } |
| } |
| - if (xdp_queue_number) |
| - efx->xdp_tx_queue_count = xdp_queue_number; |
| + WARN_ON(xdp_queue_number != efx->xdp_tx_queue_count); |
| |
| rc = netif_set_real_num_tx_queues(efx->net_dev, efx->n_tx_channels); |
| if (rc) |
| -- |
| 2.30.2 |
| |