Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 78a0cd64 authored by Leon Romanovsky's avatar Leon Romanovsky Committed by Jason Gunthorpe
Browse files

RDMA/core: Add resource tracking for create and destroy QPs



Track create and destroy operations of QP objects.

Reviewed-by: default avatarMark Bloch <markb@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Reviewed-by: default avatarSteve Wise <swise@opengridcomputing.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent 02d8883f
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -301,4 +301,31 @@ struct ib_device *ib_device_get_by_index(u32 ifindex);
/* RDMA device netlink */
void nldev_init(void);
void nldev_exit(void);

static inline struct ib_qp *_ib_create_qp(struct ib_device *dev,
					  struct ib_pd *pd,
					  struct ib_qp_init_attr *attr,
					  struct ib_udata *udata)
{
	struct ib_qp *qp;

	qp = dev->create_qp(pd, attr, udata);
	if (IS_ERR(qp))
		return qp;

	qp->device = dev;
	qp->pd = pd;
	/*
	 * We don't track XRC QPs for now, because they don't have PD
	 * and more importantly they are created internaly by driver,
	 * see mlx5 create_dev_resources() as an example.
	 */
	if (attr->qp_type < IB_QPT_XRC_INI) {
		qp->res.type = RDMA_RESTRACK_QP;
		rdma_restrack_add(&qp->res);
	} else
		qp->res.valid = false;

	return qp;
}
#endif /* _CORE_PRIV_H */
+1 −2
Original line number Diff line number Diff line
@@ -1514,7 +1514,7 @@ static int create_qp(struct ib_uverbs_file *file,
	if (cmd->qp_type == IB_QPT_XRC_TGT)
		qp = ib_create_qp(pd, &attr);
	else
		qp = device->create_qp(pd, &attr, uhw);
		qp = _ib_create_qp(device, pd, &attr, uhw);

	if (IS_ERR(qp)) {
		ret = PTR_ERR(qp);
@@ -1527,7 +1527,6 @@ static int create_qp(struct ib_uverbs_file *file,
			goto err_cb;

		qp->real_qp	  = qp;
		qp->device	  = device;
		qp->pd		  = pd;
		qp->send_cq	  = attr.send_cq;
		qp->recv_cq	  = attr.recv_cq;
+2 −3
Original line number Diff line number Diff line
@@ -882,7 +882,7 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd,
	if (qp_init_attr->cap.max_rdma_ctxs)
		rdma_rw_init_qp(device, qp_init_attr);

	qp = device->create_qp(pd, qp_init_attr, NULL);
	qp = _ib_create_qp(device, pd, qp_init_attr, NULL);
	if (IS_ERR(qp))
		return qp;

@@ -892,7 +892,6 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd,
		return ERR_PTR(ret);
	}

	qp->device     = device;
	qp->real_qp    = qp;
	qp->uobject    = NULL;
	qp->qp_type    = qp_init_attr->qp_type;
@@ -922,7 +921,6 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd,
			atomic_inc(&qp_init_attr->srq->usecnt);
	}

	qp->pd	    = pd;
	qp->send_cq = qp_init_attr->send_cq;
	qp->xrcd    = NULL;

@@ -1538,6 +1536,7 @@ int ib_destroy_qp(struct ib_qp *qp)
	if (!qp->uobject)
		rdma_rw_cleanup_mrs(qp);

	rdma_restrack_del(&qp->res);
	ret = qp->device->destroy_qp(qp);
	if (!ret) {
		if (pd)