RDMA/core: Add resource tracking for create and destroy QPs
authorLeon Romanovsky <leonro@mellanox.com>
Sun, 28 Jan 2018 09:17:21 +0000 (11:17 +0200)
committerJason Gunthorpe <jgg@mellanox.com>
Tue, 30 Jan 2018 03:21:39 +0000 (20:21 -0700)
Track create and destroy operations of QP objects.

Reviewed-by: Mark Bloch <markb@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Reviewed-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/core/core_priv.h
drivers/infiniband/core/uverbs_cmd.c
drivers/infiniband/core/verbs.c

index 2b1372da708a6e239aab4735aa8175b81e4d3559..c4560d84dfaebd550f504f2ed6b5f30bfb7ad520 100644 (file)
@@ -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 */
index 4ddd61d905075c8b38a0a298e4b506e0e2e58e52..825325c764a170dd356f267c34f30875c9179b5a 100644 (file)
@@ -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;
index c2b347f6e8a29826f7c7a4392f2899be6092b549..5324cf4788d02120aa0daabc763d73b51b20ebdd 100644 (file)
@@ -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)