RDMA/core: Configure selinux QP during creation
authorLeon Romanovsky <leonro@nvidia.com>
Tue, 3 Aug 2021 18:20:36 +0000 (21:20 +0300)
committerJason Gunthorpe <jgg@nvidia.com>
Tue, 3 Aug 2021 18:26:18 +0000 (15:26 -0300)
All QP creation flows called ib_create_qp_security(), but differently.
This caused to the need to provide exclusion conditions for the XRC_TGT,
because such QP already had selinux configuration call.

In order to fix it, move ib_create_qp_security() to the general QP
creation routine.

Link: https://lore.kernel.org/r/4d7cd6f5828aca37fb62283e6b126b73ab86b18c.1628014762.git.leonro@nvidia.com
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/core/uverbs_cmd.c
drivers/infiniband/core/uverbs_std_types_qp.c
drivers/infiniband/core/verbs.c

index 8c8ca7b..b515320 100644 (file)
@@ -1447,10 +1447,6 @@ static int create_qp(struct uverbs_attr_bundle *attrs,
        }
 
        if (cmd->qp_type != IB_QPT_XRC_TGT) {
-               ret = ib_create_qp_security(qp, device);
-               if (ret)
-                       goto err_cb;
-
                atomic_inc(&pd->usecnt);
                if (attr.send_cq)
                        atomic_inc(&attr.send_cq->usecnt);
@@ -1502,9 +1498,6 @@ static int create_qp(struct uverbs_attr_bundle *attrs,
        resp.response_length = uverbs_response_length(attrs, sizeof(resp));
        return uverbs_response(attrs, &resp, sizeof(resp));
 
-err_cb:
-       ib_destroy_qp_user(qp, uverbs_get_cleared_udata(attrs));
-
 err_put:
        if (!IS_ERR(xrcd_uobj))
                uobj_put_read(xrcd_uobj);
index c00cfb5..92812f6 100644 (file)
@@ -280,12 +280,6 @@ static int UVERBS_HANDLER(UVERBS_METHOD_QP_CREATE)(
        obj->uevent.uobject.object = qp;
        uverbs_finalize_uobj_create(attrs, UVERBS_ATTR_CREATE_QP_HANDLE);
 
-       if (attr.qp_type != IB_QPT_XRC_TGT) {
-               ret = ib_create_qp_security(qp, device);
-               if (ret)
-                       return ret;
-       }
-
        set_caps(&attr, &cap, false);
        ret = uverbs_copy_to_struct_or_zero(attrs,
                                        UVERBS_ATTR_CREATE_QP_RESP_CAP, &cap,
index a7717df..1f0f0be 100644 (file)
@@ -1216,6 +1216,7 @@ struct ib_qp *_ib_create_qp(struct ib_device *dev, struct ib_pd *pd,
                            struct ib_udata *udata, struct ib_uqp_object *uobj,
                            const char *caller)
 {
+       struct ib_udata dummy = {};
        struct ib_qp *qp;
        int ret;
 
@@ -1256,9 +1257,15 @@ struct ib_qp *_ib_create_qp(struct ib_device *dev, struct ib_pd *pd,
        qp->send_cq = attr->send_cq;
        qp->recv_cq = attr->recv_cq;
 
+       ret = ib_create_qp_security(qp, dev);
+       if (ret)
+               goto err_security;
+
        rdma_restrack_add(&qp->res);
        return qp;
 
+err_security:
+       qp->device->ops.destroy_qp(qp, udata ? &dummy : NULL);
 err_create:
        rdma_restrack_put(&qp->res);
        kfree(qp);
@@ -1288,10 +1295,6 @@ struct ib_qp *ib_create_qp_kernel(struct ib_pd *pd,
        if (IS_ERR(qp))
                return qp;
 
-       ret = ib_create_qp_security(qp, device);
-       if (ret)
-               goto err;
-
        if (qp_init_attr->qp_type == IB_QPT_XRC_TGT) {
                struct ib_qp *xrc_qp =
                        create_xrc_qp_user(qp, qp_init_attr);