]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
RDMA: Handle SRQ allocations by IB/core
authorLeon Romanovsky <leonro@mellanox.com>
Wed, 3 Apr 2019 13:42:43 +0000 (16:42 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Mon, 8 Apr 2019 16:05:25 +0000 (13:05 -0300)
Convert SRQ allocation from drivers to be in the IB/core

Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
41 files changed:
drivers/infiniband/core/device.c
drivers/infiniband/core/uverbs_cmd.c
drivers/infiniband/core/verbs.c
drivers/infiniband/hw/bnxt_re/ib_verbs.c
drivers/infiniband/hw/bnxt_re/ib_verbs.h
drivers/infiniband/hw/bnxt_re/main.c
drivers/infiniband/hw/bnxt_re/qplib_fp.c
drivers/infiniband/hw/bnxt_re/qplib_fp.h
drivers/infiniband/hw/cxgb4/iw_cxgb4.h
drivers/infiniband/hw/cxgb4/provider.c
drivers/infiniband/hw/cxgb4/qp.c
drivers/infiniband/hw/hns/hns_roce_device.h
drivers/infiniband/hw/hns/hns_roce_main.c
drivers/infiniband/hw/hns/hns_roce_srq.c
drivers/infiniband/hw/mlx4/main.c
drivers/infiniband/hw/mlx4/mlx4_ib.h
drivers/infiniband/hw/mlx4/srq.c
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/hw/mlx5/mlx5_ib.h
drivers/infiniband/hw/mlx5/srq.c
drivers/infiniband/hw/mlx5/srq.h
drivers/infiniband/hw/mlx5/srq_cmd.c
drivers/infiniband/hw/mthca/mthca_provider.c
drivers/infiniband/hw/ocrdma/ocrdma_hw.c
drivers/infiniband/hw/ocrdma/ocrdma_hw.h
drivers/infiniband/hw/ocrdma/ocrdma_main.c
drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
drivers/infiniband/hw/ocrdma/ocrdma_verbs.h
drivers/infiniband/hw/qedr/main.c
drivers/infiniband/hw/qedr/verbs.c
drivers/infiniband/hw/qedr/verbs.h
drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c
drivers/infiniband/hw/vmw_pvrdma/pvrdma_srq.c
drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.h
drivers/infiniband/sw/rdmavt/srq.c
drivers/infiniband/sw/rdmavt/srq.h
drivers/infiniband/sw/rdmavt/vt.c
drivers/infiniband/sw/rxe/rxe_pool.c
drivers/infiniband/sw/rxe/rxe_verbs.c
drivers/infiniband/sw/rxe/rxe_verbs.h
include/rdma/ib_verbs.h

index b5fad8a68a35f3ff72f9962ece89dd8d04a30808..88c4238bbee133a29430be92fbe696fe87205df1 100644 (file)
@@ -2224,6 +2224,7 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops)
 
        SET_OBJ_SIZE(dev_ops, ib_ah);
        SET_OBJ_SIZE(dev_ops, ib_pd);
+       SET_OBJ_SIZE(dev_ops, ib_srq);
        SET_OBJ_SIZE(dev_ops, ib_ucontext);
 }
 EXPORT_SYMBOL(ib_set_device_ops);
index 89b0f5420dfe8a4c54545f0bb73e24d80d130137..04d08135b3743464218cd22d4afcfcc9002a5df1 100644 (file)
@@ -3409,9 +3409,9 @@ static int __uverbs_create_xsrq(struct uverbs_attr_bundle *attrs,
        obj->uevent.events_reported = 0;
        INIT_LIST_HEAD(&obj->uevent.event_list);
 
-       srq = pd->device->ops.create_srq(pd, &attr, udata);
-       if (IS_ERR(srq)) {
-               ret = PTR_ERR(srq);
+       srq = rdma_zalloc_drv_obj(ib_dev, ib_srq);
+       if (!srq) {
+               ret = -ENOMEM;
                goto err_put;
        }
 
@@ -3422,6 +3422,10 @@ static int __uverbs_create_xsrq(struct uverbs_attr_bundle *attrs,
        srq->event_handler = attr.event_handler;
        srq->srq_context   = attr.srq_context;
 
+       ret = pd->device->ops.create_srq(srq, &attr, udata);
+       if (ret)
+               goto err_free;
+
        if (ib_srq_has_cq(cmd->srq_type)) {
                srq->ext.cq       = attr.ext.cq;
                atomic_inc(&attr.ext.cq->usecnt);
@@ -3461,6 +3465,8 @@ static int __uverbs_create_xsrq(struct uverbs_attr_bundle *attrs,
 err_copy:
        ib_destroy_srq_user(srq, &attrs->driver_udata);
 
+err_free:
+       kfree(srq);
 err_put:
        uobj_put_obj_read(pd);
 
index 6172019481a4e7a708baba54d4dd97dcc7f362b2..7313edc9f091798332b8d266f8026f36e4f55051 100644 (file)
@@ -964,29 +964,40 @@ struct ib_srq *ib_create_srq(struct ib_pd *pd,
                             struct ib_srq_init_attr *srq_init_attr)
 {
        struct ib_srq *srq;
+       int ret;
 
        if (!pd->device->ops.create_srq)
                return ERR_PTR(-EOPNOTSUPP);
 
-       srq = pd->device->ops.create_srq(pd, srq_init_attr, NULL);
-
-       if (!IS_ERR(srq)) {
-               srq->device        = pd->device;
-               srq->pd            = pd;
-               srq->uobject       = NULL;
-               srq->event_handler = srq_init_attr->event_handler;
-               srq->srq_context   = srq_init_attr->srq_context;
-               srq->srq_type      = srq_init_attr->srq_type;
-               if (ib_srq_has_cq(srq->srq_type)) {
-                       srq->ext.cq   = srq_init_attr->ext.cq;
-                       atomic_inc(&srq->ext.cq->usecnt);
-               }
-               if (srq->srq_type == IB_SRQT_XRC) {
-                       srq->ext.xrc.xrcd = srq_init_attr->ext.xrc.xrcd;
-                       atomic_inc(&srq->ext.xrc.xrcd->usecnt);
-               }
-               atomic_inc(&pd->usecnt);
-               atomic_set(&srq->usecnt, 0);
+       srq = rdma_zalloc_drv_obj(pd->device, ib_srq);
+       if (!srq)
+               return ERR_PTR(-ENOMEM);
+
+       srq->device = pd->device;
+       srq->pd = pd;
+       srq->event_handler = srq_init_attr->event_handler;
+       srq->srq_context = srq_init_attr->srq_context;
+       srq->srq_type = srq_init_attr->srq_type;
+
+       if (ib_srq_has_cq(srq->srq_type)) {
+               srq->ext.cq = srq_init_attr->ext.cq;
+               atomic_inc(&srq->ext.cq->usecnt);
+       }
+       if (srq->srq_type == IB_SRQT_XRC) {
+               srq->ext.xrc.xrcd = srq_init_attr->ext.xrc.xrcd;
+               atomic_inc(&srq->ext.xrc.xrcd->usecnt);
+       }
+       atomic_inc(&pd->usecnt);
+
+       ret = pd->device->ops.create_srq(srq, srq_init_attr, NULL);
+       if (ret) {
+               atomic_dec(&srq->pd->usecnt);
+               if (srq->srq_type == IB_SRQT_XRC)
+                       atomic_dec(&srq->ext.xrc.xrcd->usecnt);
+               if (ib_srq_has_cq(srq->srq_type))
+                       atomic_dec(&srq->ext.cq->usecnt);
+               kfree(srq);
+               return ERR_PTR(ret);
        }
 
        return srq;
@@ -1013,32 +1024,19 @@ EXPORT_SYMBOL(ib_query_srq);
 
 int ib_destroy_srq_user(struct ib_srq *srq, struct ib_udata *udata)
 {
-       struct ib_pd *pd;
-       enum ib_srq_type srq_type;
-       struct ib_xrcd *uninitialized_var(xrcd);
-       struct ib_cq *uninitialized_var(cq);
-       int ret;
-
        if (atomic_read(&srq->usecnt))
                return -EBUSY;
 
-       pd = srq->pd;
-       srq_type = srq->srq_type;
-       if (ib_srq_has_cq(srq_type))
-               cq = srq->ext.cq;
-       if (srq_type == IB_SRQT_XRC)
-               xrcd = srq->ext.xrc.xrcd;
+       srq->device->ops.destroy_srq(srq, udata);
 
-       ret = srq->device->ops.destroy_srq(srq, udata);
-       if (!ret) {
-               atomic_dec(&pd->usecnt);
-               if (srq_type == IB_SRQT_XRC)
-                       atomic_dec(&xrcd->usecnt);
-               if (ib_srq_has_cq(srq_type))
-                       atomic_dec(&cq->usecnt);
-       }
+       atomic_dec(&srq->pd->usecnt);
+       if (srq->srq_type == IB_SRQT_XRC)
+               atomic_dec(&srq->ext.xrc.xrcd->usecnt);
+       if (ib_srq_has_cq(srq->srq_type))
+               atomic_dec(&srq->ext.cq->usecnt);
+       kfree(srq);
 
-       return ret;
+       return 0;
 }
 EXPORT_SYMBOL(ib_destroy_srq_user);
 
index a9e2e29d7ad0ded7c901180fcd90c1650ec87bf6..dc53604171a0875c72a5a147f083ac81a07989ef 100644 (file)
@@ -1305,30 +1305,22 @@ static enum ib_mtu __to_ib_mtu(u32 mtu)
 }
 
 /* Shared Receive Queues */
-int bnxt_re_destroy_srq(struct ib_srq *ib_srq, struct ib_udata *udata)
+void bnxt_re_destroy_srq(struct ib_srq *ib_srq, struct ib_udata *udata)
 {
        struct bnxt_re_srq *srq = container_of(ib_srq, struct bnxt_re_srq,
                                               ib_srq);
        struct bnxt_re_dev *rdev = srq->rdev;
        struct bnxt_qplib_srq *qplib_srq = &srq->qplib_srq;
        struct bnxt_qplib_nq *nq = NULL;
-       int rc;
 
        if (qplib_srq->cq)
                nq = qplib_srq->cq->nq;
-       rc = bnxt_qplib_destroy_srq(&rdev->qplib_res, qplib_srq);
-       if (rc) {
-               dev_err(rdev_to_dev(rdev), "Destroy HW SRQ failed!");
-               return rc;
-       }
-
+       bnxt_qplib_destroy_srq(&rdev->qplib_res, qplib_srq);
        if (srq->umem)
                ib_umem_release(srq->umem);
-       kfree(srq);
        atomic_dec(&rdev->srq_count);
        if (nq)
                nq->budget--;
-       return 0;
 }
 
 static int bnxt_re_init_user_srq(struct bnxt_re_dev *rdev,
@@ -1362,14 +1354,16 @@ static int bnxt_re_init_user_srq(struct bnxt_re_dev *rdev,
        return 0;
 }
 
-struct ib_srq *bnxt_re_create_srq(struct ib_pd *ib_pd,
-                                 struct ib_srq_init_attr *srq_init_attr,
-                                 struct ib_udata *udata)
+int bnxt_re_create_srq(struct ib_srq *ib_srq,
+                      struct ib_srq_init_attr *srq_init_attr,
+                      struct ib_udata *udata)
 {
+       struct ib_pd *ib_pd = ib_srq->pd;
        struct bnxt_re_pd *pd = container_of(ib_pd, struct bnxt_re_pd, ib_pd);
        struct bnxt_re_dev *rdev = pd->rdev;
        struct bnxt_qplib_dev_attr *dev_attr = &rdev->dev_attr;
-       struct bnxt_re_srq *srq;
+       struct bnxt_re_srq *srq =
+               container_of(ib_srq, struct bnxt_re_srq, ib_srq);
        struct bnxt_qplib_nq *nq = NULL;
        int rc, entries;
 
@@ -1384,11 +1378,6 @@ struct ib_srq *bnxt_re_create_srq(struct ib_pd *ib_pd,
                goto exit;
        }
 
-       srq = kzalloc(sizeof(*srq), GFP_KERNEL);
-       if (!srq) {
-               rc = -ENOMEM;
-               goto exit;
-       }
        srq->rdev = rdev;
        srq->qplib_srq.pd = &pd->qplib_pd;
        srq->qplib_srq.dpi = &rdev->dpi_privileged;
@@ -1434,14 +1423,13 @@ struct ib_srq *bnxt_re_create_srq(struct ib_pd *ib_pd,
                nq->budget++;
        atomic_inc(&rdev->srq_count);
 
-       return &srq->ib_srq;
+       return 0;
 
 fail:
        if (srq->umem)
                ib_umem_release(srq->umem);
-       kfree(srq);
 exit:
-       return ERR_PTR(rc);
+       return rc;
 }
 
 int bnxt_re_modify_srq(struct ib_srq *ib_srq, struct ib_srq_attr *srq_attr,
index 953da89e5ec045f74cf95e83b58c4f636ad49147..bd4fa22985eb042080fb74dbd01b1e541d07d51a 100644 (file)
@@ -69,9 +69,9 @@ struct bnxt_re_ah {
 };
 
 struct bnxt_re_srq {
+       struct ib_srq           ib_srq;
        struct bnxt_re_dev      *rdev;
        u32                     srq_limit;
-       struct ib_srq           ib_srq;
        struct bnxt_qplib_srq   qplib_srq;
        struct ib_umem          *umem;
        spinlock_t              lock;           /* protect srq */
@@ -170,14 +170,14 @@ int bnxt_re_create_ah(struct ib_ah *ah, struct rdma_ah_attr *ah_attr, u32 flags,
 int bnxt_re_modify_ah(struct ib_ah *ah, struct rdma_ah_attr *ah_attr);
 int bnxt_re_query_ah(struct ib_ah *ah, struct rdma_ah_attr *ah_attr);
 void bnxt_re_destroy_ah(struct ib_ah *ah, u32 flags);
-struct ib_srq *bnxt_re_create_srq(struct ib_pd *pd,
-                                 struct ib_srq_init_attr *srq_init_attr,
-                                 struct ib_udata *udata);
+int bnxt_re_create_srq(struct ib_srq *srq,
+                      struct ib_srq_init_attr *srq_init_attr,
+                      struct ib_udata *udata);
 int bnxt_re_modify_srq(struct ib_srq *srq, struct ib_srq_attr *srq_attr,
                       enum ib_srq_attr_mask srq_attr_mask,
                       struct ib_udata *udata);
 int bnxt_re_query_srq(struct ib_srq *srq, struct ib_srq_attr *srq_attr);
-int bnxt_re_destroy_srq(struct ib_srq *srq, struct ib_udata *udata);
+void bnxt_re_destroy_srq(struct ib_srq *srq, struct ib_udata *udata);
 int bnxt_re_post_srq_recv(struct ib_srq *srq, const struct ib_recv_wr *recv_wr,
                          const struct ib_recv_wr **bad_recv_wr);
 struct ib_qp *bnxt_re_create_qp(struct ib_pd *pd,
index ec22853f836384dd9e4778e205394cf1136d6ea8..bbdfbbf5e9a53ac4fca3d556e8203036bbd38092 100644 (file)
@@ -639,6 +639,7 @@ static const struct ib_device_ops bnxt_re_dev_ops = {
        .req_notify_cq = bnxt_re_req_notify_cq,
        INIT_RDMA_OBJ_SIZE(ib_ah, bnxt_re_ah, ib_ah),
        INIT_RDMA_OBJ_SIZE(ib_pd, bnxt_re_pd, ib_pd),
+       INIT_RDMA_OBJ_SIZE(ib_srq, bnxt_re_srq, ib_srq),
        INIT_RDMA_OBJ_SIZE(ib_ucontext, bnxt_re_ucontext, ib_uctx),
 };
 
index f034cab303f62d0044f5cc8067761f4a64fad2b7..958c1ff9c515c46767f2a3a1d03a1687671ebf61 100644 (file)
@@ -507,7 +507,7 @@ static void bnxt_qplib_arm_srq(struct bnxt_qplib_srq *srq, u32 arm_type)
        writeq(val, db);
 }
 
-int bnxt_qplib_destroy_srq(struct bnxt_qplib_res *res,
+void bnxt_qplib_destroy_srq(struct bnxt_qplib_res *res,
                           struct bnxt_qplib_srq *srq)
 {
        struct bnxt_qplib_rcfw *rcfw = res->rcfw;
@@ -521,14 +521,12 @@ int bnxt_qplib_destroy_srq(struct bnxt_qplib_res *res,
        /* Configure the request */
        req.srq_cid = cpu_to_le32(srq->id);
 
-       rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req,
-                                         (void *)&resp, NULL, 0);
+       rc = bnxt_qplib_rcfw_send_message(rcfw, (struct cmdq_base *)&req,
+                                         (struct creq_base *)&resp, NULL, 0);
+       kfree(srq->swq);
        if (rc)
-               return rc;
-
+               return;
        bnxt_qplib_free_hwq(res->pdev, &srq->hwq);
-       kfree(srq->swq);
-       return 0;
 }
 
 int bnxt_qplib_create_srq(struct bnxt_qplib_res *res,
index 31436af2a4ecb5319c80235c13d94544e1d6dabf..99e0a13cbefaf46abe06558e713e36e2a40793e9 100644 (file)
@@ -518,8 +518,8 @@ int bnxt_qplib_modify_srq(struct bnxt_qplib_res *res,
                          struct bnxt_qplib_srq *srq);
 int bnxt_qplib_query_srq(struct bnxt_qplib_res *res,
                         struct bnxt_qplib_srq *srq);
-int bnxt_qplib_destroy_srq(struct bnxt_qplib_res *res,
-                          struct bnxt_qplib_srq *srq);
+void bnxt_qplib_destroy_srq(struct bnxt_qplib_res *res,
+                           struct bnxt_qplib_srq *srq);
 int bnxt_qplib_post_srq_recv(struct bnxt_qplib_srq *srq,
                             struct bnxt_qplib_swqe *wqe);
 int bnxt_qplib_create_qp1(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp);
index 4b721a2610537d7f54c0b3e560f0f9e03ab001d6..916ef982172e96f919eca838fe0a52c165a56c43 100644 (file)
@@ -1000,10 +1000,9 @@ int c4iw_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags);
 int c4iw_modify_srq(struct ib_srq *ib_srq, struct ib_srq_attr *attr,
                    enum ib_srq_attr_mask srq_attr_mask,
                    struct ib_udata *udata);
-int c4iw_destroy_srq(struct ib_srq *ib_srq, struct ib_udata *udata);
-struct ib_srq *c4iw_create_srq(struct ib_pd *pd,
-                              struct ib_srq_init_attr *attrs,
-                              struct ib_udata *udata);
+void c4iw_destroy_srq(struct ib_srq *ib_srq, struct ib_udata *udata);
+int c4iw_create_srq(struct ib_srq *srq, struct ib_srq_init_attr *attrs,
+                   struct ib_udata *udata);
 int c4iw_destroy_qp(struct ib_qp *ib_qp, struct ib_udata *udata);
 struct ib_qp *c4iw_create_qp(struct ib_pd *pd,
                             struct ib_qp_init_attr *attrs,
index 0fbad47661cc5c73362f7eeb4c6d49b1ec171549..74ffc24321cd27908173c99d3137929098e5f2db 100644 (file)
@@ -545,6 +545,7 @@ static const struct ib_device_ops c4iw_dev_ops = {
        .reg_user_mr = c4iw_reg_user_mr,
        .req_notify_cq = c4iw_arm_cq,
        INIT_RDMA_OBJ_SIZE(ib_pd, c4iw_pd, ibpd),
+       INIT_RDMA_OBJ_SIZE(ib_srq, c4iw_srq, ibsrq),
        INIT_RDMA_OBJ_SIZE(ib_ucontext, c4iw_ucontext, ibucontext),
 };
 
index 63780e6efaceeb15bbc60490394bc2c78dbbe73c..9c8962d7bf97d3e24c1f4f5677d083b4ddeb1ae1 100644 (file)
@@ -2683,11 +2683,12 @@ void c4iw_copy_wr_to_srq(struct t4_srq *srq, union t4_recv_wr *wqe, u8 len16)
        }
 }
 
-struct ib_srq *c4iw_create_srq(struct ib_pd *pd, struct ib_srq_init_attr *attrs,
+int c4iw_create_srq(struct ib_srq *ib_srq, struct ib_srq_init_attr *attrs,
                               struct ib_udata *udata)
 {
+       struct ib_pd *pd = ib_srq->pd;
        struct c4iw_dev *rhp;
-       struct c4iw_srq *srq;
+       struct c4iw_srq *srq = to_c4iw_srq(ib_srq);
        struct c4iw_pd *php;
        struct c4iw_create_srq_resp uresp;
        struct c4iw_ucontext *ucontext;
@@ -2702,11 +2703,11 @@ struct ib_srq *c4iw_create_srq(struct ib_pd *pd, struct ib_srq_init_attr *attrs,
        rhp = php->rhp;
 
        if (!rhp->rdev.lldi.vr->srq.size)
-               return ERR_PTR(-EINVAL);
+               return -EINVAL;
        if (attrs->attr.max_wr > rhp->rdev.hw_queue.t4_max_rq_size)
-               return ERR_PTR(-E2BIG);
+               return -E2BIG;
        if (attrs->attr.max_sge > T4_MAX_RECV_SGE)
-               return ERR_PTR(-E2BIG);
+               return -E2BIG;
 
        /*
         * SRQ RQT and RQ must be a power of 2 and at least 16 deep.
@@ -2717,15 +2718,9 @@ struct ib_srq *c4iw_create_srq(struct ib_pd *pd, struct ib_srq_init_attr *attrs,
        ucontext = rdma_udata_to_drv_context(udata, struct c4iw_ucontext,
                                             ibucontext);
 
-       srq = kzalloc(sizeof(*srq), GFP_KERNEL);
-       if (!srq)
-               return ERR_PTR(-ENOMEM);
-
        srq->wr_waitp = c4iw_alloc_wr_wait(GFP_KERNEL);
-       if (!srq->wr_waitp) {
-               ret = -ENOMEM;
-               goto err_free_srq;
-       }
+       if (!srq->wr_waitp)
+               return -ENOMEM;
 
        srq->idx = c4iw_alloc_srq_idx(&rhp->rdev);
        if (srq->idx < 0) {
@@ -2805,7 +2800,8 @@ struct ib_srq *c4iw_create_srq(struct ib_pd *pd, struct ib_srq_init_attr *attrs,
                        (unsigned long)srq->wq.memsize, attrs->attr.max_wr);
 
        spin_lock_init(&srq->lock);
-       return &srq->ibsrq;
+       return 0;
+
 err_free_srq_db_key_mm:
        kfree(srq_db_key_mm);
 err_free_srq_key_mm:
@@ -2821,12 +2817,10 @@ struct ib_srq *c4iw_create_srq(struct ib_pd *pd, struct ib_srq_init_attr *attrs,
        c4iw_free_srq_idx(&rhp->rdev, srq->idx);
 err_free_wr_wait:
        c4iw_put_wr_wait(srq->wr_waitp);
-err_free_srq:
-       kfree(srq);
-       return ERR_PTR(ret);
+       return ret;
 }
 
-int c4iw_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
+void c4iw_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
 {
        struct c4iw_dev *rhp;
        struct c4iw_srq *srq;
@@ -2844,6 +2838,4 @@ int c4iw_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
                       srq->wr_waitp);
        c4iw_free_srq_idx(&rhp->rdev, srq->idx);
        c4iw_put_wr_wait(srq->wr_waitp);
-       kfree(srq);
-       return 0;
 }
index e424dcca2c74756de702db31318256eb33e0a39d..88a5a9ac7350d264ce2b6a00d5e49f99997e8178 100644 (file)
@@ -1142,13 +1142,13 @@ int hns_roce_buf_alloc(struct hns_roce_dev *hr_dev, u32 size, u32 max_direct,
 int hns_roce_ib_umem_write_mtt(struct hns_roce_dev *hr_dev,
                               struct hns_roce_mtt *mtt, struct ib_umem *umem);
 
-struct ib_srq *hns_roce_create_srq(struct ib_pd *pd,
-                                  struct ib_srq_init_attr *srq_init_attr,
-                                  struct ib_udata *udata);
+int hns_roce_create_srq(struct ib_srq *srq,
+                       struct ib_srq_init_attr *srq_init_attr,
+                       struct ib_udata *udata);
 int hns_roce_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *srq_attr,
                        enum ib_srq_attr_mask srq_attr_mask,
                        struct ib_udata *udata);
-int hns_roce_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata);
+void hns_roce_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata);
 
 struct ib_qp *hns_roce_create_qp(struct ib_pd *ib_pd,
                                 struct ib_qp_init_attr *init_attr,
index 176bade523ea9601a2101c699e1aeef8a36a3921..e85b31a72eea76356fe5fbf4cdae34f84e715ecc 100644 (file)
@@ -491,6 +491,8 @@ static const struct ib_device_ops hns_roce_dev_frmr_ops = {
 static const struct ib_device_ops hns_roce_dev_srq_ops = {
        .create_srq = hns_roce_create_srq,
        .destroy_srq = hns_roce_destroy_srq,
+
+       INIT_RDMA_OBJ_SIZE(ib_srq, hns_roce_srq, ibsrq),
 };
 
 static int hns_roce_register_device(struct hns_roce_dev *hr_dev)
index 5874dbb391fd3f7661275279da0678c84ae12c20..b3421b1f21e0354ddce8bae155c43bb9d38a862f 100644 (file)
@@ -206,13 +206,13 @@ static int hns_roce_create_idx_que(struct ib_pd *pd, struct hns_roce_srq *srq,
        return 0;
 }
 
-struct ib_srq *hns_roce_create_srq(struct ib_pd *pd,
-                                  struct ib_srq_init_attr *srq_init_attr,
-                                  struct ib_udata *udata)
+int hns_roce_create_srq(struct ib_srq *ib_srq,
+                       struct ib_srq_init_attr *srq_init_attr,
+                       struct ib_udata *udata)
 {
-       struct hns_roce_dev *hr_dev = to_hr_dev(pd->device);
+       struct hns_roce_dev *hr_dev = to_hr_dev(ib_srq->device);
        struct hns_roce_ib_create_srq_resp resp = {};
-       struct hns_roce_srq *srq;
+       struct hns_roce_srq *srq = to_hr_srq(ib_srq);
        int srq_desc_size;
        int srq_buf_size;
        u32 page_shift;
@@ -223,11 +223,7 @@ struct ib_srq *hns_roce_create_srq(struct ib_pd *pd,
        /* Check the actual SRQ wqe and SRQ sge num */
        if (srq_init_attr->attr.max_wr >= hr_dev->caps.max_srq_wrs ||
            srq_init_attr->attr.max_sge > hr_dev->caps.max_srq_sges)
-               return ERR_PTR(-EINVAL);
-
-       srq = kzalloc(sizeof(*srq), GFP_KERNEL);
-       if (!srq)
-               return ERR_PTR(-ENOMEM);
+               return -EINVAL;
 
        mutex_init(&srq->mutex);
        spin_lock_init(&srq->lock);
@@ -249,17 +245,13 @@ struct ib_srq *hns_roce_create_srq(struct ib_pd *pd,
        if (udata) {
                struct hns_roce_ib_create_srq  ucmd;
 
-               if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd))) {
-                       ret = -EFAULT;
-                       goto err_srq;
-               }
+               if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd)))
+                       return -EFAULT;
 
                srq->umem =
                        ib_umem_get(udata, ucmd.buf_addr, srq_buf_size, 0, 0);
-               if (IS_ERR(srq->umem)) {
-                       ret = PTR_ERR(srq->umem);
-                       goto err_srq;
-               }
+               if (IS_ERR(srq->umem))
+                       return PTR_ERR(srq->umem);
 
                if (hr_dev->caps.srqwqe_buf_pg_sz) {
                        npages = (ib_umem_page_count(srq->umem) +
@@ -321,11 +313,9 @@ struct ib_srq *hns_roce_create_srq(struct ib_pd *pd,
        } else {
                page_shift = PAGE_SHIFT + hr_dev->caps.srqwqe_buf_pg_sz;
                if (hns_roce_buf_alloc(hr_dev, srq_buf_size,
-                                     (1 << page_shift) * 2,
-                                     &srq->buf, page_shift)) {
-                       ret = -ENOMEM;
-                       goto err_srq;
-               }
+                                      (1 << page_shift) * 2, &srq->buf,
+                                      page_shift))
+                       return -ENOMEM;
 
                srq->head = 0;
                srq->tail = srq->max - 1;
@@ -340,7 +330,7 @@ struct ib_srq *hns_roce_create_srq(struct ib_pd *pd,
                        goto err_srq_mtt;
 
                page_shift = PAGE_SHIFT + hr_dev->caps.idx_buf_pg_sz;
-               ret = hns_roce_create_idx_que(pd, srq, page_shift);
+               ret = hns_roce_create_idx_que(ib_srq->pd, srq, page_shift);
                if (ret) {
                        dev_err(hr_dev->dev, "Create idx queue fail(%d)!\n",
                                ret);
@@ -372,7 +362,7 @@ struct ib_srq *hns_roce_create_srq(struct ib_pd *pd,
 
        srq->db_reg_l = hr_dev->reg_base + SRQ_DB_REG;
 
-       ret = hns_roce_srq_alloc(hr_dev, to_hr_pd(pd)->pdn, cqn, 0,
+       ret = hns_roce_srq_alloc(hr_dev, to_hr_pd(ib_srq->pd)->pdn, cqn, 0,
                                 &srq->mtt, 0, srq);
        if (ret)
                goto err_wrid;
@@ -389,7 +379,7 @@ struct ib_srq *hns_roce_create_srq(struct ib_pd *pd,
                }
        }
 
-       return &srq->ibsrq;
+       return 0;
 
 err_srqc_alloc:
        hns_roce_srq_free(hr_dev, srq);
@@ -418,12 +408,10 @@ struct ib_srq *hns_roce_create_srq(struct ib_pd *pd,
        else
                hns_roce_buf_free(hr_dev, srq_buf_size, &srq->buf);
 
-err_srq:
-       kfree(srq);
-       return ERR_PTR(ret);
+       return ret;
 }
 
-int hns_roce_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
+void hns_roce_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
 {
        struct hns_roce_dev *hr_dev = to_hr_dev(ibsrq->device);
        struct hns_roce_srq *srq = to_hr_srq(ibsrq);
@@ -440,10 +428,6 @@ int hns_roce_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
                hns_roce_buf_free(hr_dev, srq->max << srq->wqe_shift,
                                  &srq->buf);
        }
-
-       kfree(srq);
-
-       return 0;
 }
 
 int hns_roce_init_srq_table(struct hns_roce_dev *hr_dev)
index 27f38897ca9e87d928d6d91cccc329c65e86bf93..25d09d53b51c429915d7e6f26b5981dc2d461896 100644 (file)
@@ -2561,6 +2561,7 @@ static const struct ib_device_ops mlx4_ib_dev_ops = {
 
        INIT_RDMA_OBJ_SIZE(ib_ah, mlx4_ib_ah, ibah),
        INIT_RDMA_OBJ_SIZE(ib_pd, mlx4_ib_pd, ibpd),
+       INIT_RDMA_OBJ_SIZE(ib_srq, mlx4_ib_srq, ibsrq),
        INIT_RDMA_OBJ_SIZE(ib_ucontext, mlx4_ib_ucontext, ibucontext),
 };
 
index 14ca042ea7156b6b4303a7be9a33358f3bf1d82f..26897102057d2739b71fe68a85be6a38f2222ceb 100644 (file)
@@ -759,13 +759,12 @@ int mlx4_ib_create_ah_slave(struct ib_ah *ah, struct rdma_ah_attr *ah_attr,
 int mlx4_ib_query_ah(struct ib_ah *ibah, struct rdma_ah_attr *ah_attr);
 void mlx4_ib_destroy_ah(struct ib_ah *ah, u32 flags);
 
-struct ib_srq *mlx4_ib_create_srq(struct ib_pd *pd,
-                                 struct ib_srq_init_attr *init_attr,
-                                 struct ib_udata *udata);
+int mlx4_ib_create_srq(struct ib_srq *srq, struct ib_srq_init_attr *init_attr,
+                      struct ib_udata *udata);
 int mlx4_ib_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
                       enum ib_srq_attr_mask attr_mask, struct ib_udata *udata);
 int mlx4_ib_query_srq(struct ib_srq *srq, struct ib_srq_attr *srq_attr);
-int mlx4_ib_destroy_srq(struct ib_srq *srq, struct ib_udata *udata);
+void mlx4_ib_destroy_srq(struct ib_srq *srq, struct ib_udata *udata);
 void mlx4_ib_free_srq_wqe(struct mlx4_ib_srq *srq, int wqe_index);
 int mlx4_ib_post_srq_recv(struct ib_srq *ibsrq, const struct ib_recv_wr *wr,
                          const struct ib_recv_wr **bad_wr);
index 94c3c334a6727fb7c8d3f183db72e04a4a6a2e04..4bf2946b9759e81139e66b412e49c4e697d24b22 100644 (file)
@@ -69,14 +69,14 @@ static void mlx4_ib_srq_event(struct mlx4_srq *srq, enum mlx4_event type)
        }
 }
 
-struct ib_srq *mlx4_ib_create_srq(struct ib_pd *pd,
-                                 struct ib_srq_init_attr *init_attr,
-                                 struct ib_udata *udata)
+int mlx4_ib_create_srq(struct ib_srq *ib_srq,
+                      struct ib_srq_init_attr *init_attr,
+                      struct ib_udata *udata)
 {
-       struct mlx4_ib_dev *dev = to_mdev(pd->device);
+       struct mlx4_ib_dev *dev = to_mdev(ib_srq->device);
        struct mlx4_ib_ucontext *ucontext = rdma_udata_to_drv_context(
                udata, struct mlx4_ib_ucontext, ibucontext);
-       struct mlx4_ib_srq *srq;
+       struct mlx4_ib_srq *srq = to_msrq(ib_srq);
        struct mlx4_wqe_srq_next_seg *next;
        struct mlx4_wqe_data_seg *scatter;
        u32 cqn;
@@ -89,11 +89,7 @@ struct ib_srq *mlx4_ib_create_srq(struct ib_pd *pd,
        /* Sanity check SRQ size before proceeding */
        if (init_attr->attr.max_wr  >= dev->dev->caps.max_srq_wqes ||
            init_attr->attr.max_sge >  dev->dev->caps.max_srq_sge)
-               return ERR_PTR(-EINVAL);
-
-       srq = kmalloc(sizeof *srq, GFP_KERNEL);
-       if (!srq)
-               return ERR_PTR(-ENOMEM);
+               return -EINVAL;
 
        mutex_init(&srq->mutex);
        spin_lock_init(&srq->lock);
@@ -111,16 +107,12 @@ struct ib_srq *mlx4_ib_create_srq(struct ib_pd *pd,
        if (udata) {
                struct mlx4_ib_create_srq ucmd;
 
-               if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd)) {
-                       err = -EFAULT;
-                       goto err_srq;
-               }
+               if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd)))
+                       return -EFAULT;
 
                srq->umem = ib_umem_get(udata, ucmd.buf_addr, buf_size, 0, 0);
-               if (IS_ERR(srq->umem)) {
-                       err = PTR_ERR(srq->umem);
-                       goto err_srq;
-               }
+               if (IS_ERR(srq->umem))
+                       return PTR_ERR(srq->umem);
 
                err = mlx4_mtt_init(dev->dev, ib_umem_page_count(srq->umem),
                                    srq->umem->page_shift, &srq->mtt);
@@ -137,7 +129,7 @@ struct ib_srq *mlx4_ib_create_srq(struct ib_pd *pd,
        } else {
                err = mlx4_db_alloc(dev->dev, &srq->db, 0);
                if (err)
-                       goto err_srq;
+                       return err;
 
                *srq->db.db = 0;
 
@@ -184,8 +176,8 @@ struct ib_srq *mlx4_ib_create_srq(struct ib_pd *pd,
        xrcdn = (init_attr->srq_type == IB_SRQT_XRC) ?
                to_mxrcd(init_attr->ext.xrc.xrcd)->xrcdn :
                (u16) dev->dev->caps.reserved_xrcds;
-       err = mlx4_srq_alloc(dev->dev, to_mpd(pd)->pdn, cqn, xrcdn, &srq->mtt,
-                            srq->db.dma, &srq->msrq);
+       err = mlx4_srq_alloc(dev->dev, to_mpd(ib_srq->pd)->pdn, cqn, xrcdn,
+                            &srq->mtt, srq->db.dma, &srq->msrq);
        if (err)
                goto err_wrid;
 
@@ -200,7 +192,7 @@ struct ib_srq *mlx4_ib_create_srq(struct ib_pd *pd,
 
        init_attr->attr.max_wr = srq->msrq.max - 1;
 
-       return &srq->ibsrq;
+       return 0;
 
 err_wrid:
        if (udata)
@@ -221,10 +213,7 @@ struct ib_srq *mlx4_ib_create_srq(struct ib_pd *pd,
        if (!udata)
                mlx4_db_free(dev->dev, &srq->db);
 
-err_srq:
-       kfree(srq);
-
-       return ERR_PTR(err);
+       return err;
 }
 
 int mlx4_ib_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
@@ -271,7 +260,7 @@ int mlx4_ib_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *srq_attr)
        return 0;
 }
 
-int mlx4_ib_destroy_srq(struct ib_srq *srq, struct ib_udata *udata)
+void mlx4_ib_destroy_srq(struct ib_srq *srq, struct ib_udata *udata)
 {
        struct mlx4_ib_dev *dev = to_mdev(srq->device);
        struct mlx4_ib_srq *msrq = to_msrq(srq);
@@ -293,10 +282,6 @@ int mlx4_ib_destroy_srq(struct ib_srq *srq, struct ib_udata *udata)
                              &msrq->buf);
                mlx4_db_free(dev->dev, &msrq->db);
        }
-
-       kfree(msrq);
-
-       return 0;
 }
 
 void mlx4_ib_free_srq_wqe(struct mlx4_ib_srq *srq, int wqe_index)
index f4827d12677ae2b60d80be5e06d218b18613c216..06578e8a9787b2ab3262f58a0db21f5c08d11515 100644 (file)
@@ -4795,19 +4795,21 @@ static int create_dev_resources(struct mlx5_ib_resources *devr)
        attr.ext.cq = devr->c0;
        attr.ext.xrc.xrcd = devr->x0;
 
-       devr->s0 = mlx5_ib_create_srq(devr->p0, &attr, NULL);
-       if (IS_ERR(devr->s0)) {
-               ret = PTR_ERR(devr->s0);
+       devr->s0 = rdma_zalloc_drv_obj(ibdev, ib_srq);
+       if (!devr->s0) {
+               ret = -ENOMEM;
                goto error4;
        }
+
        devr->s0->device        = &dev->ib_dev;
        devr->s0->pd            = devr->p0;
-       devr->s0->uobject       = NULL;
-       devr->s0->event_handler = NULL;
-       devr->s0->srq_context   = NULL;
        devr->s0->srq_type      = IB_SRQT_XRC;
        devr->s0->ext.xrc.xrcd  = devr->x0;
        devr->s0->ext.cq        = devr->c0;
+       ret = mlx5_ib_create_srq(devr->s0, &attr, NULL);
+       if (ret)
+               goto err_create;
+
        atomic_inc(&devr->s0->ext.xrc.xrcd->usecnt);
        atomic_inc(&devr->s0->ext.cq->usecnt);
        atomic_inc(&devr->p0->usecnt);
@@ -4817,18 +4819,21 @@ static int create_dev_resources(struct mlx5_ib_resources *devr)
        attr.attr.max_sge = 1;
        attr.attr.max_wr = 1;
        attr.srq_type = IB_SRQT_BASIC;
-       devr->s1 = mlx5_ib_create_srq(devr->p0, &attr, NULL);
-       if (IS_ERR(devr->s1)) {
-               ret = PTR_ERR(devr->s1);
+       devr->s1 = rdma_zalloc_drv_obj(ibdev, ib_srq);
+       if (!devr->s1) {
+               ret = -ENOMEM;
                goto error5;
        }
+
        devr->s1->device        = &dev->ib_dev;
        devr->s1->pd            = devr->p0;
-       devr->s1->uobject       = NULL;
-       devr->s1->event_handler = NULL;
-       devr->s1->srq_context   = NULL;
        devr->s1->srq_type      = IB_SRQT_BASIC;
        devr->s1->ext.cq        = devr->c0;
+
+       ret = mlx5_ib_create_srq(devr->s1, &attr, NULL);
+       if (ret)
+               goto error6;
+
        atomic_inc(&devr->p0->usecnt);
        atomic_set(&devr->s1->usecnt, 0);
 
@@ -4840,8 +4845,12 @@ static int create_dev_resources(struct mlx5_ib_resources *devr)
 
        return 0;
 
+error6:
+       kfree(devr->s1);
 error5:
        mlx5_ib_destroy_srq(devr->s0, NULL);
+err_create:
+       kfree(devr->s0);
 error4:
        mlx5_ib_dealloc_xrcd(devr->x1, NULL);
 error3:
@@ -4862,7 +4871,9 @@ static void destroy_dev_resources(struct mlx5_ib_resources *devr)
        int port;
 
        mlx5_ib_destroy_srq(devr->s1, NULL);
+       kfree(devr->s1);
        mlx5_ib_destroy_srq(devr->s0, NULL);
+       kfree(devr->s0);
        mlx5_ib_dealloc_xrcd(devr->x0, NULL);
        mlx5_ib_dealloc_xrcd(devr->x1, NULL);
        mlx5_ib_destroy_cq(devr->c0, NULL);
@@ -5989,6 +6000,7 @@ static const struct ib_device_ops mlx5_ib_dev_ops = {
 
        INIT_RDMA_OBJ_SIZE(ib_ah, mlx5_ib_ah, ibah),
        INIT_RDMA_OBJ_SIZE(ib_pd, mlx5_ib_pd, ibpd),
+       INIT_RDMA_OBJ_SIZE(ib_srq, mlx5_ib_srq, ibsrq),
        INIT_RDMA_OBJ_SIZE(ib_ucontext, mlx5_ib_ucontext, ibucontext),
 };
 
index 5b4206653fdb490f617513f57369822ec0d8cfc6..3e8d54618c7853ac4089b5418c7b89297588cb12 100644 (file)
@@ -1058,13 +1058,12 @@ int mlx5_ib_create_ah(struct ib_ah *ah, struct rdma_ah_attr *ah_attr, u32 flags,
                      struct ib_udata *udata);
 int mlx5_ib_query_ah(struct ib_ah *ibah, struct rdma_ah_attr *ah_attr);
 void mlx5_ib_destroy_ah(struct ib_ah *ah, u32 flags);
-struct ib_srq *mlx5_ib_create_srq(struct ib_pd *pd,
-                                 struct ib_srq_init_attr *init_attr,
-                                 struct ib_udata *udata);
+int mlx5_ib_create_srq(struct ib_srq *srq, struct ib_srq_init_attr *init_attr,
+                      struct ib_udata *udata);
 int mlx5_ib_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
                       enum ib_srq_attr_mask attr_mask, struct ib_udata *udata);
 int mlx5_ib_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *srq_attr);
-int mlx5_ib_destroy_srq(struct ib_srq *srq, struct ib_udata *udata);
+void mlx5_ib_destroy_srq(struct ib_srq *srq, struct ib_udata *udata);
 int mlx5_ib_post_srq_recv(struct ib_srq *ibsrq, const struct ib_recv_wr *wr,
                          const struct ib_recv_wr **bad_wr);
 int mlx5_ib_enable_lb(struct mlx5_ib_dev *dev, bool td, bool qp);
index 2e389f3444c6c1a7d8c864c75fd7678c8c08e580..4e7fde86c96b311708ddcdfdc5d8a58b678fc882 100644 (file)
@@ -214,16 +214,16 @@ static void destroy_srq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_srq *srq)
        mlx5_db_free(dev->mdev, &srq->db);
 }
 
-struct ib_srq *mlx5_ib_create_srq(struct ib_pd *pd,
-                                 struct ib_srq_init_attr *init_attr,
-                                 struct ib_udata *udata)
+int mlx5_ib_create_srq(struct ib_srq *ib_srq,
+                      struct ib_srq_init_attr *init_attr,
+                      struct ib_udata *udata)
 {
-       struct mlx5_ib_dev *dev = to_mdev(pd->device);
-       struct mlx5_ib_srq *srq;
+       struct mlx5_ib_dev *dev = to_mdev(ib_srq->device);
+       struct mlx5_ib_srq *srq = to_msrq(ib_srq);
        size_t desc_size;
        size_t buf_size;
        int err;
-       struct mlx5_srq_attr in = {0};
+       struct mlx5_srq_attr in = {};
        __u32 max_srq_wqes = 1 << MLX5_CAP_GEN(dev->mdev, log_max_srq_sz);
 
        /* Sanity check SRQ size before proceeding */
@@ -231,13 +231,9 @@ struct ib_srq *mlx5_ib_create_srq(struct ib_pd *pd,
                mlx5_ib_dbg(dev, "max_wr %d, cap %d\n",
                            init_attr->attr.max_wr,
                            max_srq_wqes);
-               return ERR_PTR(-EINVAL);
+               return -EINVAL;
        }
 
-       srq = kmalloc(sizeof(*srq), GFP_KERNEL);
-       if (!srq)
-               return ERR_PTR(-ENOMEM);
-
        mutex_init(&srq->mutex);
        spin_lock_init(&srq->lock);
        srq->msrq.max    = roundup_pow_of_two(init_attr->attr.max_wr + 1);
@@ -245,35 +241,32 @@ struct ib_srq *mlx5_ib_create_srq(struct ib_pd *pd,
 
        desc_size = sizeof(struct mlx5_wqe_srq_next_seg) +
                    srq->msrq.max_gs * sizeof(struct mlx5_wqe_data_seg);
-       if (desc_size == 0 || srq->msrq.max_gs > desc_size) {
-               err = -EINVAL;
-               goto err_srq;
-       }
+       if (desc_size == 0 || srq->msrq.max_gs > desc_size)
+               return -EINVAL;
+
        desc_size = roundup_pow_of_two(desc_size);
        desc_size = max_t(size_t, 32, desc_size);
-       if (desc_size < sizeof(struct mlx5_wqe_srq_next_seg)) {
-               err = -EINVAL;
-               goto err_srq;
-       }
+       if (desc_size < sizeof(struct mlx5_wqe_srq_next_seg))
+               return -EINVAL;
+
        srq->msrq.max_avail_gather = (desc_size - sizeof(struct mlx5_wqe_srq_next_seg)) /
                sizeof(struct mlx5_wqe_data_seg);
        srq->msrq.wqe_shift = ilog2(desc_size);
        buf_size = srq->msrq.max * desc_size;
-       if (buf_size < desc_size) {
-               err = -EINVAL;
-               goto err_srq;
-       }
+       if (buf_size < desc_size)
+               return -EINVAL;
+
        in.type = init_attr->srq_type;
 
        if (udata)
-               err = create_srq_user(pd, srq, &in, udata, buf_size);
+               err = create_srq_user(ib_srq->pd, srq, &in, udata, buf_size);
        else
                err = create_srq_kernel(dev, srq, &in, buf_size);
 
        if (err) {
                mlx5_ib_warn(dev, "create srq %s failed, err %d\n",
                             udata ? "user" : "kernel", err);
-               goto err_srq;
+               return err;
        }
 
        in.log_size = ilog2(srq->msrq.max);
@@ -303,7 +296,7 @@ struct ib_srq *mlx5_ib_create_srq(struct ib_pd *pd,
        else
                in.cqn = to_mcq(dev->devr.c0)->mcq.cqn;
 
-       in.pd = to_mpd(pd)->pdn;
+       in.pd = to_mpd(ib_srq->pd)->pdn;
        in.db_record = srq->db.dma;
        err = mlx5_cmd_create_srq(dev, &srq->msrq, &in);
        kvfree(in.pas);
@@ -326,21 +319,18 @@ struct ib_srq *mlx5_ib_create_srq(struct ib_pd *pd,
 
        init_attr->attr.max_wr = srq->msrq.max - 1;
 
-       return &srq->ibsrq;
+       return 0;
 
 err_core:
        mlx5_cmd_destroy_srq(dev, &srq->msrq);
 
 err_usr_kern_srq:
        if (udata)
-               destroy_srq_user(pd, srq, udata);
+               destroy_srq_user(ib_srq->pd, srq, udata);
        else
                destroy_srq_kernel(dev, srq);
 
-err_srq:
-       kfree(srq);
-
-       return ERR_PTR(err);
+       return err;
 }
 
 int mlx5_ib_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
@@ -393,7 +383,7 @@ int mlx5_ib_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *srq_attr)
        return ret;
 }
 
-int mlx5_ib_destroy_srq(struct ib_srq *srq, struct ib_udata *udata)
+void mlx5_ib_destroy_srq(struct ib_srq *srq, struct ib_udata *udata)
 {
        struct mlx5_ib_dev *dev = to_mdev(srq->device);
        struct mlx5_ib_srq *msrq = to_msrq(srq);
@@ -411,9 +401,6 @@ int mlx5_ib_destroy_srq(struct ib_srq *srq, struct ib_udata *udata)
        } else {
                destroy_srq_kernel(dev, msrq);
        }
-
-       kfree(srq);
-       return 0;
 }
 
 void mlx5_ib_free_srq_wqe(struct mlx5_ib_srq *srq, int wqe_index)
index 2c3627b2509d964e623305cbd34b39e0e6a38575..af197c36d7577b32eb5dcf620c589f7dad7e4904 100644 (file)
@@ -56,7 +56,7 @@ struct mlx5_srq_table {
 
 int mlx5_cmd_create_srq(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq,
                        struct mlx5_srq_attr *in);
-int mlx5_cmd_destroy_srq(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq);
+void mlx5_cmd_destroy_srq(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq);
 int mlx5_cmd_query_srq(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq,
                       struct mlx5_srq_attr *out);
 int mlx5_cmd_arm_srq(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq,
index 1e04319684f4e15cb49c5e2a4e8e685f5733bfdd..b0d0687c7a686571a0cd8aa043282f80dadc76c5 100644 (file)
@@ -607,7 +607,7 @@ int mlx5_cmd_create_srq(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq,
        return err;
 }
 
-int mlx5_cmd_destroy_srq(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq)
+void mlx5_cmd_destroy_srq(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq)
 {
        struct mlx5_srq_table *table = &dev->srq_table;
        struct mlx5_core_srq *tmp;
@@ -615,16 +615,14 @@ int mlx5_cmd_destroy_srq(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq)
 
        tmp = xa_erase_irq(&table->array, srq->srqn);
        if (!tmp || tmp != srq)
-               return -EINVAL;
+               return;
 
        err = destroy_srq_split(dev, srq);
        if (err)
-               return err;
+               return;
 
        mlx5_core_res_put(&srq->common);
        wait_for_completion(&srq->common.free);
-
-       return 0;
 }
 
 int mlx5_cmd_query_srq(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq,
index 6fc371a9e45fcefda043690a8665617d4522b907..4f40dfedf9208149a992a4e7c511c29dea9a4bcb 100644 (file)
@@ -403,65 +403,53 @@ static void mthca_ah_destroy(struct ib_ah *ah, u32 flags)
        mthca_destroy_ah(to_mdev(ah->device), to_mah(ah));
 }
 
-static struct ib_srq *mthca_create_srq(struct ib_pd *pd,
-                                      struct ib_srq_init_attr *init_attr,
-                                      struct ib_udata *udata)
+static int mthca_create_srq(struct ib_srq *ibsrq,
+                           struct ib_srq_init_attr *init_attr,
+                           struct ib_udata *udata)
 {
        struct mthca_create_srq ucmd;
        struct mthca_ucontext *context = rdma_udata_to_drv_context(
                udata, struct mthca_ucontext, ibucontext);
-       struct mthca_srq *srq;
+       struct mthca_srq *srq = to_msrq(ibsrq);
        int err;
 
        if (init_attr->srq_type != IB_SRQT_BASIC)
-               return ERR_PTR(-EOPNOTSUPP);
-
-       srq = kmalloc(sizeof *srq, GFP_KERNEL);
-       if (!srq)
-               return ERR_PTR(-ENOMEM);
+               return -EOPNOTSUPP;
 
        if (udata) {
-               if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd)) {
-                       err = -EFAULT;
-                       goto err_free;
-               }
+               if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd)))
+                       return -EFAULT;
 
-               err = mthca_map_user_db(to_mdev(pd->device), &context->uar,
+               err = mthca_map_user_db(to_mdev(ibsrq->device), &context->uar,
                                        context->db_tab, ucmd.db_index,
                                        ucmd.db_page);
 
                if (err)
-                       goto err_free;
+                       return err;
 
                srq->mr.ibmr.lkey = ucmd.lkey;
                srq->db_index     = ucmd.db_index;
        }
 
-       err = mthca_alloc_srq(to_mdev(pd->device), to_mpd(pd),
+       err = mthca_alloc_srq(to_mdev(ibsrq->device), to_mpd(ibsrq->pd),
                              &init_attr->attr, srq, udata);
 
        if (err && udata)
-               mthca_unmap_user_db(to_mdev(pd->device), &context->uar,
+               mthca_unmap_user_db(to_mdev(ibsrq->device), &context->uar,
                                    context->db_tab, ucmd.db_index);
 
        if (err)
-               goto err_free;
+               return err;
 
-       if (context && ib_copy_to_udata(udata, &srq->srqn, sizeof (__u32))) {
-               mthca_free_srq(to_mdev(pd->device), srq);
-               err = -EFAULT;
-               goto err_free;
+       if (context && ib_copy_to_udata(udata, &srq->srqn, sizeof(__u32))) {
+               mthca_free_srq(to_mdev(ibsrq->device), srq);
+               return -EFAULT;
        }
 
-       return &srq->ibsrq;
-
-err_free:
-       kfree(srq);
-
-       return ERR_PTR(err);
+       return 0;
 }
 
-static int mthca_destroy_srq(struct ib_srq *srq, struct ib_udata *udata)
+static void mthca_destroy_srq(struct ib_srq *srq, struct ib_udata *udata)
 {
        if (udata) {
                struct mthca_ucontext *context =
@@ -475,9 +463,6 @@ static int mthca_destroy_srq(struct ib_srq *srq, struct ib_udata *udata)
        }
 
        mthca_free_srq(to_mdev(srq->device), to_msrq(srq));
-       kfree(srq);
-
-       return 0;
 }
 
 static struct ib_qp *mthca_create_qp(struct ib_pd *pd,
@@ -1210,6 +1195,8 @@ static const struct ib_device_ops mthca_dev_arbel_srq_ops = {
        .modify_srq = mthca_modify_srq,
        .post_srq_recv = mthca_arbel_post_srq_recv,
        .query_srq = mthca_query_srq,
+
+       INIT_RDMA_OBJ_SIZE(ib_srq, mthca_srq, ibsrq),
 };
 
 static const struct ib_device_ops mthca_dev_tavor_srq_ops = {
@@ -1218,6 +1205,8 @@ static const struct ib_device_ops mthca_dev_tavor_srq_ops = {
        .modify_srq = mthca_modify_srq,
        .post_srq_recv = mthca_tavor_post_srq_recv,
        .query_srq = mthca_query_srq,
+
+       INIT_RDMA_OBJ_SIZE(ib_srq, mthca_srq, ibsrq),
 };
 
 static const struct ib_device_ops mthca_dev_arbel_fmr_ops = {
index e693eb352959c3d647c0589cc2126273cb251929..5d96b5a945832bad1f74a58d3e570cadd283c74e 100644 (file)
@@ -2863,21 +2863,19 @@ int ocrdma_mbx_query_srq(struct ocrdma_srq *srq, struct ib_srq_attr *srq_attr)
        return status;
 }
 
-int ocrdma_mbx_destroy_srq(struct ocrdma_dev *dev, struct ocrdma_srq *srq)
+void ocrdma_mbx_destroy_srq(struct ocrdma_dev *dev, struct ocrdma_srq *srq)
 {
-       int status = -ENOMEM;
        struct ocrdma_destroy_srq *cmd;
        struct pci_dev *pdev = dev->nic_info.pdev;
        cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_DELETE_SRQ, sizeof(*cmd));
        if (!cmd)
-               return status;
+               return;
        cmd->id = srq->id;
-       status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd);
+       ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd);
        if (srq->rq.va)
                dma_free_coherent(&pdev->dev, srq->rq.len,
                                  srq->rq.va, srq->rq.pa);
        kfree(cmd);
-       return status;
 }
 
 static int ocrdma_mbx_get_dcbx_config(struct ocrdma_dev *dev, u32 ptype,
index 88d45aa19ded98f0cd0c1b0c26318f21ef4e5e21..06ec59326a90fdce71716463074a998973d561ad 100644 (file)
@@ -137,7 +137,7 @@ int ocrdma_mbx_create_srq(struct ocrdma_dev *, struct ocrdma_srq *,
                          struct ocrdma_pd *);
 int ocrdma_mbx_modify_srq(struct ocrdma_srq *, struct ib_srq_attr *);
 int ocrdma_mbx_query_srq(struct ocrdma_srq *, struct ib_srq_attr *);
-int ocrdma_mbx_destroy_srq(struct ocrdma_dev *, struct ocrdma_srq *);
+void ocrdma_mbx_destroy_srq(struct ocrdma_dev *dev, struct ocrdma_srq *srq);
 
 int ocrdma_alloc_av(struct ocrdma_dev *dev, struct ocrdma_ah *ah);
 void ocrdma_free_av(struct ocrdma_dev *dev, struct ocrdma_ah *ah);
index 8642a2e60be7a3a85b9717d2b053bb72fbacb771..34d3d59f3ca755ad550abe53ec928263c26ef7e5 100644 (file)
@@ -191,6 +191,8 @@ static const struct ib_device_ops ocrdma_dev_srq_ops = {
        .modify_srq = ocrdma_modify_srq,
        .post_srq_recv = ocrdma_post_srq_recv,
        .query_srq = ocrdma_query_srq,
+
+       INIT_RDMA_OBJ_SIZE(ib_srq, ocrdma_srq, ibsrq),
 };
 
 static int ocrdma_register_device(struct ocrdma_dev *dev)
index cf7aeb963dce9e215b65e3ee7e47015b62d23785..ffdd3ac550869ef685a8c7d34fb39383558d022e 100644 (file)
@@ -1805,45 +1805,43 @@ static int ocrdma_copy_srq_uresp(struct ocrdma_dev *dev, struct ocrdma_srq *srq,
        return status;
 }
 
-struct ib_srq *ocrdma_create_srq(struct ib_pd *ibpd,
-                                struct ib_srq_init_attr *init_attr,
-                                struct ib_udata *udata)
+int ocrdma_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *init_attr,
+                     struct ib_udata *udata)
 {
-       int status = -ENOMEM;
-       struct ocrdma_pd *pd = get_ocrdma_pd(ibpd);
-       struct ocrdma_dev *dev = get_ocrdma_dev(ibpd->device);
-       struct ocrdma_srq *srq;
+       int status;
+       struct ocrdma_pd *pd = get_ocrdma_pd(ibsrq->pd);
+       struct ocrdma_dev *dev = get_ocrdma_dev(ibsrq->device);
+       struct ocrdma_srq *srq = get_ocrdma_srq(ibsrq);
 
        if (init_attr->attr.max_sge > dev->attr.max_recv_sge)
-               return ERR_PTR(-EINVAL);
+               return -EINVAL;
        if (init_attr->attr.max_wr > dev->attr.max_rqe)
-               return ERR_PTR(-EINVAL);
-
-       srq = kzalloc(sizeof(*srq), GFP_KERNEL);
-       if (!srq)
-               return ERR_PTR(status);
+               return -EINVAL;
 
        spin_lock_init(&srq->q_lock);
        srq->pd = pd;
        srq->db = dev->nic_info.db + (pd->id * dev->nic_info.db_page_size);
        status = ocrdma_mbx_create_srq(dev, srq, init_attr, pd);
        if (status)
-               goto err;
+               return status;
 
-       if (udata == NULL) {
-               status = -ENOMEM;
+       if (!udata) {
                srq->rqe_wr_id_tbl = kcalloc(srq->rq.max_cnt, sizeof(u64),
                                             GFP_KERNEL);
-               if (srq->rqe_wr_id_tbl == NULL)
+               if (!srq->rqe_wr_id_tbl) {
+                       status = -ENOMEM;
                        goto arm_err;
+               }
 
                srq->bit_fields_len = (srq->rq.max_cnt / 32) +
                    (srq->rq.max_cnt % 32 ? 1 : 0);
                srq->idx_bit_fields =
                    kmalloc_array(srq->bit_fields_len, sizeof(u32),
                                  GFP_KERNEL);
-               if (srq->idx_bit_fields == NULL)
+               if (!srq->idx_bit_fields) {
+                       status = -ENOMEM;
                        goto arm_err;
+               }
                memset(srq->idx_bit_fields, 0xff,
                       srq->bit_fields_len * sizeof(u32));
        }
@@ -1860,15 +1858,13 @@ struct ib_srq *ocrdma_create_srq(struct ib_pd *ibpd,
                        goto arm_err;
        }
 
-       return &srq->ibsrq;
+       return 0;
 
 arm_err:
        ocrdma_mbx_destroy_srq(dev, srq);
-err:
        kfree(srq->rqe_wr_id_tbl);
        kfree(srq->idx_bit_fields);
-       kfree(srq);
-       return ERR_PTR(status);
+       return status;
 }
 
 int ocrdma_modify_srq(struct ib_srq *ibsrq,
@@ -1897,15 +1893,14 @@ int ocrdma_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *srq_attr)
        return status;
 }
 
-int ocrdma_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
+void ocrdma_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
 {
-       int status;
        struct ocrdma_srq *srq;
        struct ocrdma_dev *dev = get_ocrdma_dev(ibsrq->device);
 
        srq = get_ocrdma_srq(ibsrq);
 
-       status = ocrdma_mbx_destroy_srq(dev, srq);
+       ocrdma_mbx_destroy_srq(dev, srq);
 
        if (srq->pd->uctx)
                ocrdma_del_mmap(srq->pd->uctx, (u64) srq->rq.pa,
@@ -1913,8 +1908,6 @@ int ocrdma_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
 
        kfree(srq->idx_bit_fields);
        kfree(srq->rqe_wr_id_tbl);
-       kfree(srq);
-       return status;
 }
 
 /* unprivileged verbs and their support functions. */
index dfdebe4e48e6b56825a67c3635b6f071e4703042..c6489a1439dcb9348b67e558eaee6cd0ba86887f 100644 (file)
@@ -91,12 +91,12 @@ int ocrdma_query_qp(struct ib_qp *,
 int ocrdma_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata);
 void ocrdma_del_flush_qp(struct ocrdma_qp *qp);
 
-struct ib_srq *ocrdma_create_srq(struct ib_pd *, struct ib_srq_init_attr *,
-                                struct ib_udata *);
+int ocrdma_create_srq(struct ib_srq *srq, struct ib_srq_init_attr *attr,
+                     struct ib_udata *udata);
 int ocrdma_modify_srq(struct ib_srq *, struct ib_srq_attr *,
                      enum ib_srq_attr_mask, struct ib_udata *);
 int ocrdma_query_srq(struct ib_srq *, struct ib_srq_attr *);
-int ocrdma_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata);
+void ocrdma_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata);
 int ocrdma_post_srq_recv(struct ib_srq *, const struct ib_recv_wr *,
                         const struct ib_recv_wr **bad_recv_wr);
 
index f32ea7052c480914ed38d68d712510726d02795f..cbcdc5c669c67c47c29abfdf24e05ef06a74d415 100644 (file)
@@ -241,6 +241,7 @@ static const struct ib_device_ops qedr_dev_ops = {
 
        INIT_RDMA_OBJ_SIZE(ib_ah, qedr_ah, ibah),
        INIT_RDMA_OBJ_SIZE(ib_pd, qedr_pd, ibpd),
+       INIT_RDMA_OBJ_SIZE(ib_srq, qedr_srq, ibsrq),
        INIT_RDMA_OBJ_SIZE(ib_ucontext, qedr_ucontext, ibucontext),
 };
 
index 8ea06856e7b939556a723fdfee3a21e745e0602a..5e92b6229da22e39358e274897dbf14e11a6c35f 100644 (file)
@@ -1267,7 +1267,7 @@ static void qedr_set_roce_db_info(struct qedr_dev *dev, struct qedr_qp *qp)
        }
 }
 
-static int qedr_check_srq_params(struct ib_pd *ibpd, struct qedr_dev *dev,
+static int qedr_check_srq_params(struct qedr_dev *dev,
                                 struct ib_srq_init_attr *attrs,
                                 struct ib_udata *udata)
 {
@@ -1383,33 +1383,28 @@ static int qedr_alloc_srq_kernel_params(struct qedr_srq *srq,
        return rc;
 }
 
-struct ib_srq *qedr_create_srq(struct ib_pd *ibpd,
-                              struct ib_srq_init_attr *init_attr,
-                              struct ib_udata *udata)
+int qedr_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *init_attr,
+                   struct ib_udata *udata)
 {
        struct qed_rdma_destroy_srq_in_params destroy_in_params;
        struct qed_rdma_create_srq_in_params in_params = {};
-       struct qedr_dev *dev = get_qedr_dev(ibpd->device);
+       struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
        struct qed_rdma_create_srq_out_params out_params;
-       struct qedr_pd *pd = get_qedr_pd(ibpd);
+       struct qedr_pd *pd = get_qedr_pd(ibsrq->pd);
        struct qedr_create_srq_ureq ureq = {};
        u64 pbl_base_addr, phy_prod_pair_addr;
        struct qedr_srq_hwq_info *hw_srq;
        u32 page_cnt, page_size;
-       struct qedr_srq *srq;
+       struct qedr_srq *srq = get_qedr_srq(ibsrq);
        int rc = 0;
 
        DP_DEBUG(dev, QEDR_MSG_QP,
                 "create SRQ called from %s (pd %p)\n",
                 (udata) ? "User lib" : "kernel", pd);
 
-       rc = qedr_check_srq_params(ibpd, dev, init_attr, udata);
+       rc = qedr_check_srq_params(dev, init_attr, udata);
        if (rc)
-               return ERR_PTR(-EINVAL);
-
-       srq = kzalloc(sizeof(*srq), GFP_KERNEL);
-       if (!srq)
-               return ERR_PTR(-ENOMEM);
+               return -EINVAL;
 
        srq->dev = dev;
        hw_srq = &srq->hw_srq;
@@ -1471,7 +1466,7 @@ struct ib_srq *qedr_create_srq(struct ib_pd *ibpd,
 
        DP_DEBUG(dev, QEDR_MSG_SRQ,
                 "create srq: created srq with srq_id=0x%0x\n", srq->srq_id);
-       return &srq->ibsrq;
+       return 0;
 
 err2:
        destroy_in_params.srq_id = srq->srq_id;
@@ -1483,12 +1478,10 @@ struct ib_srq *qedr_create_srq(struct ib_pd *ibpd,
        else
                qedr_free_srq_kernel_params(srq);
 err0:
-       kfree(srq);
-
-       return ERR_PTR(-EFAULT);
+       return -EFAULT;
 }
 
-int qedr_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
+void qedr_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
 {
        struct qed_rdma_destroy_srq_in_params in_params = {};
        struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
@@ -1506,9 +1499,6 @@ int qedr_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
        DP_DEBUG(dev, QEDR_MSG_SRQ,
                 "destroy srq: destroyed srq with srq_id=0x%0x\n",
                 srq->srq_id);
-       kfree(srq);
-
-       return 0;
 }
 
 int qedr_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
index 772af35a5055e71b2adfdfd95567ed66545a0778..9328c80375efb9c60e93c90d5d36d71f7f7c5ca1 100644 (file)
@@ -64,13 +64,12 @@ int qedr_query_qp(struct ib_qp *, struct ib_qp_attr *qp_attr,
                  int qp_attr_mask, struct ib_qp_init_attr *);
 int qedr_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata);
 
-struct ib_srq *qedr_create_srq(struct ib_pd *ibpd,
-                              struct ib_srq_init_attr *attr,
-                              struct ib_udata *udata);
+int qedr_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *attr,
+                   struct ib_udata *udata);
 int qedr_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
                    enum ib_srq_attr_mask attr_mask, struct ib_udata *udata);
 int qedr_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr);
-int qedr_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata);
+void qedr_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata);
 int qedr_post_srq_recv(struct ib_srq *ibsrq, const struct ib_recv_wr *wr,
                       const struct ib_recv_wr **bad_recv_wr);
 int qedr_create_ah(struct ib_ah *ibah, struct rdma_ah_attr *attr, u32 flags,
index 6cbc271a1b7deb558d88b4fa6cf9730b01ae1a1e..823846947a5b11254f339bf1758483b359e4e7a5 100644 (file)
@@ -206,6 +206,8 @@ static const struct ib_device_ops pvrdma_dev_srq_ops = {
        .destroy_srq = pvrdma_destroy_srq,
        .modify_srq = pvrdma_modify_srq,
        .query_srq = pvrdma_query_srq,
+
+       INIT_RDMA_OBJ_SIZE(ib_srq, pvrdma_srq, ibsrq),
 };
 
 static int pvrdma_register_device(struct pvrdma_dev *dev)
index 21a95780e0ea3ebb6f2ac13fdd13a96168d6775c..6cac0c88cf39d55f16df1af5b14c12513e2d8188 100644 (file)
@@ -94,19 +94,18 @@ int pvrdma_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *srq_attr)
  * @init_attr: shared receive queue attributes
  * @udata: user data
  *
- * @return: the ib_srq pointer on success, otherwise returns an errno.
+ * @return: 0 on success, otherwise returns an errno.
  */
-struct ib_srq *pvrdma_create_srq(struct ib_pd *pd,
-                                struct ib_srq_init_attr *init_attr,
-                                struct ib_udata *udata)
+int pvrdma_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *init_attr,
+                     struct ib_udata *udata)
 {
-       struct pvrdma_srq *srq = NULL;
-       struct pvrdma_dev *dev = to_vdev(pd->device);
+       struct pvrdma_srq *srq = to_vsrq(ibsrq);
+       struct pvrdma_dev *dev = to_vdev(ibsrq->device);
        union pvrdma_cmd_req req;
        union pvrdma_cmd_resp rsp;
        struct pvrdma_cmd_create_srq *cmd = &req.create_srq;
        struct pvrdma_cmd_create_srq_resp *resp = &rsp.create_srq_resp;
-       struct pvrdma_create_srq_resp srq_resp = {0};
+       struct pvrdma_create_srq_resp srq_resp = {};
        struct pvrdma_create_srq ucmd;
        unsigned long flags;
        int ret;
@@ -115,31 +114,25 @@ struct ib_srq *pvrdma_create_srq(struct ib_pd *pd,
                /* No support for kernel clients. */
                dev_warn(&dev->pdev->dev,
                         "no shared receive queue support for kernel client\n");
-               return ERR_PTR(-EOPNOTSUPP);
+               return -EOPNOTSUPP;
        }
 
        if (init_attr->srq_type != IB_SRQT_BASIC) {
                dev_warn(&dev->pdev->dev,
                         "shared receive queue type %d not supported\n",
                         init_attr->srq_type);
-               return ERR_PTR(-EINVAL);
+               return -EINVAL;
        }
 
        if (init_attr->attr.max_wr  > dev->dsr->caps.max_srq_wr ||
            init_attr->attr.max_sge > dev->dsr->caps.max_srq_sge) {
                dev_warn(&dev->pdev->dev,
                         "shared receive queue size invalid\n");
-               return ERR_PTR(-EINVAL);
+               return -EINVAL;
        }
 
        if (!atomic_add_unless(&dev->num_srqs, 1, dev->dsr->caps.max_srq))
-               return ERR_PTR(-ENOMEM);
-
-       srq = kmalloc(sizeof(*srq), GFP_KERNEL);
-       if (!srq) {
-               ret = -ENOMEM;
-               goto err_srq;
-       }
+               return -ENOMEM;
 
        spin_lock_init(&srq->lock);
        refcount_set(&srq->refcnt, 1);
@@ -181,7 +174,7 @@ struct ib_srq *pvrdma_create_srq(struct ib_pd *pd,
        cmd->hdr.cmd = PVRDMA_CMD_CREATE_SRQ;
        cmd->srq_type = init_attr->srq_type;
        cmd->nchunks = srq->npages;
-       cmd->pd_handle = to_vpd(pd)->pd_handle;
+       cmd->pd_handle = to_vpd(ibsrq->pd)->pd_handle;
        cmd->attrs.max_wr = init_attr->attr.max_wr;
        cmd->attrs.max_sge = init_attr->attr.max_sge;
        cmd->attrs.srq_limit = init_attr->attr.srq_limit;
@@ -205,20 +198,19 @@ struct ib_srq *pvrdma_create_srq(struct ib_pd *pd,
        if (ib_copy_to_udata(udata, &srq_resp, sizeof(srq_resp))) {
                dev_warn(&dev->pdev->dev, "failed to copy back udata\n");
                pvrdma_destroy_srq(&srq->ibsrq, udata);
-               return ERR_PTR(-EINVAL);
+               return -EINVAL;
        }
 
-       return &srq->ibsrq;
+       return 0;
 
 err_page_dir:
        pvrdma_page_dir_cleanup(dev, &srq->pdir);
 err_umem:
        ib_umem_release(srq->umem);
 err_srq:
-       kfree(srq);
        atomic_dec(&dev->num_srqs);
 
-       return ERR_PTR(ret);
+       return ret;
 }
 
 static void pvrdma_free_srq(struct pvrdma_dev *dev, struct pvrdma_srq *srq)
@@ -250,7 +242,7 @@ static void pvrdma_free_srq(struct pvrdma_dev *dev, struct pvrdma_srq *srq)
  *
  * @return: 0 for success.
  */
-int pvrdma_destroy_srq(struct ib_srq *srq, struct ib_udata *udata)
+void pvrdma_destroy_srq(struct ib_srq *srq, struct ib_udata *udata)
 {
        struct pvrdma_srq *vsrq = to_vsrq(srq);
        union pvrdma_cmd_req req;
@@ -269,8 +261,6 @@ int pvrdma_destroy_srq(struct ib_srq *srq, struct ib_udata *udata)
                         ret);
 
        pvrdma_free_srq(dev, vsrq);
-
-       return 0;
 }
 
 /**
index 013c73f2eba38105ac22de4118823042859a139e..9d7b021e1c5991dbb83c396a35e552c4c736b9bb 100644 (file)
@@ -419,13 +419,12 @@ int pvrdma_create_ah(struct ib_ah *ah, struct rdma_ah_attr *ah_attr, u32 flags,
                     struct ib_udata *udata);
 void pvrdma_destroy_ah(struct ib_ah *ah, u32 flags);
 
-struct ib_srq *pvrdma_create_srq(struct ib_pd *pd,
-                                struct ib_srq_init_attr *init_attr,
-                                struct ib_udata *udata);
+int pvrdma_create_srq(struct ib_srq *srq, struct ib_srq_init_attr *init_attr,
+                     struct ib_udata *udata);
 int pvrdma_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
                      enum ib_srq_attr_mask attr_mask, struct ib_udata *udata);
 int pvrdma_query_srq(struct ib_srq *srq, struct ib_srq_attr *srq_attr);
-int pvrdma_destroy_srq(struct ib_srq *srq, struct ib_udata *udata);
+void pvrdma_destroy_srq(struct ib_srq *srq, struct ib_udata *udata);
 
 struct ib_qp *pvrdma_create_qp(struct ib_pd *pd,
                               struct ib_qp_init_attr *init_attr,
index 21d276eaf15a0491aad3ea54bdf2cdfb99265115..8d6b3e76425579f0cae9641aa1557aa12bd6abd3 100644 (file)
@@ -71,29 +71,24 @@ void rvt_driver_srq_init(struct rvt_dev_info *rdi)
  * @srq_init_attr: the attributes of the SRQ
  * @udata: data from libibverbs when creating a user SRQ
  *
- * Return: Allocated srq object
+ * Return: 0 on success
  */
-struct ib_srq *rvt_create_srq(struct ib_pd *ibpd,
-                             struct ib_srq_init_attr *srq_init_attr,
-                             struct ib_udata *udata)
+int rvt_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *srq_init_attr,
+                  struct ib_udata *udata)
 {
-       struct rvt_dev_info *dev = ib_to_rvt(ibpd->device);
-       struct rvt_srq *srq;
+       struct rvt_dev_info *dev = ib_to_rvt(ibsrq->device);
+       struct rvt_srq *srq = ibsrq_to_rvtsrq(ibsrq);
        u32 sz;
-       struct ib_srq *ret;
+       int ret;
 
        if (srq_init_attr->srq_type != IB_SRQT_BASIC)
-               return ERR_PTR(-EOPNOTSUPP);
+               return -EOPNOTSUPP;
 
        if (srq_init_attr->attr.max_sge == 0 ||
            srq_init_attr->attr.max_sge > dev->dparms.props.max_srq_sge ||
            srq_init_attr->attr.max_wr == 0 ||
            srq_init_attr->attr.max_wr > dev->dparms.props.max_srq_wr)
-               return ERR_PTR(-EINVAL);
-
-       srq = kzalloc_node(sizeof(*srq), GFP_KERNEL, dev->dparms.node);
-       if (!srq)
-               return ERR_PTR(-ENOMEM);
+               return -EINVAL;
 
        /*
         * Need to use vmalloc() if we want to support large #s of entries.
@@ -107,7 +102,7 @@ struct ib_srq *rvt_create_srq(struct ib_pd *ibpd,
                vzalloc_node(sizeof(struct rvt_rwq) + srq->rq.size * sz,
                             dev->dparms.node);
        if (!srq->rq.wq) {
-               ret = ERR_PTR(-ENOMEM);
+               ret = -ENOMEM;
                goto bail_srq;
        }
 
@@ -116,21 +111,18 @@ struct ib_srq *rvt_create_srq(struct ib_pd *ibpd,
         * See rvt_mmap() for details.
         */
        if (udata && udata->outlen >= sizeof(__u64)) {
-               int err;
                u32 s = sizeof(struct rvt_rwq) + srq->rq.size * sz;
 
                srq->ip = rvt_create_mmap_info(dev, s, udata, srq->rq.wq);
                if (!srq->ip) {
-                       ret = ERR_PTR(-ENOMEM);
+                       ret = -ENOMEM;
                        goto bail_wq;
                }
 
-               err = ib_copy_to_udata(udata, &srq->ip->offset,
+               ret = ib_copy_to_udata(udata, &srq->ip->offset,
                                       sizeof(srq->ip->offset));
-               if (err) {
-                       ret = ERR_PTR(err);
+               if (ret)
                        goto bail_ip;
-               }
        }
 
        /*
@@ -142,7 +134,7 @@ struct ib_srq *rvt_create_srq(struct ib_pd *ibpd,
        spin_lock(&dev->n_srqs_lock);
        if (dev->n_srqs_allocated == dev->dparms.props.max_srq) {
                spin_unlock(&dev->n_srqs_lock);
-               ret = ERR_PTR(-ENOMEM);
+               ret = -ENOMEM;
                goto bail_ip;
        }
 
@@ -155,14 +147,13 @@ struct ib_srq *rvt_create_srq(struct ib_pd *ibpd,
                spin_unlock_irq(&dev->pending_lock);
        }
 
-       return &srq->ibsrq;
+       return 0;
 
 bail_ip:
        kfree(srq->ip);
 bail_wq:
        vfree(srq->rq.wq);
 bail_srq:
-       kfree(srq);
        return ret;
 }
 
@@ -334,9 +325,8 @@ int rvt_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr)
  * rvt_destroy_srq - destory an srq
  * @ibsrq: srq object to destroy
  *
- * Return always 0
  */
-int rvt_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
+void rvt_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
 {
        struct rvt_srq *srq = ibsrq_to_rvtsrq(ibsrq);
        struct rvt_dev_info *dev = ib_to_rvt(ibsrq->device);
@@ -348,7 +338,4 @@ int rvt_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
                kref_put(&srq->ip->ref, rvt_release_mmap_info);
        else
                vfree(srq->rq.wq);
-       kfree(srq);
-
-       return 0;
 }
index 69cad2f65408377c777fd6ac5d618546dea80db5..6427d7d62a9a3975d7f04bc4ae1230bbb3e9c993 100644 (file)
 
 #include <rdma/rdma_vt.h>
 void rvt_driver_srq_init(struct rvt_dev_info *rdi);
-struct ib_srq *rvt_create_srq(struct ib_pd *ibpd,
-                             struct ib_srq_init_attr *srq_init_attr,
-                             struct ib_udata *udata);
+int rvt_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *srq_init_attr,
+                  struct ib_udata *udata);
 int rvt_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
                   enum ib_srq_attr_mask attr_mask,
                   struct ib_udata *udata);
 int rvt_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr);
-int rvt_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata);
+void rvt_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata);
 
 #endif          /* DEF_RVTSRQ_H */
index f4b3bb57ab0691832f81f96a1de8fd8be6ebe810..9546a837a8ac41dce833d811af9534bce70908c9 100644 (file)
@@ -428,6 +428,7 @@ static const struct ib_device_ops rvt_dev_ops = {
 
        INIT_RDMA_OBJ_SIZE(ib_ah, rvt_ah, ibah),
        INIT_RDMA_OBJ_SIZE(ib_pd, rvt_pd, ibpd),
+       INIT_RDMA_OBJ_SIZE(ib_srq, rvt_srq, ibsrq),
        INIT_RDMA_OBJ_SIZE(ib_ucontext, rvt_ucontext, ibucontext),
 };
 
index 756bd36fd268b19465f2f3e011159060ff7d0f63..56cf18af016a0db8aa72e417539f18e14920304c 100644 (file)
@@ -57,7 +57,7 @@ struct rxe_type_info rxe_type_info[RXE_NUM_TYPES] = {
        [RXE_TYPE_SRQ] = {
                .name           = "rxe-srq",
                .size           = sizeof(struct rxe_srq),
-               .flags          = RXE_POOL_INDEX,
+               .flags          = RXE_POOL_INDEX | RXE_POOL_NO_ALLOC,
                .min_index      = RXE_MIN_SRQ_INDEX,
                .max_index      = RXE_MAX_SRQ_INDEX,
        },
index a6c63a260626e7b8ca3420dea240820e9b6b64dc..8c3e2a18cfe4072a7695297365d4241166487a55 100644 (file)
@@ -289,19 +289,18 @@ static int post_one_recv(struct rxe_rq *rq, const struct ib_recv_wr *ibwr)
        return err;
 }
 
-static struct ib_srq *rxe_create_srq(struct ib_pd *ibpd,
-                                    struct ib_srq_init_attr *init,
-                                    struct ib_udata *udata)
+static int rxe_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *init,
+                         struct ib_udata *udata)
 {
        int err;
-       struct rxe_dev *rxe = to_rdev(ibpd->device);
-       struct rxe_pd *pd = to_rpd(ibpd);
-       struct rxe_srq *srq;
+       struct rxe_dev *rxe = to_rdev(ibsrq->device);
+       struct rxe_pd *pd = to_rpd(ibsrq->pd);
+       struct rxe_srq *srq = to_rsrq(ibsrq);
        struct rxe_create_srq_resp __user *uresp = NULL;
 
        if (udata) {
                if (udata->outlen < sizeof(*uresp))
-                       return ERR_PTR(-EINVAL);
+                       return -EINVAL;
                uresp = udata->outbuf;
        }
 
@@ -309,13 +308,10 @@ static struct ib_srq *rxe_create_srq(struct ib_pd *ibpd,
        if (err)
                goto err1;
 
-       srq = rxe_alloc(&rxe->srq_pool);
-       if (!srq) {
-               err = -ENOMEM;
+       err = rxe_add_to_pool(&rxe->srq_pool, &srq->pelem);
+       if (err)
                goto err1;
-       }
 
-       rxe_add_index(srq);
        rxe_add_ref(pd);
        srq->pd = pd;
 
@@ -323,14 +319,13 @@ static struct ib_srq *rxe_create_srq(struct ib_pd *ibpd,
        if (err)
                goto err2;
 
-       return &srq->ibsrq;
+       return 0;
 
 err2:
        rxe_drop_ref(pd);
-       rxe_drop_index(srq);
        rxe_drop_ref(srq);
 err1:
-       return ERR_PTR(err);
+       return err;
 }
 
 static int rxe_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
@@ -378,7 +373,7 @@ static int rxe_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr)
        return 0;
 }
 
-static int rxe_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
+static void rxe_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
 {
        struct rxe_srq *srq = to_rsrq(ibsrq);
 
@@ -386,10 +381,7 @@ static int rxe_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
                rxe_queue_cleanup(srq->rq.queue);
 
        rxe_drop_ref(srq->pd);
-       rxe_drop_index(srq);
        rxe_drop_ref(srq);
-
-       return 0;
 }
 
 static int rxe_post_srq_recv(struct ib_srq *ibsrq, const struct ib_recv_wr *wr,
@@ -1166,6 +1158,7 @@ static const struct ib_device_ops rxe_dev_ops = {
 
        INIT_RDMA_OBJ_SIZE(ib_ah, rxe_ah, ibah),
        INIT_RDMA_OBJ_SIZE(ib_pd, rxe_pd, ibpd),
+       INIT_RDMA_OBJ_SIZE(ib_srq, rxe_srq, ibsrq),
        INIT_RDMA_OBJ_SIZE(ib_ucontext, rxe_ucontext, ibuc),
 };
 
index 23c5002b513480b827e6f4f6a1794a85705fdcf6..e8be7f44e3beb8b12b4297cfb6d1733c1e061d0e 100644 (file)
@@ -120,8 +120,8 @@ struct rxe_rq {
 };
 
 struct rxe_srq {
-       struct rxe_pool_entry   pelem;
        struct ib_srq           ibsrq;
+       struct rxe_pool_entry   pelem;
        struct rxe_pd           *pd;
        struct rxe_rq           rq;
        u32                     srq_num;
index 3232a84c4fdbd437e6fa437c9f9b2ec68f784933..43a75ab8ea8a8d156a1775c20b7c71a94d636f81 100644 (file)
@@ -2406,14 +2406,14 @@ struct ib_device_ops {
        int (*modify_ah)(struct ib_ah *ah, struct rdma_ah_attr *ah_attr);
        int (*query_ah)(struct ib_ah *ah, struct rdma_ah_attr *ah_attr);
        void (*destroy_ah)(struct ib_ah *ah, u32 flags);
-       struct ib_srq *(*create_srq)(struct ib_pd *pd,
-                                    struct ib_srq_init_attr *srq_init_attr,
-                                    struct ib_udata *udata);
+       int (*create_srq)(struct ib_srq *srq,
+                         struct ib_srq_init_attr *srq_init_attr,
+                         struct ib_udata *udata);
        int (*modify_srq)(struct ib_srq *srq, struct ib_srq_attr *srq_attr,
                          enum ib_srq_attr_mask srq_attr_mask,
                          struct ib_udata *udata);
        int (*query_srq)(struct ib_srq *srq, struct ib_srq_attr *srq_attr);
-       int (*destroy_srq)(struct ib_srq *srq, struct ib_udata *udata);
+       void (*destroy_srq)(struct ib_srq *srq, struct ib_udata *udata);
        struct ib_qp *(*create_qp)(struct ib_pd *pd,
                                   struct ib_qp_init_attr *qp_init_attr,
                                   struct ib_udata *udata);
@@ -2553,6 +2553,7 @@ struct ib_device_ops {
 
        DECLARE_RDMA_OBJ_SIZE(ib_ah);
        DECLARE_RDMA_OBJ_SIZE(ib_pd);
+       DECLARE_RDMA_OBJ_SIZE(ib_srq);
        DECLARE_RDMA_OBJ_SIZE(ib_ucontext);
 };