From: Leon Romanovsky <leon@kernel.org>
To: Selvin Xavier <selvin.xavier@broadcom.com>
Cc: jgg@ziepe.ca, linux-rdma@vger.kernel.org
Subject: Re: [PATCH for-next 2/2] RDMA/bnxt_re: Share a page to expose per CQ info with userspace
Date: Wed, 13 Dec 2023 10:20:07 +0200 [thread overview]
Message-ID: <20231213082007.GN4870@unreal> (raw)
In-Reply-To: <1702438411-23530-3-git-send-email-selvin.xavier@broadcom.com>
On Tue, Dec 12, 2023 at 07:33:31PM -0800, Selvin Xavier wrote:
> Gen P7 adapters needs to share a toggle bits information received
> in kernel driver with the user space. User space needs this
> info during the request notify call back to arm the CQ.
>
> User space application can get this page using the
> UAPI routines. Library will mmap this page and get the
> toggle bits to be used in the next ARM Doorbell.
>
> Uses a hash list to map the CQ structure from the CQ ID.
> CQ structure is retrieved from the hash list while the
> library calls the UAPI routine to get the toggle page
> mapping. Currently the full page is mapped per CQ. This
> can be optimized to enable multiple CQs from the same
> application share the same page and different offsets
> in the page.
>
> Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
> ---
> drivers/infiniband/hw/bnxt_re/bnxt_re.h | 3 ++
> drivers/infiniband/hw/bnxt_re/ib_verbs.c | 59 +++++++++++++++++++++++++++----
> drivers/infiniband/hw/bnxt_re/ib_verbs.h | 2 ++
> drivers/infiniband/hw/bnxt_re/main.c | 10 +++++-
> drivers/infiniband/hw/bnxt_re/qplib_res.h | 6 ++++
> include/uapi/rdma/bnxt_re-abi.h | 5 +++
> 6 files changed, 77 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/infiniband/hw/bnxt_re/bnxt_re.h b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
> index 9fd9849..9dca451 100644
> --- a/drivers/infiniband/hw/bnxt_re/bnxt_re.h
> +++ b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
> @@ -41,6 +41,7 @@
> #define __BNXT_RE_H__
> #include <rdma/uverbs_ioctl.h>
> #include "hw_counters.h"
> +#include <linux/hashtable.h>
> #define ROCE_DRV_MODULE_NAME "bnxt_re"
>
> #define BNXT_RE_DESC "Broadcom NetXtreme-C/E RoCE Driver"
> @@ -135,6 +136,7 @@ struct bnxt_re_pacing {
> #define BNXT_RE_DB_FIFO_ROOM_SHIFT 15
> #define BNXT_RE_GRC_FIFO_REG_BASE 0x2000
>
> +#define MAX_CQ_HASH_BITS (16)
> struct bnxt_re_dev {
> struct ib_device ibdev;
> struct list_head list;
> @@ -189,6 +191,7 @@ struct bnxt_re_dev {
> struct bnxt_re_pacing pacing;
> struct work_struct dbq_fifo_check_work;
> struct delayed_work dbq_pacing_work;
> + DECLARE_HASHTABLE(cq_hash, MAX_CQ_HASH_BITS);
> };
>
> #define to_bnxt_re_dev(ptr, member) \
> diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
> index 76cea30..de3d404 100644
> --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
> +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
> @@ -50,6 +50,7 @@
> #include <rdma/ib_mad.h>
> #include <rdma/ib_cache.h>
> #include <rdma/uverbs_ioctl.h>
> +#include <linux/hashtable.h>
>
> #include "bnxt_ulp.h"
>
> @@ -2910,14 +2911,20 @@ int bnxt_re_post_recv(struct ib_qp *ib_qp, const struct ib_recv_wr *wr,
> /* Completion Queues */
> int bnxt_re_destroy_cq(struct ib_cq *ib_cq, struct ib_udata *udata)
> {
> - struct bnxt_re_cq *cq;
> + struct bnxt_qplib_chip_ctx *cctx;
> struct bnxt_qplib_nq *nq;
> struct bnxt_re_dev *rdev;
> + struct bnxt_re_cq *cq;
>
> cq = container_of(ib_cq, struct bnxt_re_cq, ib_cq);
> rdev = cq->rdev;
> nq = cq->qplib_cq.nq;
> + cctx = rdev->chip_ctx;
>
> + if (cctx->modes.toggle_bits & BNXT_QPLIB_CQ_TOGGLE_BIT) {
> + free_page((unsigned long)cq->uctx_cq_page);
> + hash_del(&cq->hash_entry);
> + }
> bnxt_qplib_destroy_cq(&rdev->qplib_res, &cq->qplib_cq);
> ib_umem_release(cq->umem);
>
> @@ -2935,10 +2942,11 @@ int bnxt_re_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
> struct bnxt_re_ucontext *uctx =
> rdma_udata_to_drv_context(udata, struct bnxt_re_ucontext, ib_uctx);
> struct bnxt_qplib_dev_attr *dev_attr = &rdev->dev_attr;
> - int rc, entries;
> - int cqe = attr->cqe;
> + struct bnxt_qplib_chip_ctx *cctx;
> struct bnxt_qplib_nq *nq = NULL;
> unsigned int nq_alloc_cnt;
> + int rc = -1, entries;
Why -1 and not some -EXXX value?
> + int cqe = attr->cqe;
> u32 active_cqs;
>
> if (attr->flags)
> @@ -2951,6 +2959,7 @@ int bnxt_re_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
> }
>
> cq->rdev = rdev;
> + cctx = rdev->chip_ctx;
> cq->qplib_cq.cq_handle = (u64)(unsigned long)(&cq->qplib_cq);
>
> entries = bnxt_re_init_depth(cqe + 1, uctx);
> @@ -3012,8 +3021,16 @@ int bnxt_re_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
> spin_lock_init(&cq->cq_lock);
>
> if (udata) {
> - struct bnxt_re_cq_resp resp;
> -
> + struct bnxt_re_cq_resp resp = {};
> +
> + if (cctx->modes.toggle_bits & BNXT_QPLIB_CQ_TOGGLE_BIT) {
This bit is set for all gen_p7 cards, but bnxt_re_cq_resp doesn't have
comp_mask field in old rdma-core and it will cause to ib_copy_to_udata()
fail, isn't it?
> + hash_add(rdev->cq_hash, &cq->hash_entry, cq->qplib_cq.id);
> + /* Allocate a page */
> + cq->uctx_cq_page = (void *)get_zeroed_page(GFP_KERNEL);
> + if (!cq->uctx_cq_page)
> + goto c2fail;
> + resp.comp_mask |= BNXT_RE_CQ_TOGGLE_PAGE_SUPPORT;
> + }
Thanks
next prev parent reply other threads:[~2023-12-13 8:20 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-13 3:33 [PATCH for-next 0/2] RDMA/bnxt_re: Share the CQ pages for GenP7 adapters Selvin Xavier
2023-12-13 3:33 ` [PATCH for-next 1/2] RDMA/bnxt_re: Add UAPI to share a page with user space Selvin Xavier
2023-12-13 8:09 ` Leon Romanovsky
2023-12-13 8:17 ` Selvin Xavier
2023-12-13 15:59 ` kernel test robot
2023-12-13 3:33 ` [PATCH for-next 2/2] RDMA/bnxt_re: Share a page to expose per CQ info with userspace Selvin Xavier
2023-12-13 8:20 ` Leon Romanovsky [this message]
2023-12-13 8:38 ` Selvin Xavier
2023-12-13 16:21 ` kernel test robot
2023-12-13 19:48 ` kernel test robot
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=20231213082007.GN4870@unreal \
--to=leon@kernel.org \
--cc=jgg@ziepe.ca \
--cc=linux-rdma@vger.kernel.org \
--cc=selvin.xavier@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.