net/mlx5e: Move sample attr allocation to tc_action sample parse op
There is no reason to wait with the kmalloc to after parsing all other actions. There could still be a failure later and before offloading the rule. So alloc the mem when parsing. The memory is being released on mlx5e_flow_put() which is called also on error flow. Signed-off-by: Roi Dayan <roid@nvidia.com> Reviewed-by: Oz Shlomo <ozsh@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
This commit is contained in:
Родитель
8333d53e3f
Коммит
6bcba1bded
|
@ -25,7 +25,6 @@ struct mlx5e_tc_act_parse_state {
|
|||
int ifindexes[MLX5_MAX_FLOW_FWD_VPORTS];
|
||||
int if_count;
|
||||
struct mlx5_tc_ct_priv *ct_priv;
|
||||
struct mlx5e_sample_attr sample_attr;
|
||||
};
|
||||
|
||||
struct mlx5e_tc_act {
|
||||
|
|
|
@ -27,7 +27,11 @@ tc_act_parse_sample(struct mlx5e_tc_act_parse_state *parse_state,
|
|||
struct mlx5e_priv *priv,
|
||||
struct mlx5_flow_attr *attr)
|
||||
{
|
||||
struct mlx5e_sample_attr *sample_attr = &parse_state->sample_attr;
|
||||
struct mlx5e_sample_attr *sample_attr;
|
||||
|
||||
sample_attr = kzalloc(sizeof(*attr->sample_attr), GFP_KERNEL);
|
||||
if (!sample_attr)
|
||||
return -ENOMEM;
|
||||
|
||||
sample_attr->rate = act->sample.rate;
|
||||
sample_attr->group_num = act->sample.psample_group->group_num;
|
||||
|
@ -35,6 +39,7 @@ tc_act_parse_sample(struct mlx5e_tc_act_parse_state *parse_state,
|
|||
if (act->sample.truncate)
|
||||
sample_attr->trunc_size = act->sample.trunc_size;
|
||||
|
||||
attr->sample_attr = sample_attr;
|
||||
flow_flag_set(parse_state->flow, SAMPLE);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -3425,16 +3425,6 @@ parse_tc_fdb_actions(struct mlx5e_priv *priv,
|
|||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
/* Allocate sample attribute only when there is a sample action and
|
||||
* no errors after parsing.
|
||||
*/
|
||||
if (flow_flag_test(flow, SAMPLE)) {
|
||||
attr->sample_attr = kzalloc(sizeof(*attr->sample_attr), GFP_KERNEL);
|
||||
if (!attr->sample_attr)
|
||||
return -ENOMEM;
|
||||
*attr->sample_attr = parse_state->sample_attr;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче