On Mon, Apr 11, 2016 at 02:32:33PM -0700, Christoph Hellwig wrote: > 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@xxxxxx> > Tested-by: Steve Wise <swise@xxxxxxxxxxxxxxxxxxxxx> > Reviewed-by: Bart Van Assche <bart.vanassche@xxxxxxxxxxx> > Reviewed-by: Steve Wise <swise@xxxxxxxxxxxxxxxxxxxxx> Reviewed-by: Ira Weiny <ira.weiny@xxxxxxxxx> > --- > drivers/infiniband/core/verbs.c | 103 +++++++++++++++++++++------------------- > 1 file changed, 54 insertions(+), 49 deletions(-) > > diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c > index 064dbef..d0ed260 100644 > --- a/drivers/infiniband/core/verbs.c > +++ b/drivers/infiniband/core/verbs.c > @@ -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); > -- > 2.1.4 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-rdma" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe target-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html