net/mlx5: support shared Rx queue
[dpdk.git] / drivers / net / mlx5 / linux / mlx5_verbs.c
index 5d4ae3e..9d29954 100644 (file)
@@ -424,14 +424,16 @@ mlx5_rxq_ibv_obj_release(struct mlx5_rxq_priv *rxq)
 {
        struct mlx5_rxq_obj *rxq_obj = rxq->ctrl->obj;
 
-       MLX5_ASSERT(rxq_obj);
-       MLX5_ASSERT(rxq_obj->wq);
-       MLX5_ASSERT(rxq_obj->ibv_cq);
+       if (rxq_obj == NULL || rxq_obj->wq == NULL)
+               return;
        claim_zero(mlx5_glue->destroy_wq(rxq_obj->wq));
+       rxq_obj->wq = NULL;
+       MLX5_ASSERT(rxq_obj->ibv_cq);
        claim_zero(mlx5_glue->destroy_cq(rxq_obj->ibv_cq));
        if (rxq_obj->ibv_channel)
                claim_zero(mlx5_glue->destroy_comp_channel
                                                        (rxq_obj->ibv_channel));
+       rxq->ctrl->started = false;
 }
 
 /**
@@ -486,11 +488,10 @@ mlx5_ibv_ind_table_new(struct rte_eth_dev *dev, const unsigned int log_n,
 
        MLX5_ASSERT(ind_tbl);
        for (i = 0; i != ind_tbl->queues_n; ++i) {
-               struct mlx5_rxq_data *rxq = (*priv->rxqs)[ind_tbl->queues[i]];
-               struct mlx5_rxq_ctrl *rxq_ctrl =
-                               container_of(rxq, struct mlx5_rxq_ctrl, rxq);
+               struct mlx5_rxq_priv *rxq = mlx5_rxq_get(dev,
+                                                        ind_tbl->queues[i]);
 
-               wq[i] = rxq_ctrl->obj->wq;
+               wq[i] = rxq->ctrl->obj->wq;
        }
        MLX5_ASSERT(i > 0);
        /* Finalise indirection table. */