net/mlx5: E-Switch, Use dynamic alloc for dest array
Use dynamic allocation for the dest array in preparation for the next patch which increase MLX5_MAX_FLOW_FWD_VPORTS and will cause stack allocation to be bigger than 1024 bytes. Signed-off-by: Maor Dickman <maord@nvidia.com> Reviewed-by: Roi Dayan <roid@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
This commit is contained in:
parent
da6b0bb0fc
commit
408881627f
@ -482,12 +482,12 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
|
||||
struct mlx5_flow_spec *spec,
|
||||
struct mlx5_flow_attr *attr)
|
||||
{
|
||||
struct mlx5_flow_destination dest[MLX5_MAX_FLOW_FWD_VPORTS + 1] = {};
|
||||
struct mlx5_flow_act flow_act = { .flags = FLOW_ACT_NO_APPEND, };
|
||||
struct mlx5_esw_flow_attr *esw_attr = attr->esw_attr;
|
||||
struct mlx5_fs_chains *chains = esw_chains(esw);
|
||||
bool split = !!(esw_attr->split_count);
|
||||
struct mlx5_vport_tbl_attr fwd_attr;
|
||||
struct mlx5_flow_destination *dest;
|
||||
struct mlx5_flow_handle *rule;
|
||||
struct mlx5_flow_table *fdb;
|
||||
int i = 0;
|
||||
@ -495,6 +495,10 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
|
||||
if (esw->mode != MLX5_ESWITCH_OFFLOADS)
|
||||
return ERR_PTR(-EOPNOTSUPP);
|
||||
|
||||
dest = kcalloc(MLX5_MAX_FLOW_FWD_VPORTS + 1, sizeof(*dest), GFP_KERNEL);
|
||||
if (!dest)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
flow_act.action = attr->action;
|
||||
/* if per flow vlan pop/push is emulated, don't set that into the firmware */
|
||||
if (!mlx5_eswitch_vlan_actions_supported(esw->dev, 1))
|
||||
@ -574,6 +578,7 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
|
||||
else
|
||||
atomic64_inc(&esw->offloads.num_flows);
|
||||
|
||||
kfree(dest);
|
||||
return rule;
|
||||
|
||||
err_add_rule:
|
||||
@ -584,6 +589,7 @@ err_add_rule:
|
||||
err_esw_get:
|
||||
esw_cleanup_dests(esw, attr);
|
||||
err_create_goto_table:
|
||||
kfree(dest);
|
||||
return rule;
|
||||
}
|
||||
|
||||
@ -592,16 +598,20 @@ mlx5_eswitch_add_fwd_rule(struct mlx5_eswitch *esw,
|
||||
struct mlx5_flow_spec *spec,
|
||||
struct mlx5_flow_attr *attr)
|
||||
{
|
||||
struct mlx5_flow_destination dest[MLX5_MAX_FLOW_FWD_VPORTS + 1] = {};
|
||||
struct mlx5_flow_act flow_act = { .flags = FLOW_ACT_NO_APPEND, };
|
||||
struct mlx5_esw_flow_attr *esw_attr = attr->esw_attr;
|
||||
struct mlx5_fs_chains *chains = esw_chains(esw);
|
||||
struct mlx5_vport_tbl_attr fwd_attr;
|
||||
struct mlx5_flow_destination *dest;
|
||||
struct mlx5_flow_table *fast_fdb;
|
||||
struct mlx5_flow_table *fwd_fdb;
|
||||
struct mlx5_flow_handle *rule;
|
||||
int i, err = 0;
|
||||
|
||||
dest = kcalloc(MLX5_MAX_FLOW_FWD_VPORTS + 1, sizeof(*dest), GFP_KERNEL);
|
||||
if (!dest)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
fast_fdb = mlx5_chains_get_table(chains, attr->chain, attr->prio, 0);
|
||||
if (IS_ERR(fast_fdb)) {
|
||||
rule = ERR_CAST(fast_fdb);
|
||||
@ -654,6 +664,7 @@ mlx5_eswitch_add_fwd_rule(struct mlx5_eswitch *esw,
|
||||
|
||||
atomic64_inc(&esw->offloads.num_flows);
|
||||
|
||||
kfree(dest);
|
||||
return rule;
|
||||
err_chain_src_rewrite:
|
||||
esw_put_dest_tables_loop(esw, attr, 0, i);
|
||||
@ -661,6 +672,7 @@ err_chain_src_rewrite:
|
||||
err_get_fwd:
|
||||
mlx5_chains_put_table(chains, attr->chain, attr->prio, 0);
|
||||
err_get_fast:
|
||||
kfree(dest);
|
||||
return rule;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user