The counters that are used to record the dropped packets (including
hairpin) are created firstly. Then the counter objects are provided
to the command to create the Rx queues, and they are used for the
global drop and hairpin queues drop statistics. One counter can be
associated with more than one queue in hairpin case.
So the reference count of a counter will be increased once attached
to a queue. When closing the device, the queues and counters should
be destroyed in the reverse order. The queues should be destroyed
firstly in order to decrease the reference count of attached counter
properlly. Then the counter can be recycled successfully. Or else the
resource will be leaked before the application quits when doing port
attach / detach rerepeatedly.
Fixes: f0c0731b6d40 ("net/mlx5: add counters for hairpin drop")
Cc: [email protected]
Cc: [email protected]
Signed-off-by: Bing Zhao <[email protected]>
Acked-by: Suanming Mou <[email protected]>
---
drivers/net/mlx5/mlx5.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index decf540c51..bde4d01e48 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -2404,7 +2404,6 @@ mlx5_dev_close(struct rte_eth_dev *dev)
priv->ptype_rss_groups = NULL;
}
#endif
- mlx5_q_counters_destroy(dev);
if (priv->rxq_privs != NULL) {
/* XXX race condition if mlx5_rx_burst() is still running. */
rte_delay_us_sleep(1000);
@@ -2425,6 +2424,7 @@ mlx5_dev_close(struct rte_eth_dev *dev)
mlx5_proc_priv_uninit(dev);
if (priv->drop_queue.hrxq)
mlx5_drop_action_destroy(dev);
+ mlx5_q_counters_destroy(dev);
mlx5_mprq_free_mp(dev);
mlx5_os_free_shared_dr(priv);
#ifdef HAVE_MLX5_HWS_SUPPORT
--
2.34.1