Message ID | 1713459125-14914-7-git-send-email-kotaranov@linux.microsoft.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | RDMA/mana_ib: Implement RNIC CQs | expand |
> Subject: [PATCH rdma-next 6/6] RDMA/mana_ib: implement uapi for creation > of rnic cq > > From: Konstantin Taranov <kotaranov@microsoft.com> > > Enable users to create RNIC CQs. > With the previous request size, an ethernet CQ is created. > Use the cq_buf_size from the user to create an RNIC CQ and return its ID. > > Signed-off-by: Konstantin Taranov <kotaranov@microsoft.com> > --- > drivers/infiniband/hw/mana/cq.c | 56 ++++++++++++++++++++++++++++++--- > include/uapi/rdma/mana-abi.h | 7 +++++ > 2 files changed, 59 insertions(+), 4 deletions(-) > > diff --git a/drivers/infiniband/hw/mana/cq.c > b/drivers/infiniband/hw/mana/cq.c index 8323085..a62bda7 100644 > --- a/drivers/infiniband/hw/mana/cq.c > +++ b/drivers/infiniband/hw/mana/cq.c > @@ -9,17 +9,25 @@ int mana_ib_create_cq(struct ib_cq *ibcq, const struct > ib_cq_init_attr *attr, > struct ib_udata *udata) > { > struct mana_ib_cq *cq = container_of(ibcq, struct mana_ib_cq, ibcq); > + struct mana_ib_create_cq_resp resp = {}; > + struct mana_ib_ucontext *mana_ucontext; > struct ib_device *ibdev = ibcq->device; > struct mana_ib_create_cq ucmd = {}; > struct mana_ib_dev *mdev; > + bool is_rnic_cq = true; > + u32 doorbell; > int err; > > mdev = container_of(ibdev, struct mana_ib_dev, ib_dev); > > - if (udata->inlen < sizeof(ucmd)) > + cq->comp_vector = attr->comp_vector % ibdev->num_comp_vectors; > + cq->cq_handle = INVALID_MANA_HANDLE; > + > + if (udata->inlen < offsetof(struct mana_ib_create_cq, cq_buf_size)) > return -EINVAL; > > - cq->comp_vector = attr->comp_vector % ibdev->num_comp_vectors; > + if (udata->inlen == offsetof(struct mana_ib_create_cq, cq_buf_size)) > + is_rnic_cq = false; I think it's okay with checking on offset in uapi message to decide if this is a newer/updated RNIC uverb. But increasing MANA_IB_UVERBS_ABI_VERSION may make the code simpler. I have a feeling that you may need to increase it anyway, because a new uapi message "mana_ib_create_cq_resp" is introduced. Jason or Leon may have a better idea on this.
On Tue, Apr 23, 2024 at 11:57:53PM +0000, Long Li wrote: > > Subject: [PATCH rdma-next 6/6] RDMA/mana_ib: implement uapi for creation > > of rnic cq > > > > From: Konstantin Taranov <kotaranov@microsoft.com> > > > > Enable users to create RNIC CQs. > > With the previous request size, an ethernet CQ is created. > > Use the cq_buf_size from the user to create an RNIC CQ and return its ID. > > > > Signed-off-by: Konstantin Taranov <kotaranov@microsoft.com> > > --- > > drivers/infiniband/hw/mana/cq.c | 56 ++++++++++++++++++++++++++++++--- > > include/uapi/rdma/mana-abi.h | 7 +++++ > > 2 files changed, 59 insertions(+), 4 deletions(-) > > > > diff --git a/drivers/infiniband/hw/mana/cq.c > > b/drivers/infiniband/hw/mana/cq.c index 8323085..a62bda7 100644 > > --- a/drivers/infiniband/hw/mana/cq.c > > +++ b/drivers/infiniband/hw/mana/cq.c > > @@ -9,17 +9,25 @@ int mana_ib_create_cq(struct ib_cq *ibcq, const struct > > ib_cq_init_attr *attr, > > struct ib_udata *udata) > > { > > struct mana_ib_cq *cq = container_of(ibcq, struct mana_ib_cq, ibcq); > > + struct mana_ib_create_cq_resp resp = {}; > > + struct mana_ib_ucontext *mana_ucontext; > > struct ib_device *ibdev = ibcq->device; > > struct mana_ib_create_cq ucmd = {}; > > struct mana_ib_dev *mdev; > > + bool is_rnic_cq = true; > > + u32 doorbell; > > int err; > > > > mdev = container_of(ibdev, struct mana_ib_dev, ib_dev); > > > > - if (udata->inlen < sizeof(ucmd)) > > + cq->comp_vector = attr->comp_vector % ibdev->num_comp_vectors; > > + cq->cq_handle = INVALID_MANA_HANDLE; > > + > > + if (udata->inlen < offsetof(struct mana_ib_create_cq, cq_buf_size)) > > return -EINVAL; > > > > - cq->comp_vector = attr->comp_vector % ibdev->num_comp_vectors; > > + if (udata->inlen == offsetof(struct mana_ib_create_cq, cq_buf_size)) > > + is_rnic_cq = false; > > I think it's okay with checking on offset in uapi message to decide if this is a newer/updated RNIC uverb. > > But increasing MANA_IB_UVERBS_ABI_VERSION may make the code simpler. I have a feeling that you may need to increase it anyway, because a new uapi message "mana_ib_create_cq_resp" is introduced. > > Jason or Leon may have a better idea on this. You should really try to avoid changing MANA_IB_UVERBS_ABI_VERSION as it usually means that backward compatibility will be broken after such change. Thanks
On Tue, Apr 30, 2024 at 03:37:15PM +0300, Leon Romanovsky wrote: > On Tue, Apr 23, 2024 at 11:57:53PM +0000, Long Li wrote: > > > Subject: [PATCH rdma-next 6/6] RDMA/mana_ib: implement uapi for creation > > > of rnic cq > > > > > > From: Konstantin Taranov <kotaranov@microsoft.com> > > > > > > Enable users to create RNIC CQs. > > > With the previous request size, an ethernet CQ is created. > > > Use the cq_buf_size from the user to create an RNIC CQ and return its ID. > > > > > > Signed-off-by: Konstantin Taranov <kotaranov@microsoft.com> > > > --- > > > drivers/infiniband/hw/mana/cq.c | 56 ++++++++++++++++++++++++++++++--- > > > include/uapi/rdma/mana-abi.h | 7 +++++ > > > 2 files changed, 59 insertions(+), 4 deletions(-) > > > > > > diff --git a/drivers/infiniband/hw/mana/cq.c > > > b/drivers/infiniband/hw/mana/cq.c index 8323085..a62bda7 100644 > > > --- a/drivers/infiniband/hw/mana/cq.c > > > +++ b/drivers/infiniband/hw/mana/cq.c > > > @@ -9,17 +9,25 @@ int mana_ib_create_cq(struct ib_cq *ibcq, const struct > > > ib_cq_init_attr *attr, > > > struct ib_udata *udata) > > > { > > > struct mana_ib_cq *cq = container_of(ibcq, struct mana_ib_cq, ibcq); > > > + struct mana_ib_create_cq_resp resp = {}; > > > + struct mana_ib_ucontext *mana_ucontext; > > > struct ib_device *ibdev = ibcq->device; > > > struct mana_ib_create_cq ucmd = {}; > > > struct mana_ib_dev *mdev; > > > + bool is_rnic_cq = true; > > > + u32 doorbell; > > > int err; > > > > > > mdev = container_of(ibdev, struct mana_ib_dev, ib_dev); > > > > > > - if (udata->inlen < sizeof(ucmd)) > > > + cq->comp_vector = attr->comp_vector % ibdev->num_comp_vectors; > > > + cq->cq_handle = INVALID_MANA_HANDLE; > > > + > > > + if (udata->inlen < offsetof(struct mana_ib_create_cq, cq_buf_size)) > > > return -EINVAL; > > > > > > - cq->comp_vector = attr->comp_vector % ibdev->num_comp_vectors; > > > + if (udata->inlen == offsetof(struct mana_ib_create_cq, cq_buf_size)) > > > + is_rnic_cq = false; > > > > I think it's okay with checking on offset in uapi message to decide if this is a newer/updated RNIC uverb. Yes, this is the expected method > You should really try to avoid changing MANA_IB_UVERBS_ABI_VERSION as it > usually means that backward compatibility will be broken after such change. Yes, please don't do that. Jason
diff --git a/drivers/infiniband/hw/mana/cq.c b/drivers/infiniband/hw/mana/cq.c index 8323085..a62bda7 100644 --- a/drivers/infiniband/hw/mana/cq.c +++ b/drivers/infiniband/hw/mana/cq.c @@ -9,17 +9,25 @@ int mana_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, struct ib_udata *udata) { struct mana_ib_cq *cq = container_of(ibcq, struct mana_ib_cq, ibcq); + struct mana_ib_create_cq_resp resp = {}; + struct mana_ib_ucontext *mana_ucontext; struct ib_device *ibdev = ibcq->device; struct mana_ib_create_cq ucmd = {}; struct mana_ib_dev *mdev; + bool is_rnic_cq = true; + u32 doorbell; int err; mdev = container_of(ibdev, struct mana_ib_dev, ib_dev); - if (udata->inlen < sizeof(ucmd)) + cq->comp_vector = attr->comp_vector % ibdev->num_comp_vectors; + cq->cq_handle = INVALID_MANA_HANDLE; + + if (udata->inlen < offsetof(struct mana_ib_create_cq, cq_buf_size)) return -EINVAL; - cq->comp_vector = attr->comp_vector % ibdev->num_comp_vectors; + if (udata->inlen == offsetof(struct mana_ib_create_cq, cq_buf_size)) + is_rnic_cq = false; err = ib_copy_from_udata(&ucmd, udata, min(sizeof(ucmd), udata->inlen)); if (err) { @@ -28,19 +36,53 @@ int mana_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, return err; } - if (attr->cqe > mdev->adapter_caps.max_qp_wr) { + if (!is_rnic_cq && attr->cqe > mdev->adapter_caps.max_qp_wr) { ibdev_dbg(ibdev, "CQE %d exceeding limit\n", attr->cqe); return -EINVAL; } - cq->buf_size = attr->cqe * COMP_ENTRY_SIZE; + cq->buf_size = is_rnic_cq ? ucmd.cq_buf_size : attr->cqe * COMP_ENTRY_SIZE; err = mana_ib_create_queue(mdev, ucmd.buf_addr, cq->buf_size, &cq->queue); if (err) { ibdev_dbg(ibdev, "Failed to create queue for create cq, %d\n", err); return err; } + mana_ucontext = rdma_udata_to_drv_context(udata, struct mana_ib_ucontext, + ibucontext); + doorbell = mana_ucontext->doorbell; + + if (is_rnic_cq) { + err = mana_ib_gd_create_cq(mdev, cq, doorbell); + if (err) { + ibdev_dbg(ibdev, "Failed to create RNIC cq, %d\n", err); + goto err_destroy_queue; + } + + err = mana_ib_install_cq_cb(mdev, cq); + if (err) { + ibdev_dbg(ibdev, "Failed to install cq callback, %d\n", err); + goto err_destroy_rnic_cq; + } + } + + resp.cqid = cq->queue.id; + err = ib_copy_to_udata(udata, &resp, min(sizeof(resp), udata->outlen)); + if (err) { + ibdev_dbg(&mdev->ib_dev, "Failed to copy to udata, %d\n", err); + goto err_remove_cq_cb; + } + return 0; + +err_remove_cq_cb: + mana_ib_remove_cq_cb(mdev, cq); +err_destroy_rnic_cq: + mana_ib_gd_destroy_cq(mdev, cq); +err_destroy_queue: + mana_ib_destroy_queue(mdev, &cq->queue); + + return err; } int mana_ib_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata) @@ -52,6 +94,12 @@ int mana_ib_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata) mdev = container_of(ibdev, struct mana_ib_dev, ib_dev); mana_ib_remove_cq_cb(mdev, cq); + + /* Ignore return code as there is not much we can do about it. + * The error message is printed inside. + */ + mana_ib_gd_destroy_cq(mdev, cq); + mana_ib_destroy_queue(mdev, &cq->queue); return 0; diff --git a/include/uapi/rdma/mana-abi.h b/include/uapi/rdma/mana-abi.h index 5fcb31b..8fc9d32 100644 --- a/include/uapi/rdma/mana-abi.h +++ b/include/uapi/rdma/mana-abi.h @@ -18,6 +18,13 @@ struct mana_ib_create_cq { __aligned_u64 buf_addr; + __u32 cq_buf_size; + __u32 reserved; +}; + +struct mana_ib_create_cq_resp { + __u32 cqid; + __u32 reserved; }; struct mana_ib_create_qp {