From: Leon Romanovsky <leonro@nvidia.com>
Separate the create‑CQ logic into distinct user and kernel
code paths.
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
---
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