TIR/FT actions are different in the context of shared ibv resource, it
created on the local ibv_context and aliased to the shared ibv_context.
Other actions should be created on the shared ibv resource, new flag was
added to indicates where this object came from.

Signed-off-by: Erez Shitrit <ere...@nvidia.com>
Reviewed-by: Alex Vesker <va...@nvidia.com>
Acked-by: Viacheslav Ovsiienko <viachesl...@nvidia.com>
---
 drivers/net/mlx5/hws/mlx5dr.h        |  5 ++-
 drivers/net/mlx5/hws/mlx5dr_action.c | 60 ++++++++++++++++++++++++++--
 drivers/net/mlx5/hws/mlx5dr_action.h |  3 ++
 drivers/net/mlx5/mlx5_devx.c         |  2 +-
 4 files changed, 64 insertions(+), 6 deletions(-)

diff --git a/drivers/net/mlx5/hws/mlx5dr.h b/drivers/net/mlx5/hws/mlx5dr.h
index aa36e3111f..c0f9a5e984 100644
--- a/drivers/net/mlx5/hws/mlx5dr.h
+++ b/drivers/net/mlx5/hws/mlx5dr.h
@@ -410,12 +410,15 @@ mlx5dr_action_create_dest_vport(struct mlx5dr_context 
*ctx,
  *     Direct rule TIR devx object.
  * @param[in] flags
  *     Action creation flags. (enum mlx5dr_action_flags)
+ * @param[in] is_local
+ *     indicates where the tir object was created, local gvmi or other gvmi
  * @return pointer to mlx5dr_action on success NULL otherwise.
  */
 struct mlx5dr_action *
 mlx5dr_action_create_dest_tir(struct mlx5dr_context *ctx,
                              struct mlx5dr_devx_obj *obj,
-                             uint32_t flags);
+                             uint32_t flags,
+                             bool is_local);
 
 /* Create direct rule TAG action.
  *
diff --git a/drivers/net/mlx5/hws/mlx5dr_action.c 
b/drivers/net/mlx5/hws/mlx5dr_action.c
index da19c1ca7d..2db62635c1 100644
--- a/drivers/net/mlx5/hws/mlx5dr_action.c
+++ b/drivers/net/mlx5/hws/mlx5dr_action.c
@@ -744,7 +744,10 @@ mlx5dr_action_create_dest_table(struct mlx5dr_context *ctx,
                return NULL;
 
        if (mlx5dr_action_is_root_flags(flags)) {
-               action->devx_obj = tbl->ft->obj;
+               if (mlx5dr_context_shared_gvmi_used(ctx))
+                       action->devx_obj = tbl->local_ft->obj;
+               else
+                       action->devx_obj = tbl->ft->obj;
        } else {
                ret = mlx5dr_action_create_stcs(action, tbl->ft);
                if (ret)
@@ -758,10 +761,38 @@ mlx5dr_action_create_dest_table(struct mlx5dr_context 
*ctx,
        return NULL;
 }
 
+static int mlx5dr_action_get_dest_tir_obj(struct mlx5dr_context *ctx,
+                                         struct mlx5dr_action *action,
+                                         struct mlx5dr_devx_obj *obj,
+                                         struct mlx5dr_devx_obj **ret_obj)
+{
+       int ret;
+
+       if (mlx5dr_context_shared_gvmi_used(ctx)) {
+               ret = mlx5dr_matcher_create_aliased_obj(ctx,
+                                                       ctx->local_ibv_ctx,
+                                                       ctx->ibv_ctx,
+                                                       ctx->caps->vhca_id,
+                                                       obj->id,
+                                                       
MLX5_GENERAL_OBJ_TYPE_TIR_ALIAS,
+                                                       
&action->alias.devx_obj);
+               if (ret) {
+                       DR_LOG(ERR, "Failed to create tir alias");
+                       return rte_errno;
+               }
+               *ret_obj = action->alias.devx_obj;
+       } else {
+               *ret_obj = obj;
+       }
+
+       return 0;
+}
+
 struct mlx5dr_action *
 mlx5dr_action_create_dest_tir(struct mlx5dr_context *ctx,
                              struct mlx5dr_devx_obj *obj,
-                             uint32_t flags)
+                             uint32_t flags,
+                             bool is_local)
 {
        struct mlx5dr_action *action;
        int ret;
@@ -773,6 +804,13 @@ mlx5dr_action_create_dest_tir(struct mlx5dr_context *ctx,
                return NULL;
        }
 
+       if (!is_local) {
+               DR_LOG(ERR, "TIR should be created on local ibv_device, flags: 
0x%x",
+                      flags);
+               rte_errno = ENOTSUP;
+               return NULL;
+       }
+
        action = mlx5dr_action_create_generic(ctx, flags, 
MLX5DR_ACTION_TYP_TIR);
        if (!action)
                return NULL;
@@ -780,13 +818,23 @@ mlx5dr_action_create_dest_tir(struct mlx5dr_context *ctx,
        if (mlx5dr_action_is_root_flags(flags)) {
                action->devx_obj = obj->obj;
        } else {
-               ret = mlx5dr_action_create_stcs(action, obj);
-               if (ret)
+               struct mlx5dr_devx_obj *cur_obj = NULL; /*compilation warn*/
+
+               ret = mlx5dr_action_get_dest_tir_obj(ctx, action, obj, 
&cur_obj);
+               if (ret) {
+                       DR_LOG(ERR, "Failed to create tir alias (flags: %d)", 
flags);
                        goto free_action;
+               }
+
+               ret = mlx5dr_action_create_stcs(action, cur_obj);
+               if (ret)
+                       goto clean_obj;
        }
 
        return action;
 
+clean_obj:
+       mlx5dr_cmd_destroy_obj(action->alias.devx_obj);
 free_action:
        simple_free(action);
        return NULL;
@@ -1589,6 +1637,10 @@ static void mlx5dr_action_destroy_hws(struct 
mlx5dr_action *action)
 {
        switch (action->type) {
        case MLX5DR_ACTION_TYP_TIR:
+               mlx5dr_action_destroy_stcs(action);
+               if (mlx5dr_context_shared_gvmi_used(action->ctx))
+                       mlx5dr_cmd_destroy_obj(action->alias.devx_obj);
+               break;
        case MLX5DR_ACTION_TYP_MISS:
        case MLX5DR_ACTION_TYP_TAG:
        case MLX5DR_ACTION_TYP_DROP:
diff --git a/drivers/net/mlx5/hws/mlx5dr_action.h 
b/drivers/net/mlx5/hws/mlx5dr_action.h
index 9a4827481a..17619c0057 100644
--- a/drivers/net/mlx5/hws/mlx5dr_action.h
+++ b/drivers/net/mlx5/hws/mlx5dr_action.h
@@ -138,6 +138,9 @@ struct mlx5dr_action {
                                        uint16_t vport_num;
                                        uint16_t esw_owner_vhca_id;
                                } vport;
+                               struct {
+                                       struct mlx5dr_devx_obj *devx_obj;
+                               } alias;
                        };
                };
 
diff --git a/drivers/net/mlx5/mlx5_devx.c b/drivers/net/mlx5/mlx5_devx.c
index 02deaac612..f6e1943fd7 100644
--- a/drivers/net/mlx5/mlx5_devx.c
+++ b/drivers/net/mlx5/mlx5_devx.c
@@ -913,7 +913,7 @@ mlx5_devx_hrxq_new(struct rte_eth_dev *dev, struct 
mlx5_hrxq *hrxq,
        if (hrxq->hws_flags) {
                hrxq->action = mlx5dr_action_create_dest_tir
                        (priv->dr_ctx,
-                        (struct mlx5dr_devx_obj *)hrxq->tir, hrxq->hws_flags);
+                        (struct mlx5dr_devx_obj *)hrxq->tir, hrxq->hws_flags, 
true);
                if (!hrxq->action)
                        goto error;
                return 0;
-- 
2.18.2

Reply via email to