[PATCH V1 10/11] net/mlx5/hws: support actions while shared resources is used
Erez Shitrit
erezsh at nvidia.com
Sun Dec 18 16:08:51 CET 2022
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 <erezsh at nvidia.com>
Reviewed-by: Alex Vesker <valex at 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
More information about the dev
mailing list