net/mlx5: fix send to kernel resources release
PATCH 1/1 net/mlx5: fix send to kernel resources release
In the MLX5 PMD hierarchy a flow table is bound to a domain object. A domain object can be released if it does not reference any flow tables.
When the PMD creates a send to kernel flow action, it also creates a dedicated flow table for that action.
The PMD called for Rx, Tx and FDB domain destruction before it destroyed send to kernel resources - flow action and flow table. As a result, domain destruction could not be completed.
The patch moves send to kernel actions and tables destruction before domain destruction.
Fixes f31a141e6478 ("net/mlx5: add send to kernel action resource holder")
Signed-off-by Gregory Etelson <[email protected]>
--- drivers/net/mlx5/linux/mlx5_os.c | 40 ++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 15 deletions(-)
drivers/net/mlx5/linux/mlx5_os.c +25 -15
@@ -737,6 +737,30 @@ mlx5_alloc_shared_dr(struct rte_eth_dev *eth_dev)return err; } +#ifdef HAVE_MLX5DV_DR +static void +mlx5_destroy_send_to_kernel_action (struct mlx5_dev_ctx_shared *sh) +{ +int i; + +for (i =0 ; i <MLX5DR_TABLE_TYPE_MAX ; i++) { +if (sh->send_to_kernel_action[i].action) { +void *action = sh->send_to_kernel_action[i].action; + + mlx5_glue->destroy_flow_action (action); + sh->send_to_kernel_action[i].action =NULL ; + } +if (sh->send_to_kernel_action[i].tbl) { +struct mlx5_flow_tbl_resource *tbl = + sh->send_to_kernel_action[i].tbl; + +flow_dv_tbl_resource_release (sh, tbl); + sh->send_to_kernel_action[i].tbl =NULL ; + } + } +} +#endif /* HAVE_MLX5DV_DR */ +/** * Destroy DR related data within private structure. *
@@ -763,6 +787,7 @@ mlx5_os_free_shared_dr(struct mlx5_priv *priv) priv->dev_data->port_id, i);MLX5_ASSERT (LIST_EMPTY (&sh->shared_rxqs));#ifdef HAVE_MLX5DV_DR +mlx5_destroy_send_to_kernel_action (sh);if (sh->rx_domain) { mlx5_glue->dr_destroy_domain (sh->rx_domain); sh->rx_domain =NULL ;
@@ -785,21 +810,6 @@ mlx5_os_free_shared_dr(struct mlx5_priv *priv) mlx5_glue->destroy_flow_action (sh->pop_vlan_action); sh->pop_vlan_action = NULL; } -for (i =0 ; i <MLX5DR_TABLE_TYPE_MAX ; i++) { -if (sh->send_to_kernel_action[i].action) { -void *action = sh->send_to_kernel_action[i].action; - - mlx5_glue->destroy_flow_action (action); - sh->send_to_kernel_action[i].action =NULL ; - } -if (sh->send_to_kernel_action[i].tbl) { -struct mlx5_flow_tbl_resource *tbl = - sh->send_to_kernel_action[i].tbl; - -flow_dv_tbl_resource_release (sh, tbl); - sh->send_to_kernel_action[i].tbl =NULL ; - } - }#endif /* HAVE_MLX5DV_DR */ if (sh->default_miss_action) mlx5_glue->destroy_flow_action
Signature · 1 line
2.51.0