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: 8300f22526
("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:
Родитель
1db1f21cae
Коммит
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;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче