{
struct mlx5_dev_ctx_shared *sh = priv->sh;
char s[MLX5_HLIST_NAMESIZE];
- int err = 0;
+ int err;
- if (!sh->flow_tbls)
- err = mlx5_alloc_table_hash_list(priv);
- else
- DRV_LOG(DEBUG, "sh->flow_tbls[%p] already created, reuse\n",
- (void *)sh->flow_tbls);
+ MLX5_ASSERT(sh && sh->refcnt);
+ if (sh->refcnt > 1)
+ return 0;
+ err = mlx5_alloc_table_hash_list(priv);
if (err)
return err;
/* Create tags hash list table. */
#ifdef HAVE_MLX5DV_DR
void *domain;
- if (sh->dv_refcnt) {
- /* Shared DV/DR structures is already initialized. */
- sh->dv_refcnt++;
- priv->dr_shared = 1;
- return 0;
- }
/* Reference counter is zero, we should initialize structures. */
domain = mlx5_glue->dr_create_domain(sh->ctx,
MLX5DV_DR_DOMAIN_TYPE_NIC_RX);
}
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. */
void
mlx5_os_free_shared_dr(struct mlx5_priv *priv)
{
- struct mlx5_dev_ctx_shared *sh;
+ struct mlx5_dev_ctx_shared *sh = priv->sh;
- if (!priv->dr_shared)
+ MLX5_ASSERT(sh && sh->refcnt);
+ if (sh->refcnt > 1)
return;
- priv->dr_shared = 0;
- sh = priv->sh;
- MLX5_ASSERT(sh);
#ifdef HAVE_MLX5DV_DR
- MLX5_ASSERT(sh->dv_refcnt);
- if (sh->dv_refcnt && --sh->dv_refcnt)
- return;
if (sh->rx_domain) {
mlx5_glue->dr_destroy_domain(sh->rx_domain);
sh->rx_domain = NULL;