From: Sasha Levin Date: Mon, 26 Jul 2021 12:16:16 +0000 (-0400) Subject: Fixes for 5.13 X-Git-Tag: v4.4.277~12 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7de1e91801a380c1ee40dd171ec87074390cdcad;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 5.13 Signed-off-by: Sasha Levin --- diff --git a/queue-5.13/series b/queue-5.13/series index f29ff3edee3..721274c68e5 100644 --- a/queue-5.13/series +++ b/queue-5.13/series @@ -220,3 +220,4 @@ arm64-entry-fix-kcov-suppression.patch perf-inject-close-inject.output-on-exit.patch drm-i915-gvt-clear-d3_entered-on-elsp-cmd-submission.patch spi-spi-cadence-quadspi-fix-division-by-zero-warning-try2.patch +sfc-ensure-correct-number-of-xdp-queues.patch diff --git a/queue-5.13/sfc-ensure-correct-number-of-xdp-queues.patch b/queue-5.13/sfc-ensure-correct-number-of-xdp-queues.patch new file mode 100644 index 00000000000..bd42d3e69ea --- /dev/null +++ b/queue-5.13/sfc-ensure-correct-number-of-xdp-queues.patch @@ -0,0 +1,84 @@ +From 67f2fc93c6a444392870f61f512b4ce09a6b8f03 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + 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 +