From: Leon Romanovsky <[email protected]> Separate the CQ creation logic into distinct kernel and user flows.
Signed-off-by: Leon Romanovsky <[email protected]> --- drivers/infiniband/sw/rxe/rxe_verbs.c | 81 ++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 34 deletions(-) diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.c b/drivers/infiniband/sw/rxe/rxe_verbs.c index 38d8c408320f..1e651bdd8622 100644 --- a/drivers/infiniband/sw/rxe/rxe_verbs.c +++ b/drivers/infiniband/sw/rxe/rxe_verbs.c @@ -1072,58 +1072,70 @@ static int rxe_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr, } /* cq */ -static int rxe_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, - struct uverbs_attr_bundle *attrs) +static int rxe_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 *dev = ibcq->device; struct rxe_dev *rxe = to_rdev(dev); struct rxe_cq *cq = to_rcq(ibcq); - struct rxe_create_cq_resp __user *uresp = NULL; - int err, cleanup_err; + struct rxe_create_cq_resp __user *uresp; + int err; - if (udata) { - if (udata->outlen < sizeof(*uresp)) { - err = -EINVAL; - rxe_dbg_dev(rxe, "malformed udata, err = %d\n", err); - goto err_out; - } - uresp = udata->outbuf; - } + if (udata->outlen < sizeof(*uresp)) + return -EINVAL; - if (attr->flags) { - err = -EOPNOTSUPP; - rxe_dbg_dev(rxe, "bad attr->flags, err = %d\n", err); - goto err_out; - } + uresp = udata->outbuf; - err = rxe_cq_chk_attr(rxe, NULL, attr->cqe, attr->comp_vector); - if (err) { - rxe_dbg_dev(rxe, "bad init attributes, err = %d\n", err); - goto err_out; - } + if (attr->flags || ibcq->umem) + return -EOPNOTSUPP; + + if (attr->cqe > rxe->attr.max_cqe) + return -EINVAL; err = rxe_add_to_pool(&rxe->cq_pool, cq); - if (err) { - rxe_dbg_dev(rxe, "unable to create cq, err = %d\n", err); - goto err_out; - } + if (err) + return err; err = rxe_cq_from_init(rxe, cq, attr->cqe, attr->comp_vector, udata, uresp); - if (err) { - rxe_dbg_cq(cq, "create cq failed, err = %d\n", err); + if (err) goto err_cleanup; - } return 0; err_cleanup: - cleanup_err = rxe_cleanup(cq); - if (cleanup_err) - rxe_err_cq(cq, "cleanup failed, err = %d\n", cleanup_err); -err_out: - rxe_err_dev(rxe, "returned err = %d\n", err); + rxe_cleanup(cq); + return err; +} + +static int rxe_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, + struct uverbs_attr_bundle *attrs) +{ + struct ib_device *dev = ibcq->device; + struct rxe_dev *rxe = to_rdev(dev); + struct rxe_cq *cq = to_rcq(ibcq); + int err; + + if (attr->flags) + return -EOPNOTSUPP; + + if (attr->cqe > rxe->attr.max_cqe) + return -EINVAL; + + err = rxe_add_to_pool(&rxe->cq_pool, cq); + if (err) + return err; + + err = rxe_cq_from_init(rxe, cq, attr->cqe, attr->comp_vector, NULL, + NULL); + if (err) + goto err_cleanup; + + return 0; + +err_cleanup: + rxe_cleanup(cq); return err; } @@ -1478,6 +1490,7 @@ static const struct ib_device_ops rxe_dev_ops = { .attach_mcast = rxe_attach_mcast, .create_ah = rxe_create_ah, .create_cq = rxe_create_cq, + .create_user_cq = rxe_create_user_cq, .create_qp = rxe_create_qp, .create_srq = rxe_create_srq, .create_user_ah = rxe_create_ah, -- 2.52.0
