mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 18:09:56 +00:00
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:
committed by
Saeed Mahameed
parent
1db1f21cae
commit
5d862ec631
@@ -84,7 +84,7 @@ mlx5e_tc_act_init_parse_state(struct mlx5e_tc_act_parse_state *parse_state,
|
|||||||
|
|
||||||
int
|
int
|
||||||
mlx5e_tc_act_post_parse(struct mlx5e_tc_act_parse_state *parse_state,
|
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,
|
struct mlx5_flow_attr *attr,
|
||||||
enum mlx5_flow_namespace_type ns_type)
|
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;
|
priv = parse_state->flow->priv;
|
||||||
|
|
||||||
flow_action_for_each(i, act, flow_action) {
|
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);
|
tc_act = mlx5e_tc_act_get(act->id, ns_type);
|
||||||
if (!tc_act || !tc_act->post_parse)
|
if (!tc_act || !tc_act->post_parse)
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ mlx5e_tc_act_init_parse_state(struct mlx5e_tc_act_parse_state *parse_state,
|
|||||||
|
|
||||||
int
|
int
|
||||||
mlx5e_tc_act_post_parse(struct mlx5e_tc_act_parse_state *parse_state,
|
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,
|
struct mlx5_flow_attr *attr,
|
||||||
enum mlx5_flow_namespace_type ns_type);
|
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 mlx5_flow_attr *prev_attr;
|
||||||
struct flow_action_entry *act;
|
struct flow_action_entry *act;
|
||||||
struct mlx5e_tc_act *tc_act;
|
struct mlx5e_tc_act *tc_act;
|
||||||
|
int err, i, i_split = 0;
|
||||||
bool is_missable;
|
bool is_missable;
|
||||||
int err, i;
|
|
||||||
|
|
||||||
ns_type = mlx5e_get_flow_namespace(flow);
|
ns_type = mlx5e_get_flow_namespace(flow);
|
||||||
list_add(&attr->list, &flow->attrs);
|
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)) {
|
i < flow_action->num_entries - 1)) {
|
||||||
is_missable = tc_act->is_missable ? tc_act->is_missable(act) : false;
|
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)
|
if (err)
|
||||||
goto out_free_post_acts;
|
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;
|
goto out_free_post_acts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
i_split = i + 1;
|
||||||
list_add(&attr->list, &flow->attrs);
|
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)
|
if (err)
|
||||||
goto out_free_post_acts;
|
goto out_free_post_acts;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user