Skip to content

Commit

Permalink
net/mlx5: Avoid cleaning flow steering table twice during error flow
Browse files Browse the repository at this point in the history
[ Upstream commit 9c26f5f ]

When we fail to initialize the RX root namespace, we need
to clean only that and not the entire flow steering.

Currently the code may try to clean the flow steering twice
on error witch leads to null pointer deference.
Make sure we clean correctly.

Fixes: fba53f7 ("net/mlx5: Introduce mlx5_flow_steering structure")
Signed-off-by: Talat Batheesh <[email protected]>
Reviewed-by: Mark Bloch <[email protected]>
Signed-off-by: Saeed Mahameed <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
talatb authored and gregkh committed May 19, 2018
1 parent eac1ab6 commit 6ecec17
Showing 1 changed file with 14 additions and 9 deletions.
23 changes: 14 additions & 9 deletions drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ static void del_flow_group(struct fs_node *node);
static void del_fte(struct fs_node *node);
static bool mlx5_flow_dests_cmp(struct mlx5_flow_destination *d1,
struct mlx5_flow_destination *d2);
static void cleanup_root_ns(struct mlx5_flow_root_namespace *root_ns);
static struct mlx5_flow_rule *
find_flow_rule(struct fs_fte *fte,
struct mlx5_flow_destination *dest);
Expand Down Expand Up @@ -2041,23 +2042,27 @@ static int create_anchor_flow_table(struct mlx5_flow_steering *steering)

static int init_root_ns(struct mlx5_flow_steering *steering)
{
int err;

steering->root_ns = create_root_ns(steering, FS_FT_NIC_RX);
if (!steering->root_ns)
goto cleanup;
return -ENOMEM;

if (init_root_tree(steering, &root_fs, &steering->root_ns->ns.node))
goto cleanup;
err = init_root_tree(steering, &root_fs, &steering->root_ns->ns.node);
if (err)
goto out_err;

set_prio_attrs(steering->root_ns);

if (create_anchor_flow_table(steering))
goto cleanup;
err = create_anchor_flow_table(steering);
if (err)
goto out_err;

return 0;

cleanup:
mlx5_cleanup_fs(steering->dev);
return -ENOMEM;
out_err:
cleanup_root_ns(steering->root_ns);
steering->root_ns = NULL;
return err;
}

static void clean_tree(struct fs_node *node)
Expand Down

0 comments on commit 6ecec17

Please sign in to comment.