@@ -299,7 +299,8 @@ static inline struct ib_qp *_ib_create_qp(struct ib_device *dev,
* see mlx5 create_dev_resources() as an example.
*/
rdma_rt_set_type(&qp->res, RDMA_RESTRACK_QP);
- if (attr->qp_type < IB_QPT_XRC_INI) {
+ if (attr->qp_type != IB_QPT_XRC_INI &&
+ attr->qp_type != IB_QPT_XRC_TGT) {
if (uobj)
rdma_restrack_uadd(&qp->res);
else
@@ -193,9 +193,12 @@ struct ib_qp *mlx5_ib_gsi_create_qp(struct ib_pd *pd,
}
dev->devr.ports[init_attr->port_num - 1].gsi = gsi;
-
mutex_unlock(&dev->devr.mutex);
+ gsi->ibqp.device = &dev->ib_dev;
+ rdma_rt_set_type(&gsi->ibqp.res, RDMA_RESTRACK_QP);
+ rdma_rt_set_id(&gsi->ibqp.res, gsi->ibqp.qp_num);
+
return &gsi->ibqp;
err_destroy_cq:
@@ -6529,6 +6529,8 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev)
rdma_rt_set_id_range(&dev->ib_dev, RDMA_RESTRACK_PD, 0, 0);
/* CQ ID managed by FW */
rdma_rt_set_id_range(&dev->ib_dev, RDMA_RESTRACK_CQ, 0, 0);
+ /* QP ID managed by HW */
+ rdma_rt_set_id_range(&dev->ib_dev, RDMA_RESTRACK_QP, 0, 0);
dev->mdev = mdev;
dev->num_ports = max(MLX5_CAP_GEN(mdev, num_ports),
@@ -2444,6 +2444,13 @@ static struct ib_qp *mlx5_ib_create_dct(struct ib_pd *pd,
qp->state = IB_QPS_RESET;
+ qp->ibqp.device = pd->device;
+ rdma_rt_set_type(&qp->ibqp.res, RDMA_RESTRACK_QP);
+ rdma_rt_set_id(&qp->ibqp.res, qp->ibqp.qp_num);
+ err = rdma_restrack_add(&qp->ibqp.res);
+ if (err)
+ goto err_free;
+
return &qp->ibqp;
err_free:
kfree(qp);
@@ -2607,6 +2614,15 @@ struct ib_qp *mlx5_ib_create_qp(struct ib_pd *pd,
if (verbs_init_attr->qp_type == IB_QPT_DRIVER)
qp->qp_sub_type = init_attr->qp_type;
+ qp->ibqp.device = &dev->ib_dev;
+ rdma_rt_set_type(&qp->ibqp.res, RDMA_RESTRACK_QP);
+ rdma_rt_set_id(&qp->ibqp.res, qp->ibqp.qp_num);
+ err = rdma_restrack_add(&qp->ibqp.res);
+ if (err) {
+ kfree(qp);
+ return ERR_PTR(err);
+ }
+
return &qp->ibqp;
}
@@ -2637,6 +2653,7 @@ int mlx5_ib_destroy_qp(struct ib_qp *qp)
if (unlikely(qp->qp_type == IB_QPT_GSI))
return mlx5_ib_gsi_destroy_qp(qp);
+ rdma_restrack_del(&qp->res);
if (mqp->qp_sub_type == MLX5_IB_QPT_DCT)
return mlx5_ib_destroy_dct(mqp);