IB/core: refactor ib_create_qp
authorChristoph Hellwig <hch@lst.de>
Tue, 3 May 2016 16:01:06 +0000 (18:01 +0200)
committerDoug Ledford <dledford@redhat.com>
Fri, 13 May 2016 17:37:18 +0000 (13:37 -0400)
Split the XRC magic into a separate function, and return early on failure
to make the initialization code readable.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Tested-by: Steve Wise <swise@opengridcomputing.com>
Reviewed-by: Bart Van Assche <bart.vanassche@sandisk.com>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/core/verbs.c

index 73fa9da..8c0f3a0 100644 (file)
@@ -723,62 +723,67 @@ 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)
+{
+       struct ib_qp *real_qp = qp;
+
+       qp->event_handler = __ib_shared_qp_event_handler;
+       qp->qp_context = qp;
+       qp->pd = NULL;
+       qp->send_cq = qp->recv_cq = NULL;
+       qp->srq = NULL;
+       qp->xrcd = qp_init_attr->xrcd;
+       atomic_inc(&qp_init_attr->xrcd->usecnt);
+       INIT_LIST_HEAD(&qp->open_list);
+
+       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);
+       return qp;
+}
+
 struct ib_qp *ib_create_qp(struct ib_pd *pd,
                           struct ib_qp_init_attr *qp_init_attr)
 {
-       struct ib_qp *qp, *real_qp;
-       struct ib_device *device;
+       struct ib_device *device = pd ? pd->device : qp_init_attr->xrcd->device;
+       struct ib_qp *qp;
 
-       device = pd ? pd->device : qp_init_attr->xrcd->device;
        qp = device->create_qp(pd, qp_init_attr, NULL);
-
-       if (!IS_ERR(qp)) {
-               qp->device     = device;
-               qp->real_qp    = qp;
-               qp->uobject    = NULL;
-               qp->qp_type    = qp_init_attr->qp_type;
-
-               atomic_set(&qp->usecnt, 0);
-               if (qp_init_attr->qp_type == IB_QPT_XRC_TGT) {
-                       qp->event_handler = __ib_shared_qp_event_handler;
-                       qp->qp_context = qp;
-                       qp->pd = NULL;
-                       qp->send_cq = qp->recv_cq = NULL;
-                       qp->srq = NULL;
-                       qp->xrcd = qp_init_attr->xrcd;
-                       atomic_inc(&qp_init_attr->xrcd->usecnt);
-                       INIT_LIST_HEAD(&qp->open_list);
-
-                       real_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);
-               } else {
-                       qp->event_handler = qp_init_attr->event_handler;
-                       qp->qp_context = qp_init_attr->qp_context;
-                       if (qp_init_attr->qp_type == IB_QPT_XRC_INI) {
-                               qp->recv_cq = NULL;
-                               qp->srq = NULL;
-                       } else {
-                               qp->recv_cq = qp_init_attr->recv_cq;
-                               atomic_inc(&qp_init_attr->recv_cq->usecnt);
-                               qp->srq = qp_init_attr->srq;
-                               if (qp->srq)
-                                       atomic_inc(&qp_init_attr->srq->usecnt);
-                       }
-
-                       qp->pd      = pd;
-                       qp->send_cq = qp_init_attr->send_cq;
-                       qp->xrcd    = NULL;
-
-                       atomic_inc(&pd->usecnt);
-                       atomic_inc(&qp_init_attr->send_cq->usecnt);
-               }
+       if (IS_ERR(qp))
+               return qp;
+
+       qp->device     = device;
+       qp->real_qp    = qp;
+       qp->uobject    = NULL;
+       qp->qp_type    = qp_init_attr->qp_type;
+
+       atomic_set(&qp->usecnt, 0);
+       if (qp_init_attr->qp_type == IB_QPT_XRC_TGT)
+               return ib_create_xrc_qp(qp, qp_init_attr);
+
+       qp->event_handler = qp_init_attr->event_handler;
+       qp->qp_context = qp_init_attr->qp_context;
+       if (qp_init_attr->qp_type == IB_QPT_XRC_INI) {
+               qp->recv_cq = NULL;
+               qp->srq = NULL;
+       } else {
+               qp->recv_cq = qp_init_attr->recv_cq;
+               atomic_inc(&qp_init_attr->recv_cq->usecnt);
+               qp->srq = qp_init_attr->srq;
+               if (qp->srq)
+                       atomic_inc(&qp_init_attr->srq->usecnt);
        }
 
+       qp->pd      = pd;
+       qp->send_cq = qp_init_attr->send_cq;
+       qp->xrcd    = NULL;
+
+       atomic_inc(&pd->usecnt);
+       atomic_inc(&qp_init_attr->send_cq->usecnt);
        return qp;
 }
 EXPORT_SYMBOL(ib_create_qp);