Skip to content

Commit 4ce83cd

Browse files
net/mlx5: fix external Rx and Tx queues access
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: 311b17e ("net/mlx5: support queue/RSS actions for external Rx queue") Signed-off-by: Gregory Etelson <[email protected]> Acked-by: Dariusz Sosnowski <[email protected]>
1 parent f1c1f82 commit 4ce83cd

File tree

4 files changed

+22
-12
lines changed

4 files changed

+22
-12
lines changed

drivers/net/mlx5/mlx5_devx.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -761,6 +761,11 @@ mlx5_devx_ind_table_create_rqt_attr(struct rte_eth_dev *dev,
761761
struct mlx5_external_q *ext_rxq =
762762
mlx5_ext_rxq_get(dev, queues[i]);
763763

764+
if (ext_rxq == NULL) {
765+
rte_errno = EINVAL;
766+
mlx5_free(rqt_attr);
767+
return NULL;
768+
}
764769
rqt_attr->rq_list[i] = ext_rxq->hw_id;
765770
} else {
766771
struct mlx5_rxq_priv *rxq =

drivers/net/mlx5/mlx5_flow.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2058,6 +2058,8 @@ flow_hw_get_sqn(struct rte_eth_dev *dev, uint16_t tx_queue, uint32_t *sqn)
20582058
}
20592059
if (mlx5_is_external_txq(dev, tx_queue)) {
20602060
ext_txq = mlx5_ext_txq_get(dev, tx_queue);
2061+
if (ext_txq == NULL)
2062+
return -EINVAL;
20612063
*sqn = ext_txq->hw_id;
20622064
return 0;
20632065
}

drivers/net/mlx5/mlx5_rxq.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2216,7 +2216,8 @@ mlx5_ext_rxq_ref(struct rte_eth_dev *dev, uint16_t idx)
22162216
{
22172217
struct mlx5_external_q *rxq = mlx5_ext_rxq_get(dev, idx);
22182218

2219-
rte_atomic_fetch_add_explicit(&rxq->refcnt, 1, rte_memory_order_relaxed);
2219+
if (rxq != NULL)
2220+
rte_atomic_fetch_add_explicit(&rxq->refcnt, 1, rte_memory_order_relaxed);
22202221
return rxq;
22212222
}
22222223

@@ -2236,7 +2237,9 @@ mlx5_ext_rxq_deref(struct rte_eth_dev *dev, uint16_t idx)
22362237
{
22372238
struct mlx5_external_q *rxq = mlx5_ext_rxq_get(dev, idx);
22382239

2239-
return rte_atomic_fetch_sub_explicit(&rxq->refcnt, 1, rte_memory_order_relaxed) - 1;
2240+
return rxq != NULL ?
2241+
rte_atomic_fetch_sub_explicit(&rxq->refcnt, 1, rte_memory_order_relaxed) - 1 :
2242+
UINT32_MAX;
22402243
}
22412244

22422245
/**
@@ -2255,8 +2258,8 @@ mlx5_ext_rxq_get(struct rte_eth_dev *dev, uint16_t idx)
22552258
{
22562259
struct mlx5_priv *priv = dev->data->dev_private;
22572260

2258-
MLX5_ASSERT(mlx5_is_external_rxq(dev, idx));
2259-
return &priv->ext_rxqs[idx - RTE_PMD_MLX5_EXTERNAL_RX_QUEUE_ID_MIN];
2261+
return mlx5_is_external_rxq(dev, idx) ?
2262+
&priv->ext_rxqs[idx - RTE_PMD_MLX5_EXTERNAL_RX_QUEUE_ID_MIN] : NULL;
22602263
}
22612264

22622265
/**
@@ -2419,16 +2422,16 @@ int
24192422
mlx5_ext_rxq_verify(struct rte_eth_dev *dev)
24202423
{
24212424
struct mlx5_priv *priv = dev->data->dev_private;
2422-
struct mlx5_external_q *rxq;
24232425
uint32_t i;
24242426
int ret = 0;
24252427

24262428
if (priv->ext_rxqs == NULL)
24272429
return 0;
24282430

24292431
for (i = RTE_PMD_MLX5_EXTERNAL_RX_QUEUE_ID_MIN; i <= UINT16_MAX ; ++i) {
2430-
rxq = mlx5_ext_rxq_get(dev, i);
2431-
if (rxq->refcnt < 2)
2432+
struct mlx5_external_q *rxq = mlx5_ext_rxq_get(dev, i);
2433+
2434+
if (rxq == NULL || rxq->refcnt < 2)
24322435
continue;
24332436
DRV_LOG(DEBUG, "Port %u external RxQ %u still referenced.",
24342437
dev->data->port_id, i);

drivers/net/mlx5/mlx5_txq.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1281,8 +1281,8 @@ mlx5_ext_txq_get(struct rte_eth_dev *dev, uint16_t idx)
12811281
{
12821282
struct mlx5_priv *priv = dev->data->dev_private;
12831283

1284-
MLX5_ASSERT(mlx5_is_external_txq(dev, idx));
1285-
return &priv->ext_txqs[idx - MLX5_EXTERNAL_TX_QUEUE_ID_MIN];
1284+
return mlx5_is_external_txq(dev, idx) ?
1285+
&priv->ext_txqs[idx - MLX5_EXTERNAL_TX_QUEUE_ID_MIN] : NULL;
12861286
}
12871287

12881288
/**
@@ -1298,16 +1298,16 @@ int
12981298
mlx5_ext_txq_verify(struct rte_eth_dev *dev)
12991299
{
13001300
struct mlx5_priv *priv = dev->data->dev_private;
1301-
struct mlx5_external_q *txq;
13021301
uint32_t i;
13031302
int ret = 0;
13041303

13051304
if (priv->ext_txqs == NULL)
13061305
return 0;
13071306

13081307
for (i = MLX5_EXTERNAL_TX_QUEUE_ID_MIN; i <= UINT16_MAX ; ++i) {
1309-
txq = mlx5_ext_txq_get(dev, i);
1310-
if (txq->refcnt < 2)
1308+
struct mlx5_external_q *txq = mlx5_ext_txq_get(dev, i);
1309+
1310+
if (txq == NULL || txq->refcnt < 2)
13111311
continue;
13121312
DRV_LOG(DEBUG, "Port %u external TxQ %u still referenced.",
13131313
dev->data->port_id, i);

0 commit comments

Comments
 (0)