Message ID | 20250107060708.1610882-5-tariqt@nvidia.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | mlx5 HW-Managed Flow Steering in FS core level | expand |
On 1/7/25 07:06, Tariq Toukan wrote: > From: Moshe Shemesh <moshe@nvidia.com> > > The HW Steering actions pool will help utilize the option in HW Steering > to share steering actions among different rules. > > Create pool on root namespace creation and add few HW Steering actions > that don't depend on the steering rule itself and thus can be shared > between rules, created on same namespace: tag, pop_vlan, push_vlan, > drop, decap l2. > > Signed-off-by: Moshe Shemesh <moshe@nvidia.com> > Reviewed-by: Yevgeny Kliteynik <kliteyn@nvidia.com> > Reviewed-by: Mark Bloch <mbloch@nvidia.com> > Signed-off-by: Tariq Toukan <tariqt@nvidia.com> > --- > .../mellanox/mlx5/core/steering/hws/fs_hws.c | 58 +++++++++++++++++++ > .../mellanox/mlx5/core/steering/hws/fs_hws.h | 9 +++ > 2 files changed, 67 insertions(+) > > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.c > index c8064bc8a86c..eeaf4a84aafc 100644 > --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.c > +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.c > @@ -9,9 +9,60 @@ > #define MLX5HWS_CTX_MAX_NUM_OF_QUEUES 16 > #define MLX5HWS_CTX_QUEUE_SIZE 256 > > +static int init_hws_actions_pool(struct mlx5_fs_hws_context *fs_ctx) > +{ > + u32 flags = MLX5HWS_ACTION_FLAG_HWS_FDB | MLX5HWS_ACTION_FLAG_SHARED; > + struct mlx5_fs_hws_actions_pool *hws_pool = &fs_ctx->hws_pool; > + struct mlx5hws_action_reformat_header reformat_hdr = {}; > + struct mlx5hws_context *ctx = fs_ctx->hws_ctx; > + enum mlx5hws_action_type action_type; > + > + hws_pool->tag_action = mlx5hws_action_create_tag(ctx, flags); > + if (!hws_pool->tag_action) > + return -ENOMEM; > + hws_pool->pop_vlan_action = mlx5hws_action_create_pop_vlan(ctx, flags); > + if (!hws_pool->pop_vlan_action) > + goto destroy_tag; > + hws_pool->push_vlan_action = mlx5hws_action_create_push_vlan(ctx, flags); > + if (!hws_pool->push_vlan_action) > + goto destroy_pop_vlan; > + hws_pool->drop_action = mlx5hws_action_create_dest_drop(ctx, flags); > + if (!hws_pool->drop_action) > + goto destroy_push_vlan; > + action_type = MLX5HWS_ACTION_TYP_REFORMAT_TNL_L2_TO_L2; > + hws_pool->decapl2_action = > + mlx5hws_action_create_reformat(ctx, action_type, 1, > + &reformat_hdr, 0, flags); > + if (!hws_pool->decapl2_action) > + goto destroy_drop; > + return 0; > + > +destroy_drop: > + mlx5hws_action_destroy(hws_pool->drop_action); > +destroy_push_vlan: > + mlx5hws_action_destroy(hws_pool->push_vlan_action); > +destroy_pop_vlan: > + mlx5hws_action_destroy(hws_pool->pop_vlan_action); > +destroy_tag: > + mlx5hws_action_destroy(hws_pool->tag_action); > + return -ENOMEM; I would expect to get -ENOMEM only on k*alloc() family failures, but your set of helpers does much more than just attempt to allocate memory. -ENOSPC?
On 1/7/2025 1:36 PM, Przemek Kitszel wrote: > > On 1/7/25 07:06, Tariq Toukan wrote: >> From: Moshe Shemesh <moshe@nvidia.com> >> >> The HW Steering actions pool will help utilize the option in HW Steering >> to share steering actions among different rules. >> >> Create pool on root namespace creation and add few HW Steering actions >> that don't depend on the steering rule itself and thus can be shared >> between rules, created on same namespace: tag, pop_vlan, push_vlan, >> drop, decap l2. >> >> Signed-off-by: Moshe Shemesh <moshe@nvidia.com> >> Reviewed-by: Yevgeny Kliteynik <kliteyn@nvidia.com> >> Reviewed-by: Mark Bloch <mbloch@nvidia.com> >> Signed-off-by: Tariq Toukan <tariqt@nvidia.com> >> --- >> .../mellanox/mlx5/core/steering/hws/fs_hws.c | 58 +++++++++++++++++++ >> .../mellanox/mlx5/core/steering/hws/fs_hws.h | 9 +++ >> 2 files changed, 67 insertions(+) >> >> diff --git >> a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.c >> b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.c >> index c8064bc8a86c..eeaf4a84aafc 100644 >> --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.c >> +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.c >> @@ -9,9 +9,60 @@ >> #define MLX5HWS_CTX_MAX_NUM_OF_QUEUES 16 >> #define MLX5HWS_CTX_QUEUE_SIZE 256 >> >> +static int init_hws_actions_pool(struct mlx5_fs_hws_context *fs_ctx) >> +{ >> + u32 flags = MLX5HWS_ACTION_FLAG_HWS_FDB | >> MLX5HWS_ACTION_FLAG_SHARED; >> + struct mlx5_fs_hws_actions_pool *hws_pool = &fs_ctx->hws_pool; >> + struct mlx5hws_action_reformat_header reformat_hdr = {}; >> + struct mlx5hws_context *ctx = fs_ctx->hws_ctx; >> + enum mlx5hws_action_type action_type; >> + >> + hws_pool->tag_action = mlx5hws_action_create_tag(ctx, flags); >> + if (!hws_pool->tag_action) >> + return -ENOMEM; >> + hws_pool->pop_vlan_action = mlx5hws_action_create_pop_vlan(ctx, >> flags); >> + if (!hws_pool->pop_vlan_action) >> + goto destroy_tag; >> + hws_pool->push_vlan_action = >> mlx5hws_action_create_push_vlan(ctx, flags); >> + if (!hws_pool->push_vlan_action) >> + goto destroy_pop_vlan; >> + hws_pool->drop_action = mlx5hws_action_create_dest_drop(ctx, >> flags); >> + if (!hws_pool->drop_action) >> + goto destroy_push_vlan; >> + action_type = MLX5HWS_ACTION_TYP_REFORMAT_TNL_L2_TO_L2; >> + hws_pool->decapl2_action = >> + mlx5hws_action_create_reformat(ctx, action_type, 1, >> + &reformat_hdr, 0, flags); >> + if (!hws_pool->decapl2_action) >> + goto destroy_drop; >> + return 0; >> + >> +destroy_drop: >> + mlx5hws_action_destroy(hws_pool->drop_action); >> +destroy_push_vlan: >> + mlx5hws_action_destroy(hws_pool->push_vlan_action); >> +destroy_pop_vlan: >> + mlx5hws_action_destroy(hws_pool->pop_vlan_action); >> +destroy_tag: >> + mlx5hws_action_destroy(hws_pool->tag_action); >> + return -ENOMEM; > > I would expect to get -ENOMEM only on k*alloc() family failures, but > your set of helpers does much more than just attempt to allocate memory. > -ENOSPC? OK
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.c index c8064bc8a86c..eeaf4a84aafc 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.c @@ -9,9 +9,60 @@ #define MLX5HWS_CTX_MAX_NUM_OF_QUEUES 16 #define MLX5HWS_CTX_QUEUE_SIZE 256 +static int init_hws_actions_pool(struct mlx5_fs_hws_context *fs_ctx) +{ + u32 flags = MLX5HWS_ACTION_FLAG_HWS_FDB | MLX5HWS_ACTION_FLAG_SHARED; + struct mlx5_fs_hws_actions_pool *hws_pool = &fs_ctx->hws_pool; + struct mlx5hws_action_reformat_header reformat_hdr = {}; + struct mlx5hws_context *ctx = fs_ctx->hws_ctx; + enum mlx5hws_action_type action_type; + + hws_pool->tag_action = mlx5hws_action_create_tag(ctx, flags); + if (!hws_pool->tag_action) + return -ENOMEM; + hws_pool->pop_vlan_action = mlx5hws_action_create_pop_vlan(ctx, flags); + if (!hws_pool->pop_vlan_action) + goto destroy_tag; + hws_pool->push_vlan_action = mlx5hws_action_create_push_vlan(ctx, flags); + if (!hws_pool->push_vlan_action) + goto destroy_pop_vlan; + hws_pool->drop_action = mlx5hws_action_create_dest_drop(ctx, flags); + if (!hws_pool->drop_action) + goto destroy_push_vlan; + action_type = MLX5HWS_ACTION_TYP_REFORMAT_TNL_L2_TO_L2; + hws_pool->decapl2_action = + mlx5hws_action_create_reformat(ctx, action_type, 1, + &reformat_hdr, 0, flags); + if (!hws_pool->decapl2_action) + goto destroy_drop; + return 0; + +destroy_drop: + mlx5hws_action_destroy(hws_pool->drop_action); +destroy_push_vlan: + mlx5hws_action_destroy(hws_pool->push_vlan_action); +destroy_pop_vlan: + mlx5hws_action_destroy(hws_pool->pop_vlan_action); +destroy_tag: + mlx5hws_action_destroy(hws_pool->tag_action); + return -ENOMEM; +} + +static void cleanup_hws_actions_pool(struct mlx5_fs_hws_context *fs_ctx) +{ + struct mlx5_fs_hws_actions_pool *hws_pool = &fs_ctx->hws_pool; + + mlx5hws_action_destroy(hws_pool->decapl2_action); + mlx5hws_action_destroy(hws_pool->drop_action); + mlx5hws_action_destroy(hws_pool->push_vlan_action); + mlx5hws_action_destroy(hws_pool->pop_vlan_action); + mlx5hws_action_destroy(hws_pool->tag_action); +} + static int mlx5_cmd_hws_create_ns(struct mlx5_flow_root_namespace *ns) { struct mlx5hws_context_attr hws_ctx_attr = {}; + int err; hws_ctx_attr.queues = min_t(int, num_online_cpus(), MLX5HWS_CTX_MAX_NUM_OF_QUEUES); @@ -23,11 +74,18 @@ static int mlx5_cmd_hws_create_ns(struct mlx5_flow_root_namespace *ns) mlx5_core_err(ns->dev, "Failed to create hws flow namespace\n"); return -EOPNOTSUPP; } + err = init_hws_actions_pool(&ns->fs_hws_context); + if (err) { + mlx5_core_err(ns->dev, "Failed to init hws actions pool\n"); + mlx5hws_context_close(ns->fs_hws_context.hws_ctx); + return err; + } return 0; } static int mlx5_cmd_hws_destroy_ns(struct mlx5_flow_root_namespace *ns) { + cleanup_hws_actions_pool(&ns->fs_hws_context); return mlx5hws_context_close(ns->fs_hws_context.hws_ctx); } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.h b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.h index da8094c66cd5..256be4234d92 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.h @@ -6,8 +6,17 @@ #include "mlx5hws.h" +struct mlx5_fs_hws_actions_pool { + struct mlx5hws_action *tag_action; + struct mlx5hws_action *pop_vlan_action; + struct mlx5hws_action *push_vlan_action; + struct mlx5hws_action *drop_action; + struct mlx5hws_action *decapl2_action; +}; + struct mlx5_fs_hws_context { struct mlx5hws_context *hws_ctx; + struct mlx5_fs_hws_actions_pool hws_pool; }; struct mlx5_fs_hws_table {