From ac941d304e541a5a9aad6882ca3cbc3fbd4a7d95 Mon Sep 17 00:00:00 2001 From: Bing Zhao Date: Mon, 13 Nov 2023 09:24:48 +0200 Subject: [PATCH] net/mlx5: fix shared Rx queue list management [ upstream commit bcc220cb57d7a2c45703c7215aad2320ac0a1e51 ] In shared Rx queue case, the shared control structure could only be released after the last port's dereference in the group. There is another management list that holding all of the used Rx queues' structures for a port. If the reference count of a control structure is changed to zero during port close, it can be removed from the list directly without freeing the resource. Fixes: 09c2555303be ("net/mlx5: support shared Rx queue") Signed-off-by: Bing Zhao Acked-by: Viacheslav Ovsiienko --- drivers/net/mlx5/mlx5_rxq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c index e4d0291b9d..da1b1f8bb9 100644 --- a/drivers/net/mlx5/mlx5_rxq.c +++ b/drivers/net/mlx5/mlx5_rxq.c @@ -2161,6 +2161,7 @@ mlx5_rxq_release(struct rte_eth_dev *dev, uint16_t idx) RTE_ETH_QUEUE_STATE_STOPPED; } } else { /* Refcnt zero, closing device. */ + LIST_REMOVE(rxq_ctrl, next); LIST_REMOVE(rxq, owner_entry); if (LIST_EMPTY(&rxq_ctrl->owners)) { if (rxq_ctrl->type == MLX5_RXQ_TYPE_STANDARD) @@ -2168,7 +2169,6 @@ mlx5_rxq_release(struct rte_eth_dev *dev, uint16_t idx) (&rxq_ctrl->rxq.mr_ctrl.cache_bh); if (rxq_ctrl->rxq.shared) LIST_REMOVE(rxq_ctrl, share_entry); - LIST_REMOVE(rxq_ctrl, next); mlx5_free(rxq_ctrl); } dev->data->rx_queues[idx] = NULL;