From: Gregory Etelson <getelson@nvidia.com>
To: <dev@dpdk.org>
Cc: <thomas@monjalon.net>, <getelson@nvidia.com>,
<mkashani@nvidia.com>, <rasland@nvidia.com>,
Dariusz Sosnowski <dsosnowski@nvidia.com>,
"Viacheslav Ovsiienko" <viacheslavo@nvidia.com>,
Bing Zhao <bingz@nvidia.com>, Ori Kam <orika@nvidia.com>,
Suanming Mou <suanmingm@nvidia.com>,
Matan Azrad <matan@nvidia.com>,
Michael Baum <michaelba@nvidia.com>
Subject: [PATCH v3] net/mlx5: fix external Rx and Tx queues access
Date: Thu, 30 Oct 2025 11:11:38 +0200 [thread overview]
Message-ID: <20251030091138.223868-1-getelson@nvidia.com> (raw)
In-Reply-To: <20250731060849.18117-1-getelson@nvidia.com>
mlx5_ext_rxq_get() and mlx5_ext_txq_get() functions 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.
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.
Fixes: 311b17e669ab ("net/mlx5: support queue/RSS actions for external Rx queue")
Signed-off-by: Gregory Etelson <getelson@nvidia.com>
Acked-by: Dariusz Sosnowski <dsosnowski@nvidia.com>
---
v2: fixed MinGW compiler warnings.
v3: fix return value.
---
drivers/net/mlx5/mlx5_devx.c | 5 +++++
drivers/net/mlx5/mlx5_flow.h | 2 ++
drivers/net/mlx5/mlx5_rxq.c | 17 ++++++++++-------
drivers/net/mlx5/mlx5_txq.c | 10 +++++-----
4 files changed, 22 insertions(+), 12 deletions(-)
diff --git a/drivers/net/mlx5/mlx5_devx.c b/drivers/net/mlx5/mlx5_devx.c
index 673c9f3902..523b53d713 100644
--- a/drivers/net/mlx5/mlx5_devx.c
+++ b/drivers/net/mlx5/mlx5_devx.c
@@ -761,6 +761,11 @@ mlx5_devx_ind_table_create_rqt_attr(struct rte_eth_dev *dev,
struct mlx5_external_q *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_flow.h b/drivers/net/mlx5/mlx5_flow.h
index ff61706054..5b2e17a2a9 100644
--- a/drivers/net/mlx5/mlx5_flow.h
+++ b/drivers/net/mlx5/mlx5_flow.h
@@ -2039,6 +2039,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;
}
diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
index 1425886a22..677e8491d3 100644
--- a/drivers/net/mlx5/mlx5_rxq.c
+++ b/drivers/net/mlx5/mlx5_rxq.c
@@ -2212,7 +2212,8 @@ mlx5_ext_rxq_ref(struct rte_eth_dev *dev, uint16_t idx)
{
struct mlx5_external_q *rxq = mlx5_ext_rxq_get(dev, idx);
- rte_atomic_fetch_add_explicit(&rxq->refcnt, 1, rte_memory_order_relaxed);
+ if (rxq != NULL)
+ rte_atomic_fetch_add_explicit(&rxq->refcnt, 1, rte_memory_order_relaxed);
return rxq;
}
@@ -2232,7 +2233,9 @@ mlx5_ext_rxq_deref(struct rte_eth_dev *dev, uint16_t idx)
{
struct mlx5_external_q *rxq = mlx5_ext_rxq_get(dev, idx);
- return rte_atomic_fetch_sub_explicit(&rxq->refcnt, 1, rte_memory_order_relaxed) - 1;
+ return rxq != NULL ?
+ rte_atomic_fetch_sub_explicit(&rxq->refcnt, 1, rte_memory_order_relaxed) - 1 :
+ UINT32_MAX;
}
/**
@@ -2251,8 +2254,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;
}
/**
@@ -2415,7 +2418,6 @@ int
mlx5_ext_rxq_verify(struct rte_eth_dev *dev)
{
struct mlx5_priv *priv = dev->data->dev_private;
- struct mlx5_external_q *rxq;
uint32_t i;
int ret = 0;
@@ -2423,8 +2425,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_q *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);
diff --git a/drivers/net/mlx5/mlx5_txq.c b/drivers/net/mlx5/mlx5_txq.c
index b090d8274d..2aa2475a8a 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.",
dev->data->port_id, i);
--
2.51.0
next prev parent reply other threads:[~2025-10-30 9:13 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-31 6:08 [PATCH] net/mlx5: fix external Rx and Tx queues access Gregory Etelson
2025-08-18 6:32 ` Raslan Darawsheh
2025-09-08 21:29 ` Thomas Monjalon
2025-10-30 7:39 ` [PATCH v2] " Gregory Etelson
2025-10-30 9:11 ` Gregory Etelson [this message]
2025-11-06 7:21 ` [PATCH v3] " Raslan Darawsheh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251030091138.223868-1-getelson@nvidia.com \
--to=getelson@nvidia.com \
--cc=bingz@nvidia.com \
--cc=dev@dpdk.org \
--cc=dsosnowski@nvidia.com \
--cc=matan@nvidia.com \
--cc=michaelba@nvidia.com \
--cc=mkashani@nvidia.com \
--cc=orika@nvidia.com \
--cc=rasland@nvidia.com \
--cc=suanmingm@nvidia.com \
--cc=thomas@monjalon.net \
--cc=viacheslavo@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.