Linux RDMA and InfiniBand development
 help / color / mirror / Atom feed
From: Leon Romanovsky <leon@kernel.org>
To: Selvin Xavier <selvin.xavier@broadcom.com>
Cc: jgg@ziepe.ca, linux-rdma@vger.kernel.org,
	andrew.gospodarek@broadcom.com,
	kalesh-anakkur.purayil@broadcom.com,
	sriharsha.basavapatna@broadcom.com, alhouseenyousef@gmail.com,
	Jason Gunthorpe <jgg@nvidia.com>
Subject: Re: [PATCH for-next v4 3/4] RDMA/bnxt_re: Add uverbs object handle path for CQ/SRQ toggle page
Date: Mon, 27 Jul 2026 09:21:28 +0300	[thread overview]
Message-ID: <20260727062128.GI12003@unreal> (raw)
In-Reply-To: <20260721115440.24021-4-selvin.xavier@broadcom.com>

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 <jgg@nvidia.com>
> Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
> ---
>  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?

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
> 

  reply	other threads:[~2026-07-27  6:21 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-21 11:54 [PATCH for-next v4 0/4] RDMA/bnxt_re: Update the toggle page handling of CQ and SRQ Selvin Xavier
2026-07-21 11:54 ` [PATCH for-next v4 1/4] RDMA/bnxt_re: Replace per-device hash tables with per-context XArrays Selvin Xavier
2026-07-21 11:54 ` [PATCH for-next v4 2/4] RDMA/bnxt_re: Defer toggle page free to rdma_user_mmap_entry teardown Selvin Xavier
2026-07-21 11:54 ` [PATCH for-next v4 3/4] RDMA/bnxt_re: Add uverbs object handle path for CQ/SRQ toggle page Selvin Xavier
2026-07-27  6:21   ` Leon Romanovsky [this message]
2026-07-27  6:56     ` Selvin Xavier
2026-07-27  9:07       ` Leon Romanovsky
2026-07-27  9:09         ` Selvin Xavier
2026-07-21 11:54 ` [PATCH for-next v4 4/4] RDMA/bnxt_re: Clear VM_MAYWRITE on DBR/toggle page mmap Selvin Xavier
2026-07-22 16:20 ` (subset) [PATCH for-next v4 0/4] RDMA/bnxt_re: Update the toggle page handling of CQ and SRQ Leon Romanovsky
2026-07-27  9:52 ` Leon Romanovsky

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260727062128.GI12003@unreal \
    --to=leon@kernel.org \
    --cc=alhouseenyousef@gmail.com \
    --cc=andrew.gospodarek@broadcom.com \
    --cc=jgg@nvidia.com \
    --cc=jgg@ziepe.ca \
    --cc=kalesh-anakkur.purayil@broadcom.com \
    --cc=linux-rdma@vger.kernel.org \
    --cc=selvin.xavier@broadcom.com \
    --cc=sriharsha.basavapatna@broadcom.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox