net/mlx5: Fix post parse infra to only parse every action once
Caller of mlx5e_tc_act_post_parse() needs it to parse only the subset of actions starting after previous split and ending at the current action. However, that range is not provided as arguments and mlx5e_tc_act_post_parse() uses generic flow_action_for_each() that iterates over all flow actions. Not only this is redundant, it also causes a bug when mlx5e_tc_act->post_parse() callback is not idempotent since it will be called for every split. For example, ct action tc_act_post_parse_ct() callback obtains a reference to mlx5_ct_ft instance and calling it several times during parsing stage will cause reference counter imbalance. Fix the issue by providing a proper action range of the current split subset to mlx5e_tc_act_post_parse() and only calling mlx5e_tc_act->post_parse() for actions inside the subset range. Fixes: 8300f225268b ("net/mlx5e: Create new flow attr for multi table actions") Signed-off-by: Vlad Buslov <vladbu@nvidia.com> Reviewed-by: Roi Dayan <roid@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
This commit is contained in:
parent
1db1f21cae
commit
5d862ec631
@ -84,7 +84,7 @@ mlx5e_tc_act_init_parse_state(struct mlx5e_tc_act_parse_state *parse_state,
|
||||
|
||||
int
|
||||
mlx5e_tc_act_post_parse(struct mlx5e_tc_act_parse_state *parse_state,
|
||||
struct flow_action *flow_action,
|
||||
struct flow_action *flow_action, int from, int to,
|
||||
struct mlx5_flow_attr *attr,
|
||||
enum mlx5_flow_namespace_type ns_type)
|
||||
{
|
||||
@ -96,6 +96,11 @@ mlx5e_tc_act_post_parse(struct mlx5e_tc_act_parse_state *parse_state,
|
||||
priv = parse_state->flow->priv;
|
||||
|
||||
flow_action_for_each(i, act, flow_action) {
|
||||
if (i < from)
|
||||
continue;
|
||||
else if (i > to)
|
||||
break;
|
||||
|
||||
tc_act = mlx5e_tc_act_get(act->id, ns_type);
|
||||
if (!tc_act || !tc_act->post_parse)
|
||||
continue;
|
||||
|
@ -112,7 +112,7 @@ mlx5e_tc_act_init_parse_state(struct mlx5e_tc_act_parse_state *parse_state,
|
||||
|
||||
int
|
||||
mlx5e_tc_act_post_parse(struct mlx5e_tc_act_parse_state *parse_state,
|
||||
struct flow_action *flow_action,
|
||||
struct flow_action *flow_action, int from, int to,
|
||||
struct mlx5_flow_attr *attr,
|
||||
enum mlx5_flow_namespace_type ns_type);
|
||||
|
||||
|
@ -3859,8 +3859,8 @@ parse_tc_actions(struct mlx5e_tc_act_parse_state *parse_state,
|
||||
struct mlx5_flow_attr *prev_attr;
|
||||
struct flow_action_entry *act;
|
||||
struct mlx5e_tc_act *tc_act;
|
||||
int err, i, i_split = 0;
|
||||
bool is_missable;
|
||||
int err, i;
|
||||
|
||||
ns_type = mlx5e_get_flow_namespace(flow);
|
||||
list_add(&attr->list, &flow->attrs);
|
||||
@ -3901,7 +3901,8 @@ parse_tc_actions(struct mlx5e_tc_act_parse_state *parse_state,
|
||||
i < flow_action->num_entries - 1)) {
|
||||
is_missable = tc_act->is_missable ? tc_act->is_missable(act) : false;
|
||||
|
||||
err = mlx5e_tc_act_post_parse(parse_state, flow_action, attr, ns_type);
|
||||
err = mlx5e_tc_act_post_parse(parse_state, flow_action, i_split, i, attr,
|
||||
ns_type);
|
||||
if (err)
|
||||
goto out_free_post_acts;
|
||||
|
||||
@ -3911,6 +3912,7 @@ parse_tc_actions(struct mlx5e_tc_act_parse_state *parse_state,
|
||||
goto out_free_post_acts;
|
||||
}
|
||||
|
||||
i_split = i + 1;
|
||||
list_add(&attr->list, &flow->attrs);
|
||||
}
|
||||
|
||||
@ -3925,7 +3927,7 @@ parse_tc_actions(struct mlx5e_tc_act_parse_state *parse_state,
|
||||
}
|
||||
}
|
||||
|
||||
err = mlx5e_tc_act_post_parse(parse_state, flow_action, attr, ns_type);
|
||||
err = mlx5e_tc_act_post_parse(parse_state, flow_action, i_split, i, attr, ns_type);
|
||||
if (err)
|
||||
goto out_free_post_acts;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user