From: Yevgeny Kliteynik <klit...@nvidia.com> Split the root rule creation/destruction into two stages: - do the job (create/destroy rule) - generate completion
Completion generation is required for the usual HWS API. The create/destroy functions that don't generate completion are exposed in header file and will be used by the coming backward-compatible API. Signed-off-by: Yevgeny Kliteynik <klit...@nvidia.com> --- drivers/net/mlx5/hws/mlx5dr_rule.c | 49 +++++++++++++++++++++--------- drivers/net/mlx5/hws/mlx5dr_rule.h | 7 +++++ 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/drivers/net/mlx5/hws/mlx5dr_rule.c b/drivers/net/mlx5/hws/mlx5dr_rule.c index 171a0bff38..550f00a4c1 100644 --- a/drivers/net/mlx5/hws/mlx5dr_rule.c +++ b/drivers/net/mlx5/hws/mlx5dr_rule.c @@ -680,15 +680,12 @@ static int mlx5dr_rule_destroy_hws(struct mlx5dr_rule *rule, return 0; } -static int mlx5dr_rule_create_root(struct mlx5dr_rule *rule, - struct mlx5dr_rule_attr *rule_attr, - const struct rte_flow_item items[], - uint8_t at_idx, - struct mlx5dr_rule_action rule_actions[]) +int mlx5dr_rule_create_root_no_comp(struct mlx5dr_rule *rule, + const struct rte_flow_item items[], + uint8_t num_actions, + struct mlx5dr_rule_action rule_actions[]) { struct mlx5dv_flow_matcher *dv_matcher = rule->matcher->dv_matcher; - uint8_t num_actions = rule->matcher->at[at_idx].num_actions; - struct mlx5dr_context *ctx = rule->matcher->tbl->ctx; struct mlx5dv_flow_match_parameters *value; struct mlx5_flow_attr flow_attr = {0}; struct mlx5dv_flow_action_attr *attr; @@ -750,9 +747,6 @@ static int mlx5dr_rule_create_root(struct mlx5dr_rule *rule, num_actions, attr); - mlx5dr_rule_gen_comp(&ctx->send_queue[rule_attr->queue_id], rule, !rule->flow, - rule_attr->user_data, MLX5DR_RULE_STATUS_CREATED); - simple_free(value); simple_free(attr); @@ -766,14 +760,41 @@ static int mlx5dr_rule_create_root(struct mlx5dr_rule *rule, return rte_errno; } +static int mlx5dr_rule_create_root(struct mlx5dr_rule *rule, + struct mlx5dr_rule_attr *rule_attr, + const struct rte_flow_item items[], + uint8_t num_actions, + struct mlx5dr_rule_action rule_actions[]) +{ + struct mlx5dr_context *ctx = rule->matcher->tbl->ctx; + int ret; + + ret = mlx5dr_rule_create_root_no_comp(rule, items, + num_actions, rule_actions); + if (ret) + return rte_errno; + + mlx5dr_rule_gen_comp(&ctx->send_queue[rule_attr->queue_id], rule, !rule->flow, + rule_attr->user_data, MLX5DR_RULE_STATUS_CREATED); + + return 0; +} + +int mlx5dr_rule_destroy_root_no_comp(struct mlx5dr_rule *rule) +{ + if (rule->flow) + return ibv_destroy_flow(rule->flow); + + return 0; +} + static int mlx5dr_rule_destroy_root(struct mlx5dr_rule *rule, struct mlx5dr_rule_attr *attr) { struct mlx5dr_context *ctx = rule->matcher->tbl->ctx; - int err = 0; + int err; - if (rule->flow) - err = ibv_destroy_flow(rule->flow); + err = mlx5dr_rule_destroy_root_no_comp(rule); mlx5dr_rule_gen_comp(&ctx->send_queue[attr->queue_id], rule, err, attr->user_data, MLX5DR_RULE_STATUS_DELETED); @@ -970,7 +991,7 @@ int mlx5dr_rule_create(struct mlx5dr_matcher *matcher, ret = mlx5dr_rule_create_root(rule_handle, attr, items, - at_idx, + matcher->at[at_idx].num_actions, rule_actions); else ret = mlx5dr_rule_create_hws(rule_handle, diff --git a/drivers/net/mlx5/hws/mlx5dr_rule.h b/drivers/net/mlx5/hws/mlx5dr_rule.h index dffaec1c0f..bc542eb543 100644 --- a/drivers/net/mlx5/hws/mlx5dr_rule.h +++ b/drivers/net/mlx5/hws/mlx5dr_rule.h @@ -74,4 +74,11 @@ int mlx5dr_rule_move_hws_add(struct mlx5dr_rule *rule, bool mlx5dr_rule_move_in_progress(struct mlx5dr_rule *rule); +int mlx5dr_rule_create_root_no_comp(struct mlx5dr_rule *rule, + const struct rte_flow_item items[], + uint8_t num_actions, + struct mlx5dr_rule_action rule_actions[]); + +int mlx5dr_rule_destroy_root_no_comp(struct mlx5dr_rule *rule); + #endif /* MLX5DR_RULE_H_ */ -- 2.25.1