patch 'net/mlx5: fix external queues access' has been queued to stable release 23.11.6
Shani Peretz
shperetz at nvidia.com
Thu Dec 25 10:18:16 CET 2025
Hi,
FYI, your patch has been queued to stable release 23.11.6
Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 12/30/25. So please
shout if anyone has objections.
Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.
Queued patches are on a temporary branch at:
https://github.com/shanipr/dpdk-stable
This queued commit can be viewed at:
https://github.com/shanipr/dpdk-stable/commit/4b7f438400546fae4be2fc97d7889ba23d4f650d
Thanks.
Shani
---
>From 4b7f438400546fae4be2fc97d7889ba23d4f650d Mon Sep 17 00:00:00 2001
From: Gregory Etelson <getelson at nvidia.com>
Date: Tue, 18 Nov 2025 11:59:00 +0200
Subject: [PATCH] net/mlx5: fix external queues access
[ upstream commit d524b58819b46ea47d02338204d24c2f2ba29ee2 ]
mlx5_ext_rxq_get() did not return
NULL value if query index was not referencing external queue.
As a result, calling functions did not expect the NULL on return.
External Rx queue:
- In mlx5_ext_rxq_get() remove assert and return NULL if a queue index
does not point to a valid external queue.
- In mlx5_ext_rxq_verify() validate that probed queue index references
a valid extern queue.
Fixes: 311b17e669ab ("net/mlx5: support queue/RSS actions for external Rx queue")
Cc: stable at dpdk.org
Signed-off-by: Gregory Etelson <getelson at nvidia.com>
Acked-by: Dariusz Sosnowski <dsosnowski at nvidia.com>
---
drivers/net/mlx5/mlx5_devx.c | 5 +++++
drivers/net/mlx5/mlx5_rxq.c | 17 ++++++++++-------
2 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/drivers/net/mlx5/mlx5_devx.c b/drivers/net/mlx5/mlx5_devx.c
index be9dbf0467..92e4e09002 100644
--- a/drivers/net/mlx5/mlx5_devx.c
+++ b/drivers/net/mlx5/mlx5_devx.c
@@ -684,6 +684,11 @@ mlx5_devx_ind_table_create_rqt_attr(struct rte_eth_dev *dev,
struct mlx5_external_rxq *ext_rxq =
mlx5_ext_rxq_get(dev, queues[i]);
+ if (ext_rxq == NULL) {
+ rte_errno = EINVAL;
+ mlx5_free(rqt_attr);
+ return NULL;
+ }
rqt_attr->rq_list[i] = ext_rxq->hw_id;
} else {
struct mlx5_rxq_priv *rxq =
diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
index e66fe8e310..33dfda185b 100644
--- a/drivers/net/mlx5/mlx5_rxq.c
+++ b/drivers/net/mlx5/mlx5_rxq.c
@@ -2162,7 +2162,8 @@ mlx5_ext_rxq_ref(struct rte_eth_dev *dev, uint16_t idx)
{
struct mlx5_external_rxq *rxq = mlx5_ext_rxq_get(dev, idx);
- __atomic_fetch_add(&rxq->refcnt, 1, __ATOMIC_RELAXED);
+ if (rxq != NULL)
+ __atomic_fetch_add(&rxq->refcnt, 1, __ATOMIC_RELAXED);
return rxq;
}
@@ -2182,7 +2183,9 @@ mlx5_ext_rxq_deref(struct rte_eth_dev *dev, uint16_t idx)
{
struct mlx5_external_rxq *rxq = mlx5_ext_rxq_get(dev, idx);
- return __atomic_fetch_sub(&rxq->refcnt, 1, __ATOMIC_RELAXED) - 1;
+ return rxq != NULL ?
+ __atomic_fetch_sub(&rxq->refcnt, 1, __ATOMIC_RELAXED) :
+ UINT32_MAX - 1;
}
/**
@@ -2201,8 +2204,8 @@ mlx5_ext_rxq_get(struct rte_eth_dev *dev, uint16_t idx)
{
struct mlx5_priv *priv = dev->data->dev_private;
- MLX5_ASSERT(mlx5_is_external_rxq(dev, idx));
- return &priv->ext_rxqs[idx - RTE_PMD_MLX5_EXTERNAL_RX_QUEUE_ID_MIN];
+ return mlx5_is_external_rxq(dev, idx) ?
+ &priv->ext_rxqs[idx - RTE_PMD_MLX5_EXTERNAL_RX_QUEUE_ID_MIN] : NULL;
}
/**
@@ -2365,7 +2368,6 @@ int
mlx5_ext_rxq_verify(struct rte_eth_dev *dev)
{
struct mlx5_priv *priv = dev->data->dev_private;
- struct mlx5_external_rxq *rxq;
uint32_t i;
int ret = 0;
@@ -2373,8 +2375,9 @@ mlx5_ext_rxq_verify(struct rte_eth_dev *dev)
return 0;
for (i = RTE_PMD_MLX5_EXTERNAL_RX_QUEUE_ID_MIN; i <= UINT16_MAX ; ++i) {
- rxq = mlx5_ext_rxq_get(dev, i);
- if (rxq->refcnt < 2)
+ struct mlx5_external_rxq *rxq = mlx5_ext_rxq_get(dev, i);
+
+ if (rxq == NULL || rxq->refcnt < 2)
continue;
DRV_LOG(DEBUG, "Port %u external RxQ %u still referenced.",
dev->data->port_id, i);
--
2.43.0
---
Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- - 2025-12-25 11:16:39.100416038 +0200
+++ 0055-net-mlx5-fix-external-queues-access.patch 2025-12-25 11:16:35.896996000 +0200
@@ -1 +1 @@
-From d524b58819b46ea47d02338204d24c2f2ba29ee2 Mon Sep 17 00:00:00 2001
+From 4b7f438400546fae4be2fc97d7889ba23d4f650d Mon Sep 17 00:00:00 2001
@@ -3 +3 @@
-Date: Thu, 30 Oct 2025 11:11:38 +0200
+Date: Tue, 18 Nov 2025 11:59:00 +0200
@@ -6 +6,3 @@
-mlx5_ext_rxq_get() and mlx5_ext_txq_get() functions did not return
+[ upstream commit d524b58819b46ea47d02338204d24c2f2ba29ee2 ]
+
+mlx5_ext_rxq_get() did not return
@@ -19,8 +20,0 @@
-External Tx queue:
-
-- In mlx5_ext_txq_get() remove assert and return NULL if a queue index
- does not point to a valid external queue.
-
-- In mlx5_ext_txq_verify() validate that probed queue index references
- a valid extern queue.
-
@@ -34 +27,0 @@
- drivers/net/mlx5/mlx5_flow.h | 2 ++
@@ -36,2 +29 @@
- drivers/net/mlx5/mlx5_txq.c | 10 +++++-----
- 4 files changed, 22 insertions(+), 12 deletions(-)
+ 2 files changed, 15 insertions(+), 7 deletions(-)
@@ -40 +32 @@
-index 673c9f3902..523b53d713 100644
+index be9dbf0467..92e4e09002 100644
@@ -43,2 +35,2 @@
-@@ -761,6 +761,11 @@ mlx5_devx_ind_table_create_rqt_attr(struct rte_eth_dev *dev,
- struct mlx5_external_q *ext_rxq =
+@@ -684,6 +684,11 @@ mlx5_devx_ind_table_create_rqt_attr(struct rte_eth_dev *dev,
+ struct mlx5_external_rxq *ext_rxq =
@@ -55,13 +46,0 @@
-diff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h
-index 2de0f35815..308aeadcc8 100644
---- a/drivers/net/mlx5/mlx5_flow.h
-+++ b/drivers/net/mlx5/mlx5_flow.h
-@@ -2042,6 +2042,8 @@ flow_hw_get_sqn(struct rte_eth_dev *dev, uint16_t tx_queue, uint32_t *sqn)
- }
- if (mlx5_is_external_txq(dev, tx_queue)) {
- ext_txq = mlx5_ext_txq_get(dev, tx_queue);
-+ if (ext_txq == NULL)
-+ return -EINVAL;
- *sqn = ext_txq->hw_id;
- return 0;
- }
@@ -69 +48 @@
-index 2264dea877..9210a92c5f 100644
+index e66fe8e310..33dfda185b 100644
@@ -72 +51 @@
-@@ -2216,7 +2216,8 @@ mlx5_ext_rxq_ref(struct rte_eth_dev *dev, uint16_t idx)
+@@ -2162,7 +2162,8 @@ mlx5_ext_rxq_ref(struct rte_eth_dev *dev, uint16_t idx)
@@ -74 +53 @@
- struct mlx5_external_q *rxq = mlx5_ext_rxq_get(dev, idx);
+ struct mlx5_external_rxq *rxq = mlx5_ext_rxq_get(dev, idx);
@@ -76 +55 @@
-- rte_atomic_fetch_add_explicit(&rxq->refcnt, 1, rte_memory_order_relaxed);
+- __atomic_fetch_add(&rxq->refcnt, 1, __ATOMIC_RELAXED);
@@ -78 +57 @@
-+ rte_atomic_fetch_add_explicit(&rxq->refcnt, 1, rte_memory_order_relaxed);
++ __atomic_fetch_add(&rxq->refcnt, 1, __ATOMIC_RELAXED);
@@ -82 +61 @@
-@@ -2236,7 +2237,9 @@ mlx5_ext_rxq_deref(struct rte_eth_dev *dev, uint16_t idx)
+@@ -2182,7 +2183,9 @@ mlx5_ext_rxq_deref(struct rte_eth_dev *dev, uint16_t idx)
@@ -84 +63 @@
- struct mlx5_external_q *rxq = mlx5_ext_rxq_get(dev, idx);
+ struct mlx5_external_rxq *rxq = mlx5_ext_rxq_get(dev, idx);
@@ -86 +65 @@
-- return rte_atomic_fetch_sub_explicit(&rxq->refcnt, 1, rte_memory_order_relaxed) - 1;
+- return __atomic_fetch_sub(&rxq->refcnt, 1, __ATOMIC_RELAXED) - 1;
@@ -88,2 +67,2 @@
-+ rte_atomic_fetch_sub_explicit(&rxq->refcnt, 1, rte_memory_order_relaxed) - 1 :
-+ UINT32_MAX;
++ __atomic_fetch_sub(&rxq->refcnt, 1, __ATOMIC_RELAXED) :
++ UINT32_MAX - 1;
@@ -93 +72 @@
-@@ -2255,8 +2258,8 @@ mlx5_ext_rxq_get(struct rte_eth_dev *dev, uint16_t idx)
+@@ -2201,8 +2204,8 @@ mlx5_ext_rxq_get(struct rte_eth_dev *dev, uint16_t idx)
@@ -100 +79 @@
-+ &priv->ext_rxqs[idx - RTE_PMD_MLX5_EXTERNAL_RX_QUEUE_ID_MIN] : NULL;
++ &priv->ext_rxqs[idx - RTE_PMD_MLX5_EXTERNAL_RX_QUEUE_ID_MIN] : NULL;
@@ -104 +83 @@
-@@ -2419,7 +2422,6 @@ int
+@@ -2365,7 +2368,6 @@ int
@@ -108 +87 @@
-- struct mlx5_external_q *rxq;
+- struct mlx5_external_rxq *rxq;
@@ -112 +91 @@
-@@ -2427,8 +2429,9 @@ mlx5_ext_rxq_verify(struct rte_eth_dev *dev)
+@@ -2373,8 +2375,9 @@ mlx5_ext_rxq_verify(struct rte_eth_dev *dev)
@@ -118 +97 @@
-+ struct mlx5_external_q *rxq = mlx5_ext_rxq_get(dev, i);
++ struct mlx5_external_rxq *rxq = mlx5_ext_rxq_get(dev, i);
@@ -123,35 +101,0 @@
- dev->data->port_id, i);
-diff --git a/drivers/net/mlx5/mlx5_txq.c b/drivers/net/mlx5/mlx5_txq.c
-index e20165d74e..e273486809 100644
---- a/drivers/net/mlx5/mlx5_txq.c
-+++ b/drivers/net/mlx5/mlx5_txq.c
-@@ -1281,8 +1281,8 @@ mlx5_ext_txq_get(struct rte_eth_dev *dev, uint16_t idx)
- {
- struct mlx5_priv *priv = dev->data->dev_private;
-
-- MLX5_ASSERT(mlx5_is_external_txq(dev, idx));
-- return &priv->ext_txqs[idx - MLX5_EXTERNAL_TX_QUEUE_ID_MIN];
-+ return mlx5_is_external_txq(dev, idx) ?
-+ &priv->ext_txqs[idx - MLX5_EXTERNAL_TX_QUEUE_ID_MIN] : NULL;
- }
-
- /**
-@@ -1298,7 +1298,6 @@ int
- mlx5_ext_txq_verify(struct rte_eth_dev *dev)
- {
- struct mlx5_priv *priv = dev->data->dev_private;
-- struct mlx5_external_q *txq;
- uint32_t i;
- int ret = 0;
-
-@@ -1306,8 +1305,9 @@ mlx5_ext_txq_verify(struct rte_eth_dev *dev)
- return 0;
-
- for (i = MLX5_EXTERNAL_TX_QUEUE_ID_MIN; i <= UINT16_MAX ; ++i) {
-- txq = mlx5_ext_txq_get(dev, i);
-- if (txq->refcnt < 2)
-+ struct mlx5_external_q *txq = mlx5_ext_txq_get(dev, i);
-+
-+ if (txq == NULL || txq->refcnt < 2)
- continue;
- DRV_LOG(DEBUG, "Port %u external TxQ %u still referenced.",
More information about the stable
mailing list