IB/core: Separate CQ handle in SRQ context
authorArtemy Kovalyov <artemyko@mellanox.com>
Thu, 17 Aug 2017 12:52:04 +0000 (15:52 +0300)
committerDoug Ledford <dledford@redhat.com>
Tue, 29 Aug 2017 12:30:16 +0000 (08:30 -0400)
Before this change CQ attached to SRQ was part of XRC specific extension.
Moving CQ handle out makes it available to other types extending SRQ
functionality.

Signed-off-by: Artemy Kovalyov <artemyko@mellanox.com>
Reviewed-by: Yossi Itigin <yosefe@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/core/uverbs_cmd.c
drivers/infiniband/core/verbs.c
drivers/infiniband/hw/mlx4/srq.c
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/hw/mlx5/srq.c
include/rdma/ib_verbs.h

index 8e9fea03dec4f4cb4a321726c13836cfe6c1e1be..9f690af46a7e4f2269819eb563e16702c03e8a93 100644 (file)
@@ -3497,10 +3497,12 @@ static int __uverbs_create_xsrq(struct ib_uverbs_file *file,
 
                obj->uxrcd = container_of(xrcd_uobj, struct ib_uxrcd_object, uobject);
                atomic_inc(&obj->uxrcd->refcnt);
+       }
 
-               attr.ext.xrc.cq  = uobj_get_obj_read(cq, cmd->cq_handle,
-                                                    file->ucontext);
-               if (!attr.ext.xrc.cq) {
+       if (ib_srq_has_cq(cmd->srq_type)) {
+               attr.ext.cq  = uobj_get_obj_read(cq, cmd->cq_handle,
+                                                file->ucontext);
+               if (!attr.ext.cq) {
                        ret = -EINVAL;
                        goto err_put_xrcd;
                }
@@ -3535,10 +3537,13 @@ static int __uverbs_create_xsrq(struct ib_uverbs_file *file,
        srq->event_handler = attr.event_handler;
        srq->srq_context   = attr.srq_context;
 
+       if (ib_srq_has_cq(cmd->srq_type)) {
+               srq->ext.cq       = attr.ext.cq;
+               atomic_inc(&attr.ext.cq->usecnt);
+       }
+
        if (cmd->srq_type == IB_SRQT_XRC) {
-               srq->ext.xrc.cq   = attr.ext.xrc.cq;
                srq->ext.xrc.xrcd = attr.ext.xrc.xrcd;
-               atomic_inc(&attr.ext.xrc.cq->usecnt);
                atomic_inc(&attr.ext.xrc.xrcd->usecnt);
        }
 
@@ -3561,10 +3566,12 @@ static int __uverbs_create_xsrq(struct ib_uverbs_file *file,
                goto err_copy;
        }
 
-       if (cmd->srq_type == IB_SRQT_XRC) {
+       if (cmd->srq_type == IB_SRQT_XRC)
                uobj_put_read(xrcd_uobj);
-               uobj_put_obj_read(attr.ext.xrc.cq);
-       }
+
+       if (ib_srq_has_cq(cmd->srq_type))
+               uobj_put_obj_read(attr.ext.cq);
+
        uobj_put_obj_read(pd);
        uobj_alloc_commit(&obj->uevent.uobject);
 
@@ -3577,8 +3584,8 @@ err_put:
        uobj_put_obj_read(pd);
 
 err_put_cq:
-       if (cmd->srq_type == IB_SRQT_XRC)
-               uobj_put_obj_read(attr.ext.xrc.cq);
+       if (ib_srq_has_cq(cmd->srq_type))
+               uobj_put_obj_read(attr.ext.cq);
 
 err_put_xrcd:
        if (cmd->srq_type == IB_SRQT_XRC) {
index b29d0ff94463223c194e1fc709777f50ffd8cd97..ecb6c395f19b95168790ecdd76f8bebd265fddab 100644 (file)
@@ -622,11 +622,13 @@ struct ib_srq *ib_create_srq(struct ib_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;
-                       srq->ext.xrc.cq   = srq_init_attr->ext.xrc.cq;
                        atomic_inc(&srq->ext.xrc.xrcd->usecnt);
-                       atomic_inc(&srq->ext.xrc.cq->usecnt);
                }
                atomic_inc(&pd->usecnt);
                atomic_set(&srq->usecnt, 0);
@@ -667,18 +669,18 @@ int ib_destroy_srq(struct ib_srq *srq)
 
        pd = srq->pd;
        srq_type = srq->srq_type;
-       if (srq_type == IB_SRQT_XRC) {
+       if (ib_srq_has_cq(srq_type))
+               cq = srq->ext.cq;
+       if (srq_type == IB_SRQT_XRC)
                xrcd = srq->ext.xrc.xrcd;
-               cq = srq->ext.xrc.cq;
-       }
 
        ret = srq->device->destroy_srq(srq);
        if (!ret) {
                atomic_dec(&pd->usecnt);
-               if (srq_type == IB_SRQT_XRC) {
+               if (srq_type == IB_SRQT_XRC)
                        atomic_dec(&xrcd->usecnt);
+               if (ib_srq_has_cq(srq_type))
                        atomic_dec(&cq->usecnt);
-               }
        }
 
        return ret;
index dd7a2fce9df4b4a60211630bf37ba3f75558fa04..ebee56cbc0e27e6759a758e2d31202d641bff7cc 100644 (file)
@@ -178,8 +178,8 @@ struct ib_srq *mlx4_ib_create_srq(struct ib_pd *pd,
                }
        }
 
-       cqn = (init_attr->srq_type == IB_SRQT_XRC) ?
-               to_mcq(init_attr->ext.xrc.cq)->mcq.cqn : 0;
+       cqn = ib_srq_has_cq(init_attr->srq_type) ?
+               to_mcq(init_attr->ext.cq)->mcq.cqn : 0;
        xrcdn = (init_attr->srq_type == IB_SRQT_XRC) ?
                to_mxrcd(init_attr->ext.xrc.xrcd)->xrcdn :
                (u16) dev->dev->caps.reserved_xrcds;
index 62e6298810e7d2b9fc6eb2d461eee4406d8cc6bf..7ad585257fd3a9b98824203d51e7a038ba8489c8 100644 (file)
@@ -3217,7 +3217,7 @@ 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_XRC;
-       attr.ext.xrc.cq = devr->c0;
+       attr.ext.cq = devr->c0;
        attr.ext.xrc.xrcd = devr->x0;
 
        devr->s0 = mlx5_ib_create_srq(devr->p0, &attr, NULL);
@@ -3232,9 +3232,9 @@ static int create_dev_resources(struct mlx5_ib_resources *devr)
        devr->s0->srq_context   = NULL;
        devr->s0->srq_type      = IB_SRQT_XRC;
        devr->s0->ext.xrc.xrcd  = devr->x0;
-       devr->s0->ext.xrc.cq    = devr->c0;
+       devr->s0->ext.cq        = devr->c0;
        atomic_inc(&devr->s0->ext.xrc.xrcd->usecnt);
-       atomic_inc(&devr->s0->ext.xrc.cq->usecnt);
+       atomic_inc(&devr->s0->ext.cq->usecnt);
        atomic_inc(&devr->p0->usecnt);
        atomic_set(&devr->s0->usecnt, 0);
 
@@ -3253,9 +3253,9 @@ static int create_dev_resources(struct mlx5_ib_resources *devr)
        devr->s1->event_handler = NULL;
        devr->s1->srq_context   = NULL;
        devr->s1->srq_type      = IB_SRQT_BASIC;
-       devr->s1->ext.xrc.cq    = devr->c0;
+       devr->s1->ext.cq        = devr->c0;
        atomic_inc(&devr->p0->usecnt);
-       atomic_set(&devr->s0->usecnt, 0);
+       atomic_set(&devr->s1->usecnt, 0);
 
        for (port = 0; port < ARRAY_SIZE(devr->ports); ++port) {
                INIT_WORK(&devr->ports[port].pkey_change_work,
index 30b3ddd8e1abf5ed7db6243d784207ae33c4a758..e6be4f2927a7b9dfef9dcf7105a412f4a5bc9085 100644 (file)
@@ -292,13 +292,16 @@ struct ib_srq *mlx5_ib_create_srq(struct ib_pd *pd,
        in.wqe_shift = srq->msrq.wqe_shift - 4;
        if (srq->wq_sig)
                in.flags |= MLX5_SRQ_FLAG_WQ_SIG;
-       if (init_attr->srq_type == IB_SRQT_XRC) {
+
+       if (init_attr->srq_type == IB_SRQT_XRC)
                in.xrcd = to_mxrcd(init_attr->ext.xrc.xrcd)->xrcdn;
-               in.cqn = to_mcq(init_attr->ext.xrc.cq)->mcq.cqn;
-       } else if (init_attr->srq_type == IB_SRQT_BASIC) {
+       else
                in.xrcd = to_mxrcd(dev->devr.x0)->xrcdn;
+
+       if (ib_srq_has_cq(init_attr->srq_type))
+               in.cqn = to_mcq(init_attr->ext.cq)->mcq.cqn;
+       else
                in.cqn = to_mcq(dev->devr.c0)->mcq.cqn;
-       }
 
        in.pd = to_mpd(pd)->pdn;
        in.db_record = srq->db.dma;
index cab0bdcfad51c433092c32a5462dfd29e79d5f10..f0e46757185bd70264f1882a2f9aaedfb35e4b10 100644 (file)
@@ -994,6 +994,11 @@ enum ib_srq_type {
        IB_SRQT_XRC
 };
 
+static inline bool ib_srq_has_cq(enum ib_srq_type srq_type)
+{
+       return srq_type == IB_SRQT_XRC;
+}
+
 enum ib_srq_attr_mask {
        IB_SRQ_MAX_WR   = 1 << 0,
        IB_SRQ_LIMIT    = 1 << 1,
@@ -1011,11 +1016,13 @@ struct ib_srq_init_attr {
        struct ib_srq_attr      attr;
        enum ib_srq_type        srq_type;
 
-       union {
-               struct {
-                       struct ib_xrcd *xrcd;
-                       struct ib_cq   *cq;
-               } xrc;
+       struct {
+               struct ib_cq   *cq;
+               union {
+                       struct {
+                               struct ib_xrcd *xrcd;
+                       } xrc;
+               };
        } ext;
 };
 
@@ -1554,12 +1561,14 @@ struct ib_srq {
        enum ib_srq_type        srq_type;
        atomic_t                usecnt;
 
-       union {
-               struct {
-                       struct ib_xrcd *xrcd;
-                       struct ib_cq   *cq;
-                       u32             srq_num;
-               } xrc;
+       struct {
+               struct ib_cq   *cq;
+               union {
+                       struct {
+                               struct ib_xrcd *xrcd;
+                               u32             srq_num;
+                       } xrc;
+               };
        } ext;
 };