RE: [PATCH rdma-next v2 1/3] RDMA/mana_ib: Extend RC QP udata request and response

From: Long Li

Date: Fri Aug 28 2026 - 15:24:45 EST


> From: Konstantin Taranov <kotaranov@xxxxxxxxxxxxx>
>
> Extend the RC QP creation UAPI to support optional fixed-size WQEs and an
> MMQ. Add a compatibility mask to the request, return the MMQ ID in the
> response, and advertise the extended ABI through ucontext capabilities.
>
> Use compatibility-aware udata validation so existing userspace remains
> supported. Rename the legacy FMR queue definitions to MMQ and add the
> corresponding hardware creation flags.
>
> Signed-off-by: Konstantin Taranov <kotaranov@xxxxxxxxxxxxx>

Reviewed-by: Long Li <longli@xxxxxxxxxxxxx>




> ---
> v1->v2: use << instead of BIT() in the mana-abi.h
> drivers/infiniband/hw/mana/main.c | 1 +
> drivers/infiniband/hw/mana/mana_ib.h | 6 ++++--
> drivers/infiniband/hw/mana/qp.c | 10 +++++-----
> include/uapi/rdma/mana-abi.h | 11 +++++++++++
> 4 files changed, 21 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/infiniband/hw/mana/main.c
> b/drivers/infiniband/hw/mana/main.c
> index e4414d208..9d043f48e 100644
> --- a/drivers/infiniband/hw/mana/main.c
> +++ b/drivers/infiniband/hw/mana/main.c
> @@ -247,6 +247,7 @@ int mana_ib_alloc_ucontext(struct ib_ucontext
> *ibcontext,
>
> ucontext->doorbell = doorbell_page;
> ucmd_resp.comp_mask = MANA_IB_UCNTX_ALLOC_PDN_SUPPORT;
> + ucmd_resp.comp_mask |= MANA_IB_UCNTX_RC_EXT_SUPPORT;
> ret = ib_respond_udata(udata, ucmd_resp);
> if (ret)
> return ret;
> diff --git a/drivers/infiniband/hw/mana/mana_ib.h
> b/drivers/infiniband/hw/mana/mana_ib.h
> index f69866696..547ddf9dd 100644
> --- a/drivers/infiniband/hw/mana/mana_ib.h
> +++ b/drivers/infiniband/hw/mana/mana_ib.h
> @@ -172,7 +172,7 @@ struct mana_ib_cq {
> enum mana_rc_queue_type {
> MANA_RC_SEND_QUEUE_REQUESTER = 0,
> MANA_RC_SEND_QUEUE_RESPONDER,
> - MANA_RC_SEND_QUEUE_FMR,
> + MANA_RC_SEND_QUEUE_MMQ,
> MANA_RC_RECV_QUEUE_REQUESTER,
> MANA_RC_RECV_QUEUE_RESPONDER,
> MANA_RC_QUEUE_TYPE_MAX,
> @@ -372,7 +372,9 @@ struct mana_rnic_destroy_cq_resp { }; /* HW Data */
>
> enum mana_rnic_create_rc_flags {
> - MANA_RC_FLAG_NO_FMR = 2,
> + MANA_RC_FLAG_NO_MMQ = BIT(1),
> + MANA_RC_FLAG_FIXED_SIZE_WQE = BIT(3),
> + MANA_RC_FLAG_MSN_IN_WQE = BIT(4),
> };
>
> struct mana_rnic_create_qp_req {
> diff --git a/drivers/infiniband/hw/mana/qp.c
> b/drivers/infiniband/hw/mana/qp.c index 8b7be1255..aa5f8c607 100644
> --- a/drivers/infiniband/hw/mana/qp.c
> +++ b/drivers/infiniband/hw/mana/qp.c
> @@ -549,14 +549,14 @@ static int mana_ib_create_rc_qp(struct ib_qp *ibqp,
> struct ib_pd *ibpd,
>
> mana_ucontext = rdma_udata_to_drv_context(udata, struct
> mana_ib_ucontext, ibucontext);
> doorbell = mana_ucontext->doorbell;
> - flags = MANA_RC_FLAG_NO_FMR;
> - err = ib_copy_validate_udata_in(udata, ucmd, queue_size);
> + flags = MANA_RC_FLAG_NO_MMQ;
> + err = ib_copy_validate_udata_in_cm(udata, ucmd, queue_size,
> + MANA_IB_RC_QP_FIXED_WQE |
> MANA_IB_RC_MMQ_CREATE);
> if (err)
> return err;
>
> for (i = 0, j = 0; i < MANA_RC_QUEUE_TYPE_MAX; ++i) {
> - /* skip FMR for user-level RC QPs */
> - if (i == MANA_RC_SEND_QUEUE_FMR) {
> + if (i == MANA_RC_SEND_QUEUE_MMQ) {
> qp->rc_qp.queues[i].id = INVALID_QUEUE_ID;
> qp->rc_qp.queues[i].gdma_region =
> GDMA_INVALID_DMA_REGION;
> continue;
> @@ -580,7 +580,7 @@ static int mana_ib_create_rc_qp(struct ib_qp *ibqp,
> struct ib_pd *ibpd,
>
> if (udata) {
> for (i = 0, j = 0; i < MANA_RC_QUEUE_TYPE_MAX; ++i) {
> - if (i == MANA_RC_SEND_QUEUE_FMR)
> + if (i == MANA_RC_SEND_QUEUE_MMQ)
> continue;
> resp.queue_id[j] = qp->rc_qp.queues[i].id;
> j++;
> diff --git a/include/uapi/rdma/mana-abi.h b/include/uapi/rdma/mana-abi.h
> index 32cbbfc80..c9a241766 100644
> --- a/include/uapi/rdma/mana-abi.h
> +++ b/include/uapi/rdma/mana-abi.h
> @@ -48,13 +48,23 @@ struct mana_ib_create_qp_resp {
> __u32 reserved;
> };
>
> +enum mana_ib_create_rc_qp_flags {
> + MANA_IB_RC_QP_FIXED_WQE = 1 << 0,
> + MANA_IB_RC_MMQ_CREATE = 1 << 1,
> +};
> +
> struct mana_ib_create_rc_qp {
> __aligned_u64 queue_buf[4];
> __u32 queue_size[4];
> + __aligned_u64 mmq_buf;
> + __u32 mmq_size;
> + __u32 comp_mask;
> };
>
> struct mana_ib_create_rc_qp_resp {
> __u32 queue_id[4];
> + __u32 mmq_id;
> + __u32 reserved;
> };
>
> struct mana_ib_create_uc_qp {
> @@ -100,6 +110,7 @@ struct mana_ib_create_qp_rss_resp {
>
> enum mana_ib_ucontext_support {
> MANA_IB_UCNTX_ALLOC_PDN_SUPPORT = 1 << 0,
> + MANA_IB_UCNTX_RC_EXT_SUPPORT = 1 << 1,
> };
>
> struct mana_ib_alloc_ucontext_resp {
> --
> 2.43.0