RDMA/restrack: Resource-tracker should not use uobject pointers
authorShamir Rabinovitch <shamir.rabinovitch@oracle.com>
Mon, 17 Dec 2018 15:15:16 +0000 (17:15 +0200)
committerJason Gunthorpe <jgg@mellanox.com>
Tue, 18 Dec 2018 22:38:26 +0000 (15:38 -0700)
Having uobject pointer embedded in ib core objects is not aligned with a
future shared ib_x model. The resource tracker only does this to keep
track of user/kernel objects - track this directly instead.

Signed-off-by: Shamir Rabinovitch <shamir.rabinovitch@oracle.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/core/cma.c
drivers/infiniband/core/core_priv.h
drivers/infiniband/core/cq.c
drivers/infiniband/core/restrack.c
drivers/infiniband/core/uverbs_cmd.c
drivers/infiniband/core/uverbs_std_types_cq.c
drivers/infiniband/core/verbs.c
include/rdma/restrack.h

index 15d5bb7bf6bb8b05678de8717f629d4aa99e48df..63a7cc00bae0b1578254cd228e2a72feac084b03 100644 (file)
@@ -494,7 +494,7 @@ static void _cma_attach_to_dev(struct rdma_id_private *id_priv,
        id_priv->id.route.addr.dev_addr.transport =
                rdma_node_get_transport(cma_dev->device->node_type);
        list_add_tail(&id_priv->list, &cma_dev->id_list);
-       rdma_restrack_add(&id_priv->res);
+       rdma_restrack_kadd(&id_priv->res);
 }
 
 static void cma_attach_to_dev(struct rdma_id_private *id_priv,
index cea92624f9d4d8d68703b776e0598b21c9b6eaae..3cd830d52967eb252d6646094a46f52e0e003174 100644 (file)
@@ -297,7 +297,10 @@ static inline struct ib_qp *_ib_create_qp(struct ib_device *dev,
         */
        if (attr->qp_type < IB_QPT_XRC_INI) {
                qp->res.type = RDMA_RESTRACK_QP;
-               rdma_restrack_add(&qp->res);
+               if (uobj)
+                       rdma_restrack_uadd(&qp->res);
+               else
+                       rdma_restrack_kadd(&qp->res);
        } else
                qp->res.valid = false;
 
index 7fb4f64ae9336efb8f75c34726436dff930ae5f4..d61e5e1427c2854b9226fc75457051404a199caf 100644 (file)
@@ -162,7 +162,7 @@ struct ib_cq *__ib_alloc_cq(struct ib_device *dev, void *private,
 
        cq->res.type = RDMA_RESTRACK_CQ;
        rdma_restrack_set_task(&cq->res, caller);
-       rdma_restrack_add(&cq->res);
+       rdma_restrack_kadd(&cq->res);
 
        switch (cq->poll_ctx) {
        case IB_POLL_DIRECT:
index 3dd316159f5ff6a58b695eae2b716221a233a139..46a5c553c6244a60cf2bc8409e211cfe86618f23 100644 (file)
@@ -139,27 +139,6 @@ static struct ib_device *res_to_dev(struct rdma_restrack_entry *res)
        }
 }
 
-static bool res_is_user(struct rdma_restrack_entry *res)
-{
-       switch (res->type) {
-       case RDMA_RESTRACK_PD:
-               return container_of(res, struct ib_pd, res)->uobject;
-       case RDMA_RESTRACK_CQ:
-               return container_of(res, struct ib_cq, res)->uobject;
-       case RDMA_RESTRACK_QP:
-               return container_of(res, struct ib_qp, res)->uobject;
-       case RDMA_RESTRACK_CM_ID:
-               return !res->kern_name;
-       case RDMA_RESTRACK_MR:
-               return container_of(res, struct ib_mr, res)->pd->uobject;
-       case RDMA_RESTRACK_CTX:
-               return true;
-       default:
-               WARN_ONCE(true, "Wrong resource tracking type %u\n", res->type);
-               return false;
-       }
-}
-
 void rdma_restrack_set_task(struct rdma_restrack_entry *res,
                            const char *caller)
 {
@@ -175,17 +154,17 @@ void rdma_restrack_set_task(struct rdma_restrack_entry *res,
 }
 EXPORT_SYMBOL(rdma_restrack_set_task);
 
-void rdma_restrack_add(struct rdma_restrack_entry *res)
+static void rdma_restrack_add(struct rdma_restrack_entry *res)
 {
        struct ib_device *dev = res_to_dev(res);
 
        if (!dev)
                return;
 
-       if (res->type != RDMA_RESTRACK_CM_ID || !res_is_user(res))
+       if (res->type != RDMA_RESTRACK_CM_ID || rdma_is_kernel_res(res))
                res->task = NULL;
 
-       if (res_is_user(res)) {
+       if (!rdma_is_kernel_res(res)) {
                if (!res->task)
                        rdma_restrack_set_task(res, NULL);
                res->kern_name = NULL;
@@ -201,7 +180,28 @@ void rdma_restrack_add(struct rdma_restrack_entry *res)
        hash_add(dev->res.hash, &res->node, res->type);
        up_write(&dev->res.rwsem);
 }
-EXPORT_SYMBOL(rdma_restrack_add);
+
+/**
+ * rdma_restrack_kadd() - add kernel object to the reource tracking database
+ * @res:  resource entry
+ */
+void rdma_restrack_kadd(struct rdma_restrack_entry *res)
+{
+       res->user = false;
+       rdma_restrack_add(res);
+}
+EXPORT_SYMBOL(rdma_restrack_kadd);
+
+/**
+ * rdma_restrack_uadd() - add user object to the reource tracking database
+ * @res:  resource entry
+ */
+void rdma_restrack_uadd(struct rdma_restrack_entry *res)
+{
+       res->user = true;
+       rdma_restrack_add(res);
+}
+EXPORT_SYMBOL(rdma_restrack_uadd);
 
 int __must_check rdma_restrack_get(struct rdma_restrack_entry *res)
 {
index 357d33120ca48099408724694e7876be605111d4..17be53da21b060019c7773498e78aea8485b6fc0 100644 (file)
@@ -262,7 +262,7 @@ static int ib_uverbs_get_context(struct uverbs_attr_bundle *attrs)
        fd_install(resp.async_fd, filp);
 
        ucontext->res.type = RDMA_RESTRACK_CTX;
-       rdma_restrack_add(&ucontext->res);
+       rdma_restrack_uadd(&ucontext->res);
 
        /*
         * Make sure that ib_uverbs_get_ucontext() sees the pointer update
@@ -472,7 +472,7 @@ static int ib_uverbs_alloc_pd(struct uverbs_attr_bundle *attrs)
        memset(&resp, 0, sizeof resp);
        resp.pd_handle = uobj->id;
        pd->res.type = RDMA_RESTRACK_PD;
-       rdma_restrack_add(&pd->res);
+       rdma_restrack_uadd(&pd->res);
 
        ret = uverbs_response(attrs, &resp, sizeof(resp));
        if (ret)
@@ -788,7 +788,7 @@ static int ib_uverbs_reg_mr(struct uverbs_attr_bundle *attrs)
        mr->uobject = uobj;
        atomic_inc(&pd->usecnt);
        mr->res.type = RDMA_RESTRACK_MR;
-       rdma_restrack_add(&mr->res);
+       rdma_restrack_uadd(&mr->res);
 
        uobj->object = mr;
 
@@ -1066,7 +1066,7 @@ static struct ib_ucq_object *create_cq(struct uverbs_attr_bundle *attrs,
        resp.response_length = uverbs_response_length(attrs, sizeof(resp));
 
        cq->res.type = RDMA_RESTRACK_CQ;
-       rdma_restrack_add(&cq->res);
+       rdma_restrack_uadd(&cq->res);
 
        ret = uverbs_response(attrs, &resp, sizeof(resp));
        if (ret)
index 42df59635a3cb292a0b67a17a0d426b5c78c9159..a59ea89e3f2b062a8e55f34c00727450cb86ddb0 100644 (file)
@@ -126,7 +126,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(
        obj->uobject.user_handle = user_handle;
        atomic_set(&cq->usecnt, 0);
        cq->res.type = RDMA_RESTRACK_CQ;
-       rdma_restrack_add(&cq->res);
+       rdma_restrack_uadd(&cq->res);
 
        ret = uverbs_copy_to(attrs, UVERBS_ATTR_CREATE_CQ_RESP_CQE, &cq->cqe,
                             sizeof(cq->cqe));
index 92dbc758f6c9c3c4facc62e32c2f719ef8535bcd..bc0b3a150e3c5d6b5c8b1922e53103bb930cb611 100644 (file)
@@ -277,7 +277,7 @@ struct ib_pd *__ib_alloc_pd(struct ib_device *device, unsigned int flags,
 
        pd->res.type = RDMA_RESTRACK_PD;
        rdma_restrack_set_task(&pd->res, caller);
-       rdma_restrack_add(&pd->res);
+       rdma_restrack_kadd(&pd->res);
 
        if (mr_access_flags) {
                struct ib_mr *mr;
@@ -1902,7 +1902,7 @@ struct ib_cq *__ib_create_cq(struct ib_device *device,
                atomic_set(&cq->usecnt, 0);
                cq->res.type = RDMA_RESTRACK_CQ;
                rdma_restrack_set_task(&cq->res, caller);
-               rdma_restrack_add(&cq->res);
+               rdma_restrack_kadd(&cq->res);
        }
 
        return cq;
@@ -1984,7 +1984,7 @@ struct ib_mr *ib_alloc_mr(struct ib_pd *pd,
                atomic_inc(&pd->usecnt);
                mr->need_inval = false;
                mr->res.type = RDMA_RESTRACK_MR;
-               rdma_restrack_add(&mr->res);
+               rdma_restrack_kadd(&mr->res);
        }
 
        return mr;
index f34aa96e451849a06775762c06b30ccdb6893266..8f179be9d9a9e6ef3d2876993cafed5da9a481a4 100644 (file)
@@ -116,6 +116,10 @@ struct rdma_restrack_entry {
         * @type: various objects in restrack database
         */
        enum rdma_restrack_type type;
+       /**
+        * @user: user resource
+        */
+       bool                    user;
 };
 
 /**
@@ -140,11 +144,8 @@ int rdma_restrack_count(struct rdma_restrack_root *res,
                        enum rdma_restrack_type type,
                        struct pid_namespace *ns);
 
-/**
- * rdma_restrack_add() - add object to the reource tracking database
- * @res:  resource entry
- */
-void rdma_restrack_add(struct rdma_restrack_entry *res);
+void rdma_restrack_kadd(struct rdma_restrack_entry *res);
+void rdma_restrack_uadd(struct rdma_restrack_entry *res);
 
 /**
  * rdma_restrack_del() - delete object from the reource tracking database
@@ -159,7 +160,7 @@ void rdma_restrack_del(struct rdma_restrack_entry *res);
  */
 static inline bool rdma_is_kernel_res(struct rdma_restrack_entry *res)
 {
-       return !res->task;
+       return !res->user;
 }
 
 /**