RDMA: Globally allocate and release QP memory
[linux-2.6-microblaze.git] / drivers / infiniband / hw / irdma / verbs.c
index 9712f69..9b8c451 100644 (file)
@@ -792,18 +792,19 @@ static int irdma_validate_qp_attrs(struct ib_qp_init_attr *init_attr,
 
 /**
  * irdma_create_qp - create qp
- * @ibpd: ptr of pd
+ * @ibqp: ptr of qp
  * @init_attr: attributes for qp
  * @udata: user data for create qp
  */
-static struct ib_qp *irdma_create_qp(struct ib_pd *ibpd,
-                                    struct ib_qp_init_attr *init_attr,
-                                    struct ib_udata *udata)
+static int irdma_create_qp(struct ib_qp *ibqp,
+                          struct ib_qp_init_attr *init_attr,
+                          struct ib_udata *udata)
 {
+       struct ib_pd *ibpd = ibqp->pd;
        struct irdma_pd *iwpd = to_iwpd(ibpd);
        struct irdma_device *iwdev = to_iwdev(ibpd->device);
        struct irdma_pci_f *rf = iwdev->rf;
-       struct irdma_qp *iwqp;
+       struct irdma_qp *iwqp = to_iwqp(ibqp);
        struct irdma_create_qp_req req;
        struct irdma_create_qp_resp uresp = {};
        u32 qp_num = 0;
@@ -820,7 +821,7 @@ static struct ib_qp *irdma_create_qp(struct ib_pd *ibpd,
 
        err_code = irdma_validate_qp_attrs(init_attr, iwdev);
        if (err_code)
-               return ERR_PTR(err_code);
+               return err_code;
 
        sq_size = init_attr->cap.max_send_wr;
        rq_size = init_attr->cap.max_recv_wr;
@@ -833,10 +834,6 @@ static struct ib_qp *irdma_create_qp(struct ib_pd *ibpd,
        init_info.qp_uk_init_info.max_rq_frag_cnt = init_attr->cap.max_recv_sge;
        init_info.qp_uk_init_info.max_inline_data = init_attr->cap.max_inline_data;
 
-       iwqp = kzalloc(sizeof(*iwqp), GFP_KERNEL);
-       if (!iwqp)
-               return ERR_PTR(-ENOMEM);
-
        qp = &iwqp->sc_qp;
        qp->qp_uk.back_qp = iwqp;
        qp->qp_uk.lock = &iwqp->lock;
@@ -849,10 +846,8 @@ static struct ib_qp *irdma_create_qp(struct ib_pd *ibpd,
                                                 iwqp->q2_ctx_mem.size,
                                                 &iwqp->q2_ctx_mem.pa,
                                                 GFP_KERNEL);
-       if (!iwqp->q2_ctx_mem.va) {
-               err_code = -ENOMEM;
-               goto error;
-       }
+       if (!iwqp->q2_ctx_mem.va)
+               return -ENOMEM;
 
        init_info.q2 = iwqp->q2_ctx_mem.va;
        init_info.q2_pa = iwqp->q2_ctx_mem.pa;
@@ -1001,17 +996,16 @@ static struct ib_qp *irdma_create_qp(struct ib_pd *ibpd,
                if (err_code) {
                        ibdev_dbg(&iwdev->ibdev, "VERBS: copy_to_udata failed\n");
                        irdma_destroy_qp(&iwqp->ibqp, udata);
-                       return ERR_PTR(err_code);
+                       return err_code;
                }
        }
 
        init_completion(&iwqp->free_qp);
-       return &iwqp->ibqp;
+       return 0;
 
 error:
        irdma_free_qp_rsrc(iwqp);
-
-       return ERR_PTR(err_code);
+       return err_code;
 }
 
 static int irdma_get_ib_acc_flags(struct irdma_qp *iwqp)
@@ -4406,6 +4400,7 @@ static const struct ib_device_ops irdma_dev_ops = {
        INIT_RDMA_OBJ_SIZE(ib_ah, irdma_ah, ibah),
        INIT_RDMA_OBJ_SIZE(ib_cq, irdma_cq, ibcq),
        INIT_RDMA_OBJ_SIZE(ib_mw, irdma_mr, ibmw),
+       INIT_RDMA_OBJ_SIZE(ib_qp, irdma_qp, ibqp),
 };
 
 /**