]> git.ipfire.org Git - people/arne_f/kernel.git/commitdiff
IB/core: Destroy QP if XRC QP fails
authorYuval Avnery <yuvalav@mellanox.com>
Tue, 22 Jan 2019 07:02:05 +0000 (09:02 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 8 May 2019 05:20:52 +0000 (07:20 +0200)
commit 535005ca8e5e71918d64074032f4b9d4fef8981e upstream.

The open-coded variant missed destroy of SELinux created QP, reuse already
existing ib_detroy_qp() call and use this opportunity to clean
ib_create_qp() from double prints and unclear exit paths.

Reported-by: Parav Pandit <parav@mellanox.com>
Fixes: d291f1a65232 ("IB/core: Enforce PKey security on QPs")
Signed-off-by: Yuval Avnery <yuvalav@mellanox.com>
Reviewed-by: Parav Pandit <parav@mellanox.com>
Reviewed-by: Daniel Jurgens <danielj@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/infiniband/core/verbs.c

index 6d59af07d3387a415a5cd03af526fa11ea80afa3..d21c86dd27d863ee824da3b792589ad78f717227 100644 (file)
@@ -766,8 +766,8 @@ struct ib_qp *ib_open_qp(struct ib_xrcd *xrcd,
 }
 EXPORT_SYMBOL(ib_open_qp);
 
-static struct ib_qp *ib_create_xrc_qp(struct ib_qp *qp,
-               struct ib_qp_init_attr *qp_init_attr)
+static struct ib_qp *create_xrc_qp(struct ib_qp *qp,
+                                  struct ib_qp_init_attr *qp_init_attr)
 {
        struct ib_qp *real_qp = qp;
 
@@ -782,10 +782,10 @@ static struct ib_qp *ib_create_xrc_qp(struct ib_qp *qp,
 
        qp = __ib_open_qp(real_qp, qp_init_attr->event_handler,
                          qp_init_attr->qp_context);
-       if (!IS_ERR(qp))
-               __ib_insert_xrcd_qp(qp_init_attr->xrcd, real_qp);
-       else
-               real_qp->device->destroy_qp(real_qp);
+       if (IS_ERR(qp))
+               return qp;
+
+       __ib_insert_xrcd_qp(qp_init_attr->xrcd, real_qp);
        return qp;
 }
 
@@ -816,10 +816,8 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd,
                return qp;
 
        ret = ib_create_qp_security(qp, device);
-       if (ret) {
-               ib_destroy_qp(qp);
-               return ERR_PTR(ret);
-       }
+       if (ret)
+               goto err;
 
        qp->device     = device;
        qp->real_qp    = qp;
@@ -834,8 +832,15 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd,
        INIT_LIST_HEAD(&qp->sig_mrs);
        qp->port = 0;
 
-       if (qp_init_attr->qp_type == IB_QPT_XRC_TGT)
-               return ib_create_xrc_qp(qp, qp_init_attr);
+       if (qp_init_attr->qp_type == IB_QPT_XRC_TGT) {
+               struct ib_qp *xrc_qp = create_xrc_qp(qp, qp_init_attr);
+
+               if (IS_ERR(xrc_qp)) {
+                       ret = PTR_ERR(xrc_qp);
+                       goto err;
+               }
+               return xrc_qp;
+       }
 
        qp->event_handler = qp_init_attr->event_handler;
        qp->qp_context = qp_init_attr->qp_context;
@@ -863,11 +868,8 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd,
 
        if (qp_init_attr->cap.max_rdma_ctxs) {
                ret = rdma_rw_init_mrs(qp, qp_init_attr);
-               if (ret) {
-                       pr_err("failed to init MR pool ret= %d\n", ret);
-                       ib_destroy_qp(qp);
-                       return ERR_PTR(ret);
-               }
+               if (ret)
+                       goto err;
        }
 
        /*
@@ -880,6 +882,11 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd,
                                 device->attrs.max_sge_rd);
 
        return qp;
+
+err:
+       ib_destroy_qp(qp);
+       return ERR_PTR(ret);
+
 }
 EXPORT_SYMBOL(ib_create_qp);