From: Leon Romanovsky <[email protected]>

Separate the create‑CQ logic into distinct user and kernel
code paths.

Signed-off-by: Leon Romanovsky <[email protected]>
---
 drivers/infiniband/hw/mthca/mthca_provider.c | 92 ++++++++++++++++++----------
 1 file changed, 58 insertions(+), 34 deletions(-)

diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c 
b/drivers/infiniband/hw/mthca/mthca_provider.c
index aa5ca5c4ff77..6bf825978846 100644
--- a/drivers/infiniband/hw/mthca/mthca_provider.c
+++ b/drivers/infiniband/hw/mthca/mthca_provider.c
@@ -572,9 +572,9 @@ static int mthca_destroy_qp(struct ib_qp *qp, struct 
ib_udata *udata)
        return 0;
 }
 
-static int mthca_create_cq(struct ib_cq *ibcq,
-                          const struct ib_cq_init_attr *attr,
-                          struct uverbs_attr_bundle *attrs)
+static int mthca_create_user_cq(struct ib_cq *ibcq,
+                               const struct ib_cq_init_attr *attr,
+                               struct uverbs_attr_bundle *attrs)
 {
        struct ib_udata *udata = &attrs->driver_udata;
        struct ib_device *ibdev = ibcq->device;
@@ -586,47 +586,41 @@ static int mthca_create_cq(struct ib_cq *ibcq,
        struct mthca_ucontext *context = rdma_udata_to_drv_context(
                udata, struct mthca_ucontext, ibucontext);
 
-       if (attr->flags)
+       if (attr->flags || ibcq->umem)
                return -EOPNOTSUPP;
 
-       if (entries < 1 || entries > to_mdev(ibdev)->limits.max_cqes)
+       if (attr->cqe > to_mdev(ibdev)->limits.max_cqes)
                return -EINVAL;
 
-       if (udata) {
-               if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd)))
-                       return -EFAULT;
+       if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd)))
+               return -EFAULT;
 
-               err = mthca_map_user_db(to_mdev(ibdev), &context->uar,
-                                       context->db_tab, ucmd.set_db_index,
-                                       ucmd.set_db_page);
-               if (err)
-                       return err;
+       err = mthca_map_user_db(to_mdev(ibdev), &context->uar,
+                               context->db_tab, ucmd.set_db_index,
+                               ucmd.set_db_page);
+       if (err)
+               return err;
 
-               err = mthca_map_user_db(to_mdev(ibdev), &context->uar,
-                                       context->db_tab, ucmd.arm_db_index,
-                                       ucmd.arm_db_page);
-               if (err)
-                       goto err_unmap_set;
-       }
+       err = mthca_map_user_db(to_mdev(ibdev), &context->uar,
+                               context->db_tab, ucmd.arm_db_index,
+                               ucmd.arm_db_page);
+       if (err)
+               goto err_unmap_set;
 
        cq = to_mcq(ibcq);
 
-       if (udata) {
-               cq->buf.mr.ibmr.lkey = ucmd.lkey;
-               cq->set_ci_db_index  = ucmd.set_db_index;
-               cq->arm_db_index     = ucmd.arm_db_index;
-       }
+       cq->buf.mr.ibmr.lkey = ucmd.lkey;
+       cq->set_ci_db_index  = ucmd.set_db_index;
+       cq->arm_db_index     = ucmd.arm_db_index;
 
        for (nent = 1; nent <= entries; nent <<= 1)
                ; /* nothing */
 
-       err = mthca_init_cq(to_mdev(ibdev), nent, context,
-                           udata ? ucmd.pdn : to_mdev(ibdev)->driver_pd.pd_num,
-                           cq);
+       err = mthca_init_cq(to_mdev(ibdev), nent, context, ucmd.pdn, cq);
        if (err)
                goto err_unmap_arm;
 
-       if (udata && ib_copy_to_udata(udata, &cq->cqn, sizeof(__u32))) {
+       if (ib_copy_to_udata(udata, &cq->cqn, sizeof(__u32))) {
                mthca_free_cq(to_mdev(ibdev), cq);
                err = -EFAULT;
                goto err_unmap_arm;
@@ -637,18 +631,47 @@ static int mthca_create_cq(struct ib_cq *ibcq,
        return 0;
 
 err_unmap_arm:
-       if (udata)
-               mthca_unmap_user_db(to_mdev(ibdev), &context->uar,
-                                   context->db_tab, ucmd.arm_db_index);
+       mthca_unmap_user_db(to_mdev(ibdev), &context->uar,
+                           context->db_tab, ucmd.arm_db_index);
 
 err_unmap_set:
-       if (udata)
-               mthca_unmap_user_db(to_mdev(ibdev), &context->uar,
-                                   context->db_tab, ucmd.set_db_index);
+       mthca_unmap_user_db(to_mdev(ibdev), &context->uar,
+                           context->db_tab, ucmd.set_db_index);
 
        return err;
 }
 
+static int mthca_create_cq(struct ib_cq *ibcq,
+                          const struct ib_cq_init_attr *attr,
+                          struct uverbs_attr_bundle *attrs)
+{
+       struct ib_device *ibdev = ibcq->device;
+       int entries = attr->cqe;
+       struct mthca_cq *cq;
+       int nent;
+       int err;
+
+       if (attr->flags)
+               return -EOPNOTSUPP;
+
+       if (attr->cqe > to_mdev(ibdev)->limits.max_cqes)
+               return -EINVAL;
+
+       cq = to_mcq(ibcq);
+
+       for (nent = 1; nent <= entries; nent <<= 1)
+               ; /* nothing */
+
+       err = mthca_init_cq(to_mdev(ibdev), nent, NULL,
+                           to_mdev(ibdev)->driver_pd.pd_num, cq);
+       if (err)
+               return err;
+
+       cq->resize_buf = NULL;
+
+       return 0;
+}
+
 static int mthca_alloc_resize_buf(struct mthca_dev *dev, struct mthca_cq *cq,
                                  int entries)
 {
@@ -1070,6 +1093,7 @@ static const struct ib_device_ops mthca_dev_ops = {
        .attach_mcast = mthca_multicast_attach,
        .create_ah = mthca_ah_create,
        .create_cq = mthca_create_cq,
+       .create_user_cq = mthca_create_user_cq,
        .create_qp = mthca_create_qp,
        .dealloc_pd = mthca_dealloc_pd,
        .dealloc_ucontext = mthca_dealloc_ucontext,

-- 
2.52.0


Reply via email to