> -----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]>

Reply via email to