Skip to content

Commit

Permalink
net/mlx5: fix flow tag hash list conversion
Browse files Browse the repository at this point in the history
When DR is not supported and DV is supported, tag action still can be
used by the metadata feature.

Wrongly, the tag hash list was not created what caused failure in
metadata action creation.

Create the tag hash list for each DV case.

Fixes: 860897d ("net/mlx5: reorganize flow tables with hash list")

Signed-off-by: Matan Azrad <[email protected]>
  • Loading branch information
Matan Azrad authored and Ferruh Yigit committed Nov 26, 2019
1 parent 2286291 commit 1ef4cde
Showing 1 changed file with 23 additions and 18 deletions.
41 changes: 23 additions & 18 deletions drivers/net/mlx5/mlx5.c
Original file line number Diff line number Diff line change
Expand Up @@ -866,13 +866,21 @@ mlx5_alloc_table_hash_list(struct mlx5_priv *priv)
static int
mlx5_alloc_shared_dr(struct mlx5_priv *priv)
{
struct mlx5_ibv_shared *sh = priv->sh;
char s[MLX5_HLIST_NAMESIZE];
int err = mlx5_alloc_table_hash_list(priv);

if (err)
return err;
/* Create tags hash list table. */
snprintf(s, sizeof(s), "%s_tags", sh->ibdev_name);
sh->tag_table = mlx5_hlist_create(s, MLX5_TAGS_HLIST_ARRAY_SIZE);
if (!sh->tag_table) {
DRV_LOG(ERR, "tags with hash creation failed.\n");
err = ENOMEM;
goto error;
}
#ifdef HAVE_MLX5DV_DR
struct mlx5_ibv_shared *sh = priv->sh;
char s[MLX5_HLIST_NAMESIZE];
void *domain;

if (sh->dv_refcnt) {
Expand Down Expand Up @@ -912,20 +920,13 @@ mlx5_alloc_shared_dr(struct mlx5_priv *priv)
sh->esw_drop_action = mlx5_glue->dr_create_flow_action_drop();
}
#endif
/* create tags hash list table. */
snprintf(s, sizeof(s), "%s_tags", priv->sh->ibdev_name);
sh->tag_table = mlx5_hlist_create(s, MLX5_TAGS_HLIST_ARRAY_SIZE);
if (!sh->flow_tbls) {
DRV_LOG(ERR, "tags with hash creation failed.\n");
goto error;
}
sh->pop_vlan_action = mlx5_glue->dr_create_flow_action_pop_vlan();
#endif /* HAVE_MLX5DV_DR */
sh->dv_refcnt++;
priv->dr_shared = 1;
return 0;

error:
/* Rollback the created objects. */
/* Rollback the created objects. */
if (sh->rx_domain) {
mlx5_glue->dr_destroy_domain(sh->rx_domain);
sh->rx_domain = NULL;
Expand All @@ -946,8 +947,12 @@ mlx5_alloc_shared_dr(struct mlx5_priv *priv)
mlx5_glue->destroy_flow_action(sh->pop_vlan_action);
sh->pop_vlan_action = NULL;
}
if (sh->tag_table) {
/* tags should be destroyed with flow before. */
mlx5_hlist_destroy(sh->tag_table, NULL, NULL);
sh->tag_table = NULL;
}
mlx5_free_table_hash_list(priv);
#endif
return err;
}

Expand All @@ -960,14 +965,14 @@ mlx5_alloc_shared_dr(struct mlx5_priv *priv)
static void
mlx5_free_shared_dr(struct mlx5_priv *priv)
{
#ifdef HAVE_MLX5DV_DR
struct mlx5_ibv_shared *sh;

if (!priv->dr_shared)
return;
priv->dr_shared = 0;
sh = priv->sh;
assert(sh);
#ifdef HAVE_MLX5DV_DR
assert(sh->dv_refcnt);
if (sh->dv_refcnt && --sh->dv_refcnt)
return;
Expand All @@ -989,17 +994,17 @@ mlx5_free_shared_dr(struct mlx5_priv *priv)
sh->esw_drop_action = NULL;
}
#endif
if (sh->tag_table) {
/* tags should be destroyed with flow before. */
mlx5_hlist_destroy(sh->tag_table, NULL, NULL);
sh->tag_table = NULL;
}
if (sh->pop_vlan_action) {
mlx5_glue->destroy_flow_action(sh->pop_vlan_action);
sh->pop_vlan_action = NULL;
}
pthread_mutex_destroy(&sh->dv_mutex);
#endif /* HAVE_MLX5DV_DR */
if (sh->tag_table) {
/* tags should be destroyed with flow before. */
mlx5_hlist_destroy(sh->tag_table, NULL, NULL);
sh->tag_table = NULL;
}
mlx5_free_table_hash_list(priv);
}

Expand Down

0 comments on commit 1ef4cde

Please sign in to comment.