net/mlx5: fix Rx queue ref count in flushing user flows
PATCH 1/1 net/mlx5: fix Rx queue ref count in flushing user flows
Some indirect table and hrxq is created in the rule creation with QUEUE or RSS action. When stopping a port, the 'dev_started' is set to 0 in the beginning. The mlx5_ind_table_obj_release() should still do the dereference of the queue(s) when it is called in the polling of flow rule deletion, due to the fact that a flow with Q/RSS action is always referring to the active Rx queues.
The callback now can only pass one input parameter. Using a global flag per device to indicate that the user flows flushing is in progress. Then the reference count of the queue(s) should be decreased.
--- drivers/net/mlx5/mlx5.h | 1 + drivers/net/mlx5/mlx5_flow.c | 3 +++ drivers/net/mlx5/mlx5_rxq.c | 8 +++++--- 3 files changed, 9 insertions(+), 3 deletions(-)
drivers/net/mlx5/mlx5.h +1 -0
@@ -2033,6 +2033,7 @@ struct mlx5_priv {RTE_ATOMIC (uint32_t ) hws_mark_refcnt;/* HWS mark action reference counter. */ struct rte_pmd_mlx5_flow_engine_mode_info mode_info;/* Process set flow engine info. */ struct mlx5_flow_hw_attr *hw_attr;/* HW Steering port configuration. */ +bool hws_rule_flushing;/**< Whether this port is in rules flushing stage. */ #if defined(HAVE_IBV_FLOW_DV_SUPPORT ) || !defined(HAVE_INFINIBAND_VERBS_H )/* Item template list. */ LIST_HEAD(flow_hw_itt, rte_flow_pattern_template) flow_hw_itt;
drivers/net/mlx5/mlx5_flow.c +3 -0
@@ -8118,7 +8118,10 @@ mlx5_flow_list_flush(struct rte_eth_dev *dev, enum mlx5_flow_type type,#ifdef HAVE_IBV_FLOW_DV_SUPPORT if (priv->sh->config.dv_flow_en ==2 && type ==MLX5_FLOW_TYPE_GEN ) { + priv->hws_rule_flushing = true;flow_hw_q_flow_flush (dev,NULL ); + priv->hws_rule_flushing = false; +return ; }#endif MLX5_IPOOL_FOREACH(priv->flows[type], fidx, flow) {
drivers/net/mlx5/mlx5_rxq.c +5 -3
@@ -2894,6 +2894,7 @@ static void __mlx5_hrxq_remove(struct rte_eth_dev *dev, struct mlx5_hrxq *hrxq) { struct mlx5_priv *priv = dev->data->dev_private; +bool deref_rxqs = true;#ifdef HAVE_IBV_FLOW_DV_SUPPORT if (hrxq->hws_flags)
@@ -2903,9 +2904,10 @@ __mlx5_hrxq_remove(struct rte_eth_dev *dev, struct mlx5_hrxq *hrxq)#endif priv->obj_ops.hrxq_destroy (hrxq);if (!hrxq->standalone) { -mlx5_ind_table_obj_release (dev, hrxq->ind_table, - hrxq->hws_flags ? - (!!dev->data->dev_started) : true); +if (!dev->data->dev_started && hrxq->hws_flags && + !priv->hws_rule_flushing) + deref_rxqs = false; +mlx5_ind_table_obj_release (dev, hrxq->ind_table, deref_rxqs); }mlx5_ipool_free (priv->sh->ipool[MLX5_IPOOL_HRXQ ], hrxq->idx); }
Signature · 1 line
2.34.1
Hi,
From: Bing Zhao <[email protected]>
Sent: Wednesday, November 13, 2024 9:22 AM
To: Dariusz Sosnowski; Slava Ovsiienko; [email protected]; Raslan Darawsheh
Cc: Ori Kam; Suanming Mou; Matan Azrad; [email protected]
Subject: [PATCH] net/mlx5: fix Rx queue ref count in flushing user flows
Some indirect table and hrxq is created in the rule creation with QUEUE or RSS action. When stopping a port, the 'dev_started' is set to 0 in the beginning. The mlx5_ind_table_obj_release() should still do the dereference of the queue(s) when it is called in the polling of flow rule deletion, due to the fact that a flow with Q/RSS action is always referring to the active Rx queues.
The callback now can only pass one input parameter. Using a global flag per device to indicate that the user flows flushing is in progress. Then the reference count of the queue(s) should be decreased.
Patch applied to next-net-mlx,
Kindest regards,
Raslan Darawsheh