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().

Signed-off-by: Michael Savisko <michael...@nvidia.com>
---
 drivers/net/mlx5/linux/mlx5_os.c | 11 +++++++++++
 drivers/net/mlx5/mlx5.h          |  6 ++++++
 2 files changed, 17 insertions(+)

diff --git a/drivers/net/mlx5/linux/mlx5_os.c b/drivers/net/mlx5/linux/mlx5_os.c
index 0741028dab..840e650045 100644
--- a/drivers/net/mlx5/linux/mlx5_os.c
+++ b/drivers/net/mlx5/linux/mlx5_os.c
@@ -708,6 +708,17 @@ 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 8af84aef50..b93d451af6 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -1178,6 +1178,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.
@@ -1229,6 +1234,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;
-- 
2.27.0

Reply via email to