Re: [PATCH for-next v4 3/4] RDMA/bnxt_re: Add uverbs object handle path for CQ/SRQ toggle page

Selvin Xavier <[email protected]> Mon, 27 Jul 2026 14:39:50 +0530
Newsgroups org.kernel.vger.linux-rdma
Message-ID <CA+sbYW35-sFwrERJbKCjggPgMeCvRsC3aa7B0+J21YWLkAqe5Q@mail.gmail.com>
On Mon, Jul 27, 2026 at 2:37 PM Leon Romanovsky <[email protected]> wrote:
>
> On Mon, Jul 27, 2026 at 12:26:46PM +0530, Selvin Xavier wrote:
> > On Mon, Jul 27, 2026 at 11:51 AM Leon Romanovsky <[email protected]> wrote:
> > >
> > > On Tue, Jul 21, 2026 at 04:54:39AM -0700, Selvin Xavier wrote:
> > > > The current GET_TOGGLE_MEM ioctl requires the caller to supply
> > > > a type enum and a raw hardware queue ID (RES_ID). The kernel
> > > > looks up the CQ or SRQ by that ID without verifying that the
> > > > caller owns the resource.
> > > >
> > > > Add a new, preferred code path that accepts standard uverbs
> > > > object handles (BNXT_RE_TOGGLE_MEM_CQ_HANDLE /
> > > > BNXT_RE_TOGGLE_MEM_SRQ_HANDLE) instead. The uverbs core validates
> > > > that the handle belongs to the calling context as part of resolving
> > > > it, so this path no longer needs the driver's own XArray lookup for
> > > > ownership checking. As with the legacy path, the toggle_entry's own
> > > > mmap-entry refcount (not a CQ/SRQ uobject reference) is what pins
> > > > the toggle page for the life of the GET_TOGGLE_MEM handle.
> > > >
> > > > Only newer rdma-core versions support this path, if the
> > > > driver reports the supported resp mask
> > > > (BNXT_RE_UCNTX_CMASK_TOGGLE_MEM_UOBJ_SUPPORT).
> > > > The existing TYPE + RES_ID path is retained for backward
> > > > compatibility with older rdma-core.
> > > >
> > > > Suggested-by: Jason Gunthorpe <[email protected]>
> > > > Signed-off-by: Selvin Xavier <[email protected]>
> > > > ---
> > > >  drivers/infiniband/hw/bnxt_re/ib_verbs.c |  2 +
> > > >  drivers/infiniband/hw/bnxt_re/uapi.c     | 55 +++++++++++++++++++++---
> > > >  include/uapi/rdma/bnxt_re-abi.h          |  4 ++
> > > >  3 files changed, 56 insertions(+), 5 deletions(-)
> > > >
> > > > diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
> > > > index 0ff862ca982c..a14b17d4261f 100644
> > > > --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
> > > > +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
> > > > @@ -4872,6 +4872,8 @@ int bnxt_re_alloc_ucontext(struct ib_ucontext *ctx, struct ib_udata *udata)
> > > >       if (_is_modify_qp_rate_limit_supported(dev_attr->dev_cap_flags2))
> > > >               resp.comp_mask |= BNXT_RE_UCNTX_CMASK_QP_RATE_LIMIT_ENABLED;
> > > >
> > > > +     resp.comp_mask |= BNXT_RE_UCNTX_CMASK_TOGGLE_MEM_UOBJ_SUPPORT;
> > > > +
> > > >       if (udata->inlen) {
> > > >               rc = ib_copy_validate_udata_in_cm(
> > > >                       udata, ureq, comp_mask,
> > > > diff --git a/drivers/infiniband/hw/bnxt_re/uapi.c b/drivers/infiniband/hw/bnxt_re/uapi.c
> > > > index 97bc0e755511..feaf98631fc5 100644
> > > > --- a/drivers/infiniband/hw/bnxt_re/uapi.c
> > > > +++ b/drivers/infiniband/hw/bnxt_re/uapi.c
> > > > @@ -237,16 +237,52 @@ static int UVERBS_HANDLER(BNXT_RE_METHOD_GET_TOGGLE_MEM)(struct uverbs_attr_bund
> > > >       if (IS_ERR(ib_uctx))
> > > >               return PTR_ERR(ib_uctx);
> > > >
> > > > +     uctx = container_of(ib_uctx, struct bnxt_re_ucontext, ib_uctx);
> > > > +
> > > > +     /* New path: updated libbnxt_re passes the CQ or SRQ uverbs handle */
> > > > +     if (uverbs_attr_is_valid(attrs, BNXT_RE_TOGGLE_MEM_CQ_HANDLE)) {
> > > > +             struct bnxt_re_cq *cq;
> > > > +
> > > > +             res_uobj = uverbs_attr_get_uobject(attrs,
> > > > +                                                BNXT_RE_TOGGLE_MEM_CQ_HANDLE);
> > > > +             if (IS_ERR(res_uobj))
> > > > +                     return PTR_ERR(res_uobj);
> > > > +             cq = container_of(res_uobj->object, struct bnxt_re_cq, ib_cq);
> > > > +             if (!cq->toggle_entry)
> > > > +                     return -EOPNOTSUPP;
> > > > +             mmap_offset = rdma_user_mmap_get_offset(&cq->toggle_entry->rdma_entry);
> > > > +             if (!mmap_offset)
> > > > +                     return -EOPNOTSUPP;
> > > > +             kref_get(&cq->toggle_entry->rdma_entry.ref);
> > > > +             toggle_entry = cq->toggle_entry;
> > > > +             goto alloc_tmem;
> > > > +     } else if (uverbs_attr_is_valid(attrs, BNXT_RE_TOGGLE_MEM_SRQ_HANDLE)) {
> > > > +             struct bnxt_re_srq *srq;
> > > > +
> > > > +             res_uobj = uverbs_attr_get_uobject(attrs,
> > > > +                                                BNXT_RE_TOGGLE_MEM_SRQ_HANDLE);
> > > > +             if (IS_ERR(res_uobj))
> > > > +                     return PTR_ERR(res_uobj);
> > > > +             srq = container_of(res_uobj->object, struct bnxt_re_srq, ib_srq);
> > > > +             if (!srq->toggle_entry)
> > > > +                     return -EOPNOTSUPP;
> > > > +             mmap_offset = rdma_user_mmap_get_offset(&srq->toggle_entry->rdma_entry);
> > > > +             if (!mmap_offset)
> > > > +                     return -EOPNOTSUPP;
> > > > +             kref_get(&srq->toggle_entry->rdma_entry.ref);
> > > > +             toggle_entry = srq->toggle_entry;
> > > > +             goto alloc_tmem;
> > > > +     }
> > > > +
> > > >       err = uverbs_get_const(&res_type, attrs, BNXT_RE_TOGGLE_MEM_TYPE);
> > > >       if (err)
> > > >               return err;
> > > > -
> > > > -     uctx = container_of(ib_uctx, struct bnxt_re_ucontext, ib_uctx);
> > > >       err = uverbs_copy_from(&res_id, attrs, BNXT_RE_TOGGLE_MEM_RES_ID);
> > > >       if (err)
> > > >               return err;
> > > >
> > > >       /*
> > > > +      * Legacy path: old libbnxt_re sends TYPE + RES_ID.
> > > >        * Hold xa_lock across xa_load + kref_get so that a concurrent
> > > >        * bnxt_re_destroy_cq/srq cannot call __xa_erase and remove the
> > > >        * toggle_entry between our load and our reference on it.
> > > > @@ -297,6 +333,7 @@ static int UVERBS_HANDLER(BNXT_RE_METHOD_GET_TOGGLE_MEM)(struct uverbs_attr_bund
> > > >       if (!mmap_offset)
> > > >               return -EOPNOTSUPP;
> > > >
> > > > +alloc_tmem:
> > > >       tmem = kzalloc_obj(*tmem);
> > > >       if (!tmem) {
> > > >               rdma_user_mmap_entry_put(&toggle_entry->rdma_entry);
> > > > @@ -343,10 +380,10 @@ DECLARE_UVERBS_NAMED_METHOD(BNXT_RE_METHOD_GET_TOGGLE_MEM,
> > > >                                           UA_MANDATORY),
> > > >                           UVERBS_ATTR_CONST_IN(BNXT_RE_TOGGLE_MEM_TYPE,
> > > >                                                enum bnxt_re_get_toggle_mem_type,
> > > > -                                              UA_MANDATORY),
> > > > +                                              UA_OPTIONAL),
> > > >                           UVERBS_ATTR_PTR_IN(BNXT_RE_TOGGLE_MEM_RES_ID,
> > > >                                              UVERBS_ATTR_TYPE(u32),
> > > > -                                            UA_MANDATORY),
> > > > +                                            UA_OPTIONAL),
> > > >                           UVERBS_ATTR_PTR_OUT(BNXT_RE_TOGGLE_MEM_MMAP_PAGE,
> > > >                                               UVERBS_ATTR_TYPE(u64),
> > > >                                               UA_MANDATORY),
> > > > @@ -355,7 +392,15 @@ DECLARE_UVERBS_NAMED_METHOD(BNXT_RE_METHOD_GET_TOGGLE_MEM,
> > > >                                               UA_MANDATORY),
> > > >                           UVERBS_ATTR_PTR_OUT(BNXT_RE_TOGGLE_MEM_MMAP_LENGTH,
> > > >                                               UVERBS_ATTR_TYPE(u32),
> > > > -                                             UA_MANDATORY));
> > > > +                                             UA_MANDATORY),
> > > > +                         UVERBS_ATTR_IDR(BNXT_RE_TOGGLE_MEM_CQ_HANDLE,
> > > > +                                         UVERBS_OBJECT_CQ,
> > > > +                                         UVERBS_ACCESS_READ,
> > > > +                                         UA_OPTIONAL),
> > > > +                         UVERBS_ATTR_IDR(BNXT_RE_TOGGLE_MEM_SRQ_HANDLE,
> > > > +                                         UVERBS_OBJECT_SRQ,
> > > > +                                         UVERBS_ACCESS_READ,
> > > > +                                         UA_OPTIONAL));
> > > >
> > > >  DECLARE_UVERBS_NAMED_METHOD_DESTROY(BNXT_RE_METHOD_RELEASE_TOGGLE_MEM,
> > > >                                   UVERBS_ATTR_IDR(BNXT_RE_RELEASE_TOGGLE_MEM_HANDLE,
> > > > diff --git a/include/uapi/rdma/bnxt_re-abi.h b/include/uapi/rdma/bnxt_re-abi.h
> > > > index a4599d7b736a..c0ee9ce389ac 100644
> > > > --- a/include/uapi/rdma/bnxt_re-abi.h
> > > > +++ b/include/uapi/rdma/bnxt_re-abi.h
> > > > @@ -57,6 +57,8 @@ enum {
> > > >       BNXT_RE_UCNTX_CMASK_POW2_DISABLED = 0x10ULL,
> > > >       BNXT_RE_UCNTX_CMASK_MSN_TABLE_ENABLED = 0x40,
> > > >       BNXT_RE_UCNTX_CMASK_QP_RATE_LIMIT_ENABLED = 0x80ULL,
> > > > +      /* Some reserved fields to manage compatibility with Out of tree drivers */
> > >
> > > Selvin,
> > >
> > > What did you mean with this comment?
> > This CMASK tracks the feature compatibility. Broadcom distributes an
> > out-of-tree driver
> > with some of the features that are not available in the upstream
> > driver. Some of these
> > features are debug only or features applicable for the next revision
> > of the chip (which is not
> > supported yet in the upstream driver). Since we want our inbox
> > libraries to work with
> > the out-of-tree drivers (and vice versa),  we are maintaining ABI
> > compatibility and I will
> > have to keep reserved/holes in the feature definition of this
> > compatibility mask.
>
> There are still plenty of numbers available, and the numbering is
> entirely up to you. We do not want any association with OOT code.
> Once you run out of available numbers, we will ask you to use those
> reserved in the hole.
>
> I will remove this line when applying the patch. Is that OK?
Sure. I am fine with that.

Thanks,

>
> Thanks
>
> >
> > Thanks
> > >
> > > Thanks
> > >
> > > > +     BNXT_RE_UCNTX_CMASK_TOGGLE_MEM_UOBJ_SUPPORT = 0x400000ULL,
> > > >  };
> > > >
> > > >  enum bnxt_re_wqe_mode {
> > > > @@ -218,6 +220,8 @@ enum bnxt_re_var_toggle_mem_attrs {
> > > >       BNXT_RE_TOGGLE_MEM_MMAP_PAGE,
> > > >       BNXT_RE_TOGGLE_MEM_MMAP_OFFSET,
> > > >       BNXT_RE_TOGGLE_MEM_MMAP_LENGTH,
> > > > +     BNXT_RE_TOGGLE_MEM_CQ_HANDLE,
> > > > +     BNXT_RE_TOGGLE_MEM_SRQ_HANDLE,
> > > >  };
> > > >
> > > >  enum bnxt_re_toggle_mem_attrs {
> > > > --
> > > > 2.39.3
> > > >
>
>
smime.p7s (application/pkcs7-signature, 5.3 KB) - not displayed