net/mlx5: E-Switch, Use dynamic alloc for dest array
authorMaor Dickman <maord@nvidia.com>
Mon, 20 Sep 2021 07:51:05 +0000 (10:51 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Tue, 19 Oct 2021 03:18:10 +0000 (20:18 -0700)
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>
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

index 3e5a7d74020bb6f314e194fdaffdb81d515aa78f..0ef126fd6a8ef51f9edb90d2f2f3eb6de6c83fa8 100644 (file)
@@ -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;
 }