> -----Original Message-----
> From: David Hu <[email protected]>
> Sent: Friday, October 30, 2026 7:15 PM
> To: Mustafa Ismail <[email protected]>; Shiraz Saleem
> <[email protected]>; Leon Romanovsky <[email protected]>; Jason
> Gunthorpe <[email protected]>
> Cc: Jacob Moroni <[email protected]>; [email protected];
> [email protected]; [email protected]; David, Hu
> <[email protected]>
> Subject: [PATCH rdma-next v4 1/6] RDMA/irdma: Plumb uverbs_attr_bundle
> for QP, SRQ
>
> From: David Hu <[email protected]>
>
> In preparation to support modern UVERBS ioctl attributes (such as
> UVERBS_ATTR_UMEM for CoCo DMA bounce buffers), we pass down
> `uverbs_attr_bundle` for inner QP, SRQ routines. Since standard uAPIs
> provide `ib_udata`, we derive it via the helper macro,
> `rdma_udata_to_uverbs_attr_bundle`. `irdma_create_cq()` supports
> `uverbs_attr_bundle` already, therefore, this patch fills the gap for QP
> and SRQ.
>
> QP, SRQ uAPI will now have `ib_udata`, and CQ uAPI has
> `uverbs_attr_bundle` as a top level input. However, we think it is a
> future project to unify them.
>
> Signed-off-by: David Hu <[email protected]>
> ---
> drivers/infiniband/hw/irdma/verbs.c | 19 +++++++++++++++----
> 1 file changed, 15 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/infiniband/hw/irdma/verbs.c
> b/drivers/infiniband/hw/irdma/verbs.c
> index c91c55917de9..811b1d532599 100644
> --- a/drivers/infiniband/hw/irdma/verbs.c
> +++ b/drivers/infiniband/hw/irdma/verbs.c
> @@ -637,13 +637,15 @@ static void irdma_setup_virt_qp(struct
> irdma_device *iwdev,
> * @iwqp: qp ptr (user or kernel)
> * @info: initialize info to return
> * @init_attr: Initial QP create attributes
> + * @attrs: uverbs attribute bundle
> */
> static int irdma_setup_umode_qp(struct irdma_ucontext *ucontext,
> struct irdma_create_qp_req *req,
> struct irdma_device *iwdev,
> struct irdma_qp *iwqp,
> struct irdma_qp_init_info *info,
> - struct ib_qp_init_attr *init_attr)
> + struct ib_qp_init_attr *init_attr,
> + struct uverbs_attr_bundle *attrs)
> {
> struct irdma_qp_uk_init_info *ukinfo = &info->qp_uk_init_info;
> unsigned long flags;
> @@ -981,10 +983,14 @@ static int irdma_create_qp(struct ib_qp *ibqp,
> struct irdma_qp_init_info init_info = {};
> struct irdma_qp_host_ctx_info *ctx_info;
> struct irdma_create_qp_req ureq = {};
> + struct uverbs_attr_bundle *attrs = NULL;
> struct irdma_srq *iwsrq;
> bool srq_valid = false;
> u32 srq_id = 0;
>
> + if (udata)
> + attrs = rdma_udata_to_uverbs_attr_bundle(udata);
> +
> if (init_attr->srq) {
> iwsrq = to_iwsrq(init_attr->srq);
> srq_valid = true;
> @@ -1071,7 +1077,7 @@ static int irdma_create_qp(struct ib_qp *ibqp,
>
> init_info.qp_uk_init_info.abi_ver = iwpd->sc_pd.abi_ver;
> err_code = irdma_setup_umode_qp(ucontext, &ureq, iwdev,
> iwqp,
> - &init_info, init_attr);
> + &init_info, init_attr,
> attrs);
> } else {
> INIT_DELAYED_WORK(&iwqp->dwork_flush, irdma_flush_worker);
> init_info.qp_uk_init_info.abi_ver = IRDMA_ABI_VER; @@ -
> 2337,7 +2343,8 @@ static int irdma_modify_srq(struct ib_srq *ibsrq,
> struct ib_srq_attr *attr, static int irdma_setup_umode_srq(struct
> irdma_device *iwdev,
> struct irdma_srq *iwsrq,
> struct irdma_srq_init_info *info,
> - struct ib_udata *udata)
> + struct ib_udata *udata,
> + struct uverbs_attr_bundle *attrs)
> {
> struct irdma_create_srq_req req = {};
> struct irdma_ucontext *ucontext;
> @@ -2420,6 +2427,7 @@ static int irdma_create_srq(struct ib_srq *ibsrq,
> struct ib_srq_attr *attr = &initattrs->attr;
> struct irdma_pd *iwpd = to_iwpd(ibsrq->pd);
> struct irdma_srq *iwsrq = to_iwsrq(ibsrq);
> + struct uverbs_attr_bundle *attrs = NULL;
> struct irdma_srq_uk_init_info *ukinfo;
> struct irdma_cqp_request *cqp_request;
> struct irdma_srq_init_info info = {};
> @@ -2430,6 +2438,9 @@ static int irdma_create_srq(struct ib_srq *ibsrq,
> u32 depth;
> u8 shift;
>
> + if (udata)
> + attrs = rdma_udata_to_uverbs_attr_bundle(udata);
> +
> uk_attrs = &rf->sc_dev.hw_attrs.uk_attrs;
> ukinfo = &info.srq_uk_init_info;
>
> @@ -2470,7 +2481,7 @@ static int irdma_create_srq(struct ib_srq *ibsrq,
> attr->max_wr = iwsrq->max_wr;
>
> if (udata)
> - err_code = irdma_setup_umode_srq(iwdev, iwsrq, &info,
> udata);
> + err_code = irdma_setup_umode_srq(iwdev, iwsrq, &info,
> udata, attrs);
> else
> err_code = irdma_setup_kmode_srq(iwdev, iwsrq, &info,
> depth,
> shift);
> --
> 2.56.0.317.g454f8302e1-goog
Reviewed-by: Aleksandr Loktionov <[email protected]>