error_hrxq_new:
        err = rte_errno;
        __flow_dv_action_rss_hrxqs_release(dev, shared_rss);
-       if (!mlx5_ind_table_obj_release(dev, shared_rss->ind_tbl, true))
+       if (!mlx5_ind_table_obj_release(dev, shared_rss->ind_tbl, true, true))
                shared_rss->ind_tbl = NULL;
        rte_errno = err;
        return -rte_errno;
                                          NULL,
                                          "shared rss hrxq has references");
        queue = shared_rss->ind_tbl->queues;
-       remaining = mlx5_ind_table_obj_release(dev, shared_rss->ind_tbl, true);
+       remaining = mlx5_ind_table_obj_release(dev, shared_rss->ind_tbl, true,
+                                              !!dev->data->dev_started);
        if (remaining)
                return rte_flow_error_set(error, EBUSY,
                                          RTE_FLOW_ERROR_TYPE_ACTION,
 
  *   Indirection table to release.
  * @param standalone
  *   Indirection table for Standalone queue.
+ * @param deref_rxqs
+ *   If true, then dereference RX queues related to indirection table.
+ *   Otherwise, no additional action will be taken.
  *
  * @return
  *   1 while a reference on it exists, 0 when freed.
 int
 mlx5_ind_table_obj_release(struct rte_eth_dev *dev,
                           struct mlx5_ind_table_obj *ind_tbl,
-                          bool standalone)
+                          bool standalone,
+                          bool deref_rxqs)
 {
        struct mlx5_priv *priv = dev->data->dev_private;
        unsigned int i, ret;
        if (ret)
                return 1;
        priv->obj_ops.ind_table_destroy(ind_tbl);
-       for (i = 0; i != ind_tbl->queues_n; ++i)
-               claim_nonzero(mlx5_rxq_deref(dev, ind_tbl->queues[i]));
+       if (deref_rxqs) {
+               for (i = 0; i != ind_tbl->queues_n; ++i)
+                       claim_nonzero(mlx5_rxq_deref(dev, ind_tbl->queues[i]));
+       }
        mlx5_free(ind_tbl);
        return 0;
 }
        if (ind_tbl != hrxq->ind_table) {
                MLX5_ASSERT(!hrxq->standalone);
                mlx5_ind_table_obj_release(dev, hrxq->ind_table,
-                                          hrxq->standalone);
+                                          hrxq->standalone, true);
                hrxq->ind_table = ind_tbl;
        }
        hrxq->hash_fields = hash_fields;
        err = rte_errno;
        if (ind_tbl != hrxq->ind_table) {
                MLX5_ASSERT(!hrxq->standalone);
-               mlx5_ind_table_obj_release(dev, ind_tbl, hrxq->standalone);
+               mlx5_ind_table_obj_release(dev, ind_tbl, hrxq->standalone,
+                                          true);
        }
        rte_errno = err;
        return -rte_errno;
        priv->obj_ops.hrxq_destroy(hrxq);
        if (!hrxq->standalone) {
                mlx5_ind_table_obj_release(dev, hrxq->ind_table,
-                                          hrxq->standalone);
+                                          hrxq->standalone, true);
        }
        mlx5_ipool_free(priv->sh->ipool[MLX5_IPOOL_HRXQ], hrxq->idx);
 }
        return hrxq;
 error:
        if (!rss_desc->ind_tbl)
-               mlx5_ind_table_obj_release(dev, ind_tbl, standalone);
+               mlx5_ind_table_obj_release(dev, ind_tbl, standalone, true);
        if (hrxq)
                mlx5_ipool_free(priv->sh->ipool[MLX5_IPOOL_HRXQ], hrxq_idx);
        return NULL;