Add new structure mlx5_send_to_kernel_action which will hold together allocated action resource and a reference to used table. A new structure member of this type added to struct mlx5_dev_ctx_shared. The member will be initialized upon first created send_to_kernel action and will be reused for all future actions of this type. Release of these resources will be done when all shared DR resources are being released in mlx5_os_free_shared_dr().
Change function flow_dv_tbl_resource_release() from static to external. Signed-off-by: Michael Savisko <michael...@nvidia.com> Acked-by: Matan Azrad <ma...@nvidia.com> --- drivers/net/mlx5/linux/mlx5_os.c | 13 +++++++++++++ drivers/net/mlx5/mlx5.h | 6 ++++++ drivers/net/mlx5/mlx5_flow.h | 2 ++ drivers/net/mlx5/mlx5_flow_dv.c | 6 +----- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/drivers/net/mlx5/linux/mlx5_os.c b/drivers/net/mlx5/linux/mlx5_os.c index 60677eb8d7..3e505d8f4c 100644 --- a/drivers/net/mlx5/linux/mlx5_os.c +++ b/drivers/net/mlx5/linux/mlx5_os.c @@ -700,6 +700,19 @@ mlx5_os_free_shared_dr(struct mlx5_priv *priv) mlx5_glue->destroy_flow_action(sh->pop_vlan_action); sh->pop_vlan_action = NULL; } + if (sh->send_to_kernel_action.action) { + void *action = sh->send_to_kernel_action.action; + + mlx5_glue->destroy_flow_action(action); + sh->send_to_kernel_action.action = NULL; + } + if (sh->send_to_kernel_action.tbl) { + struct mlx5_flow_tbl_resource *tbl = + sh->send_to_kernel_action.tbl; + + flow_dv_tbl_resource_release(sh, tbl); + sh->send_to_kernel_action.tbl = NULL; + } #endif /* HAVE_MLX5DV_DR */ if (sh->default_miss_action) mlx5_glue->destroy_flow_action diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index 3c9e6bad53..c2c3ed81fa 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -1180,6 +1180,11 @@ struct mlx5_flex_item { struct mlx5_flex_pattern_field map[MLX5_FLEX_ITEM_MAPPING_NUM]; }; +struct mlx5_send_to_kernel_action { + void *action; + void *tbl; +}; + /* * Shared Infiniband device context for Master/Representors * which belong to same IB device with multiple IB ports. @@ -1231,6 +1236,7 @@ struct mlx5_dev_ctx_shared { /* Direct Rules tables for FDB, NIC TX+RX */ void *dr_drop_action; /* Pointer to DR drop action, any domain. */ void *pop_vlan_action; /* Pointer to DR pop VLAN action. */ + struct mlx5_send_to_kernel_action send_to_kernel_action; struct mlx5_hlist *encaps_decaps; /* Encap/decap action hash list. */ struct mlx5_hlist *modify_cmds; struct mlx5_hlist *tag_table; diff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h index 18a77ec619..525db05969 100644 --- a/drivers/net/mlx5/mlx5_flow.h +++ b/drivers/net/mlx5/mlx5_flow.h @@ -1918,6 +1918,8 @@ struct mlx5_flow_tbl_resource *flow_dv_tbl_resource_get(struct rte_eth_dev *dev, bool external, const struct mlx5_flow_tunnel *tunnel, uint32_t group_id, uint8_t dummy, uint32_t table_id, struct rte_flow_error *error); +int flow_dv_tbl_resource_release(struct mlx5_dev_ctx_shared *sh, + struct mlx5_flow_tbl_resource *tbl); struct mlx5_list_entry *flow_dv_tag_create_cb(void *tool_ctx, void *cb_ctx); int flow_dv_tag_match_cb(void *tool_ctx, struct mlx5_list_entry *entry, diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c index 6c355efed7..bcd9926b81 100644 --- a/drivers/net/mlx5/mlx5_flow_dv.c +++ b/drivers/net/mlx5/mlx5_flow_dv.c @@ -75,10 +75,6 @@ union flow_dv_attr { uint32_t attr; }; -static int -flow_dv_tbl_resource_release(struct mlx5_dev_ctx_shared *sh, - struct mlx5_flow_tbl_resource *tbl); - static int flow_dv_encap_decap_resource_release(struct rte_eth_dev *dev, uint32_t encap_decap_idx); @@ -10928,7 +10924,7 @@ flow_dv_tbl_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry) * @return * Returns 0 if table was released, else return 1; */ -static int +int flow_dv_tbl_resource_release(struct mlx5_dev_ctx_shared *sh, struct mlx5_flow_tbl_resource *tbl) { -- 2.27.0