OSDN Git Service

RDMA/core: Add resource tracking for create and destroy CQs
authorLeon Romanovsky <leonro@mellanox.com>
Sun, 28 Jan 2018 09:17:22 +0000 (11:17 +0200)
committerJason Gunthorpe <jgg@mellanox.com>
Tue, 30 Jan 2018 03:21:40 +0000 (20:21 -0700)
Track create and destroy operations of CQ 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/cq.c
drivers/infiniband/core/uverbs_cmd.c
drivers/infiniband/core/uverbs_std_types.c
drivers/infiniband/core/verbs.c

index d99565d..bc79ca8 100644 (file)
@@ -159,6 +159,10 @@ struct ib_cq *__ib_alloc_cq(struct ib_device *dev, void *private,
        if (!cq->wc)
                goto out_destroy_cq;
 
+       cq->res.type = RDMA_RESTRACK_CQ;
+       cq->res.kern_name = caller;
+       rdma_restrack_add(&cq->res);
+
        switch (cq->poll_ctx) {
        case IB_POLL_DIRECT:
                cq->comp_handler = ib_cq_completion_direct;
@@ -183,6 +187,7 @@ struct ib_cq *__ib_alloc_cq(struct ib_device *dev, void *private,
 
 out_free_wc:
        kfree(cq->wc);
+       rdma_restrack_del(&cq->res);
 out_destroy_cq:
        cq->device->destroy_cq(cq);
        return ERR_PTR(ret);
@@ -214,6 +219,7 @@ void ib_free_cq(struct ib_cq *cq)
        }
 
        kfree(cq->wc);
+       rdma_restrack_del(&cq->res);
        ret = cq->device->destroy_cq(cq);
        WARN_ON_ONCE(ret);
 }
index 825325c..3e95acd 100644 (file)
@@ -1033,6 +1033,8 @@ static struct ib_ucq_object *create_cq(struct ib_uverbs_file *file,
                goto err_cb;
 
        uobj_alloc_commit(&obj->uobject);
+       cq->res.type = RDMA_RESTRACK_CQ;
+       rdma_restrack_add(&cq->res);
 
        return obj;
 
index c3ee5d9..b571176 100644 (file)
@@ -35,6 +35,7 @@
 #include <rdma/ib_verbs.h>
 #include <linux/bug.h>
 #include <linux/file.h>
+#include <rdma/restrack.h>
 #include "rdma_core.h"
 #include "uverbs.h"
 
@@ -319,6 +320,8 @@ static int uverbs_create_cq_handler(struct ib_device *ib_dev,
        obj->uobject.object = cq;
        obj->uobject.user_handle = user_handle;
        atomic_set(&cq->usecnt, 0);
+       cq->res.type = RDMA_RESTRACK_CQ;
+       rdma_restrack_add(&cq->res);
 
        ret = uverbs_copy_to(attrs, CREATE_CQ_RESP_CQE, &cq->cqe);
        if (ret)
index 5324cf4..8cb5c85 100644 (file)
@@ -1579,6 +1579,8 @@ struct ib_cq *ib_create_cq(struct ib_device *device,
                cq->event_handler = event_handler;
                cq->cq_context    = cq_context;
                atomic_set(&cq->usecnt, 0);
+               cq->res.type = RDMA_RESTRACK_CQ;
+               rdma_restrack_add(&cq->res);
        }
 
        return cq;
@@ -1597,6 +1599,7 @@ int ib_destroy_cq(struct ib_cq *cq)
        if (atomic_read(&cq->usecnt))
                return -EBUSY;
 
+       rdma_restrack_del(&cq->res);
        return cq->device->destroy_cq(cq);
 }
 EXPORT_SYMBOL(ib_destroy_cq);