* [PATCH for-next 0/3] RDMA/bnxt_re: Toggle bit support for SRQ events
@ 2024-08-28 8:47 Selvin Xavier
2024-08-28 8:47 ` [PATCH for-next 1/3] RDMA/bnxt_re: Get the toggle bits from " Selvin Xavier
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Selvin Xavier @ 2024-08-28 8:47 UTC (permalink / raw)
To: leon, jgg
Cc: linux-rdma, andrew.gospodarek, chandramohan.akula, Selvin Xavier
SRQ events from HW gives a toggle bit value that needs
to be used while ringing the SRQ arm doorbells. Adds support
for this and share the toggle value to user space applications.
Please review and apply.
Thanks,
Selvin Xavier
Chandramohan Akula (2):
RDMA/bnxt_re: Refactor the BNXT_RE_METHOD_GET_TOGGLE_MEM method
RDMA/bnxt_re: Share a page to expose per SRQ info with userspace
Hongguang Gao (1):
RDMA/bnxt_re: Get the toggle bits from SRQ events
drivers/infiniband/hw/bnxt_re/bnxt_re.h | 2 ++
drivers/infiniband/hw/bnxt_re/ib_verbs.c | 52 ++++++++++++++++++++++++--------
drivers/infiniband/hw/bnxt_re/ib_verbs.h | 2 ++
drivers/infiniband/hw/bnxt_re/main.c | 6 +++-
drivers/infiniband/hw/bnxt_re/qplib_fp.c | 11 +++++++
drivers/infiniband/hw/bnxt_re/qplib_fp.h | 1 +
include/uapi/rdma/bnxt_re-abi.h | 5 +++
7 files changed, 66 insertions(+), 13 deletions(-)
--
2.5.5
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH for-next 1/3] RDMA/bnxt_re: Get the toggle bits from SRQ events
2024-08-28 8:47 [PATCH for-next 0/3] RDMA/bnxt_re: Toggle bit support for SRQ events Selvin Xavier
@ 2024-08-28 8:47 ` Selvin Xavier
2024-08-28 8:47 ` [PATCH for-next 2/3] RDMA/bnxt_re: Refactor the BNXT_RE_METHOD_GET_TOGGLE_MEM method Selvin Xavier
2024-08-28 8:47 ` [PATCH for-next 3/3] RDMA/bnxt_re: Share a page to expose per SRQ info with userspace Selvin Xavier
2 siblings, 0 replies; 6+ messages in thread
From: Selvin Xavier @ 2024-08-28 8:47 UTC (permalink / raw)
To: leon, jgg
Cc: linux-rdma, andrew.gospodarek, chandramohan.akula, Hongguang Gao,
Selvin Xavier
From: Hongguang Gao <hongguang.gao@broadcom.com>
SRQ arming requires the toggle bits received from hardware.
Get the toggle bits from SRQ notification for the
gen p7 adapters. This value will be zero for the older adapters.
Signed-off-by: Hongguang Gao <hongguang.gao@broadcom.com>
Signed-off-by: Chandramohan Akula <chandramohan.akula@broadcom.com>
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
---
drivers/infiniband/hw/bnxt_re/ib_verbs.h | 1 +
drivers/infiniband/hw/bnxt_re/qplib_fp.c | 11 +++++++++++
drivers/infiniband/hw/bnxt_re/qplib_fp.h | 1 +
3 files changed, 13 insertions(+)
diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.h b/drivers/infiniband/hw/bnxt_re/ib_verbs.h
index 3ddeda3..4e113b9 100644
--- a/drivers/infiniband/hw/bnxt_re/ib_verbs.h
+++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.h
@@ -77,6 +77,7 @@ struct bnxt_re_srq {
struct bnxt_qplib_srq qplib_srq;
struct ib_umem *umem;
spinlock_t lock; /* protect srq */
+ void *uctx_srq_page;
};
struct bnxt_re_qp {
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.c b/drivers/infiniband/hw/bnxt_re/qplib_fp.c
index 49e4a4a..19bb453 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_fp.c
+++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.c
@@ -54,6 +54,10 @@
#include "qplib_rcfw.h"
#include "qplib_sp.h"
#include "qplib_fp.h"
+#include <rdma/ib_addr.h>
+#include "bnxt_ulp.h"
+#include "bnxt_re.h"
+#include "ib_verbs.h"
static void __clean_cq(struct bnxt_qplib_cq *cq, u64 qp);
@@ -347,6 +351,7 @@ static void bnxt_qplib_service_nq(struct tasklet_struct *t)
case NQ_BASE_TYPE_SRQ_EVENT:
{
struct bnxt_qplib_srq *srq;
+ struct bnxt_re_srq *srq_p;
struct nq_srq_event *nqsrqe =
(struct nq_srq_event *)nqe;
@@ -354,6 +359,12 @@ static void bnxt_qplib_service_nq(struct tasklet_struct *t)
q_handle |= (u64)le32_to_cpu(nqsrqe->srq_handle_high)
<< 32;
srq = (struct bnxt_qplib_srq *)q_handle;
+ srq->toggle = (le16_to_cpu(nqe->info10_type) & NQ_CN_TOGGLE_MASK)
+ >> NQ_CN_TOGGLE_SFT;
+ srq->dbinfo.toggle = srq->toggle;
+ srq_p = container_of(srq, struct bnxt_re_srq, qplib_srq);
+ if (srq_p->uctx_srq_page)
+ *((u32 *)srq_p->uctx_srq_page) = srq->toggle;
bnxt_qplib_armen_db(&srq->dbinfo,
DBC_DBC_TYPE_SRQ_ARMENA);
if (nq->srqn_handler(nq,
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.h b/drivers/infiniband/hw/bnxt_re/qplib_fp.h
index 56538b9..e714caa 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_fp.h
+++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.h
@@ -105,6 +105,7 @@ struct bnxt_qplib_srq {
struct bnxt_qplib_sg_info sg_info;
u16 eventq_hw_ring_id;
spinlock_t lock; /* protect SRQE link list */
+ u8 toggle;
};
struct bnxt_qplib_sge {
--
2.5.5
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH for-next 2/3] RDMA/bnxt_re: Refactor the BNXT_RE_METHOD_GET_TOGGLE_MEM method
2024-08-28 8:47 [PATCH for-next 0/3] RDMA/bnxt_re: Toggle bit support for SRQ events Selvin Xavier
2024-08-28 8:47 ` [PATCH for-next 1/3] RDMA/bnxt_re: Get the toggle bits from " Selvin Xavier
@ 2024-08-28 8:47 ` Selvin Xavier
2024-08-28 8:47 ` [PATCH for-next 3/3] RDMA/bnxt_re: Share a page to expose per SRQ info with userspace Selvin Xavier
2 siblings, 0 replies; 6+ messages in thread
From: Selvin Xavier @ 2024-08-28 8:47 UTC (permalink / raw)
To: leon, jgg
Cc: linux-rdma, andrew.gospodarek, chandramohan.akula, Selvin Xavier
From: Chandramohan Akula <chandramohan.akula@broadcom.com>
Refactor the code in this function to have common code.
This is used in subsequent patches.
Signed-off-by: Chandramohan Akula <chandramohan.akula@broadcom.com>
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
---
drivers/infiniband/hw/bnxt_re/ib_verbs.c | 18 +++++++-----------
1 file changed, 7 insertions(+), 11 deletions(-)
diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
index 43a68e7..1e76093 100644
--- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
+++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
@@ -4494,12 +4494,12 @@ static int UVERBS_HANDLER(BNXT_RE_METHOD_GET_TOGGLE_MEM)(struct uverbs_attr_bund
struct bnxt_re_ucontext *uctx;
struct ib_ucontext *ib_uctx;
struct bnxt_re_dev *rdev;
+ u32 length = PAGE_SIZE;
struct bnxt_re_cq *cq;
u64 mem_offset;
+ u32 offset = 0;
u64 addr = 0;
- u32 length;
- u32 offset;
- u32 cq_id;
+ u32 res_id;
int err;
ib_uctx = ib_uverbs_get_ucontext(attrs);
@@ -4512,21 +4512,17 @@ static int UVERBS_HANDLER(BNXT_RE_METHOD_GET_TOGGLE_MEM)(struct uverbs_attr_bund
uctx = container_of(ib_uctx, struct bnxt_re_ucontext, ib_uctx);
rdev = uctx->rdev;
+ err = uverbs_copy_from(&res_id, attrs, BNXT_RE_TOGGLE_MEM_RES_ID);
+ if (err)
+ return err;
switch (res_type) {
case BNXT_RE_CQ_TOGGLE_MEM:
- err = uverbs_copy_from(&cq_id, attrs, BNXT_RE_TOGGLE_MEM_RES_ID);
- if (err)
- return err;
-
- cq = bnxt_re_search_for_cq(rdev, cq_id);
+ cq = bnxt_re_search_for_cq(rdev, res_id);
if (!cq)
return -EINVAL;
- length = PAGE_SIZE;
addr = (u64)cq->uctx_cq_page;
- mmap_flag = BNXT_RE_MMAP_TOGGLE_PAGE;
- offset = 0;
break;
case BNXT_RE_SRQ_TOGGLE_MEM:
break;
--
2.5.5
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH for-next 3/3] RDMA/bnxt_re: Share a page to expose per SRQ info with userspace
2024-08-28 8:47 [PATCH for-next 0/3] RDMA/bnxt_re: Toggle bit support for SRQ events Selvin Xavier
2024-08-28 8:47 ` [PATCH for-next 1/3] RDMA/bnxt_re: Get the toggle bits from " Selvin Xavier
2024-08-28 8:47 ` [PATCH for-next 2/3] RDMA/bnxt_re: Refactor the BNXT_RE_METHOD_GET_TOGGLE_MEM method Selvin Xavier
@ 2024-08-28 8:47 ` Selvin Xavier
2024-08-29 11:03 ` Leon Romanovsky
2 siblings, 1 reply; 6+ messages in thread
From: Selvin Xavier @ 2024-08-28 8:47 UTC (permalink / raw)
To: leon, jgg
Cc: linux-rdma, andrew.gospodarek, chandramohan.akula, Selvin Xavier
From: Chandramohan Akula <chandramohan.akula@broadcom.com>
Gen P7 adapters needs to share a toggle bits information received
in kernel driver with the user space. User space needs this
info to arm the SRQ.
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 SRQ structure from the SRQ ID.
SRQ 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 SRQ. This
can be optimized to enable multiple SRQs from the same
application share the same page and different offsets
in the page
Signed-off-by: Chandramohan Akula <chandramohan.akula@broadcom.com>
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
---
drivers/infiniband/hw/bnxt_re/bnxt_re.h | 2 ++
drivers/infiniband/hw/bnxt_re/ib_verbs.c | 34 +++++++++++++++++++++++++++++++-
drivers/infiniband/hw/bnxt_re/ib_verbs.h | 1 +
drivers/infiniband/hw/bnxt_re/main.c | 6 +++++-
include/uapi/rdma/bnxt_re-abi.h | 5 +++++
5 files changed, 46 insertions(+), 2 deletions(-)
diff --git a/drivers/infiniband/hw/bnxt_re/bnxt_re.h b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
index 0912d2f..2be9a62 100644
--- a/drivers/infiniband/hw/bnxt_re/bnxt_re.h
+++ b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
@@ -141,6 +141,7 @@ struct bnxt_re_pacing {
#define BNXT_RE_GRC_FIFO_REG_BASE 0x2000
#define MAX_CQ_HASH_BITS (16)
+#define MAX_SRQ_HASH_BITS (16)
struct bnxt_re_dev {
struct ib_device ibdev;
struct list_head list;
@@ -196,6 +197,7 @@ struct bnxt_re_dev {
struct work_struct dbq_fifo_check_work;
struct delayed_work dbq_pacing_work;
DECLARE_HASHTABLE(cq_hash, MAX_CQ_HASH_BITS);
+ DECLARE_HASHTABLE(srq_hash, MAX_SRQ_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 1e76093..0219c8a 100644
--- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
+++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
@@ -1685,6 +1685,10 @@ int bnxt_re_destroy_srq(struct ib_srq *ib_srq, struct ib_udata *udata)
if (qplib_srq->cq)
nq = qplib_srq->cq->nq;
+ if (rdev->chip_ctx->modes.toggle_bits & BNXT_QPLIB_SRQ_TOGGLE_BIT) {
+ free_page((unsigned long)srq->uctx_srq_page);
+ hash_del(&srq->hash_entry);
+ }
bnxt_qplib_destroy_srq(&rdev->qplib_res, qplib_srq);
ib_umem_release(srq->umem);
atomic_dec(&rdev->stats.res.srq_count);
@@ -1789,9 +1793,18 @@ int bnxt_re_create_srq(struct ib_srq *ib_srq,
}
if (udata) {
- struct bnxt_re_srq_resp resp;
+ struct bnxt_re_srq_resp resp = {};
resp.srqid = srq->qplib_srq.id;
+ if (rdev->chip_ctx->modes.toggle_bits & BNXT_QPLIB_SRQ_TOGGLE_BIT) {
+ hash_add(rdev->srq_hash, &srq->hash_entry, srq->qplib_srq.id);
+ srq->uctx_srq_page = (void *)get_zeroed_page(GFP_KERNEL);
+ if (!srq->uctx_srq_page) {
+ rc = -ENOMEM;
+ goto fail;
+ }
+ resp.comp_mask |= BNXT_RE_SRQ_TOGGLE_PAGE_SUPPORT;
+ }
rc = ib_copy_to_udata(udata, &resp, sizeof(resp));
if (rc) {
ibdev_err(&rdev->ibdev, "SRQ copy to udata failed!");
@@ -4266,6 +4279,19 @@ static struct bnxt_re_cq *bnxt_re_search_for_cq(struct bnxt_re_dev *rdev, u32 cq
return cq;
}
+static struct bnxt_re_srq *bnxt_re_search_for_srq(struct bnxt_re_dev *rdev, u32 srq_id)
+{
+ struct bnxt_re_srq *srq = NULL, *tmp_srq;
+
+ hash_for_each_possible(rdev->srq_hash, tmp_srq, hash_entry, srq_id) {
+ if (tmp_srq->qplib_srq.id == srq_id) {
+ srq = tmp_srq;
+ break;
+ }
+ }
+ return srq;
+}
+
/* Helper function to mmap the virtual memory from user app */
int bnxt_re_mmap(struct ib_ucontext *ib_uctx, struct vm_area_struct *vma)
{
@@ -4494,6 +4520,7 @@ static int UVERBS_HANDLER(BNXT_RE_METHOD_GET_TOGGLE_MEM)(struct uverbs_attr_bund
struct bnxt_re_ucontext *uctx;
struct ib_ucontext *ib_uctx;
struct bnxt_re_dev *rdev;
+ struct bnxt_re_srq *srq;
u32 length = PAGE_SIZE;
struct bnxt_re_cq *cq;
u64 mem_offset;
@@ -4525,6 +4552,11 @@ static int UVERBS_HANDLER(BNXT_RE_METHOD_GET_TOGGLE_MEM)(struct uverbs_attr_bund
addr = (u64)cq->uctx_cq_page;
break;
case BNXT_RE_SRQ_TOGGLE_MEM:
+ srq = bnxt_re_search_for_srq(rdev, res_id);
+ if (!srq)
+ return -EINVAL;
+
+ addr = (u64)srq->uctx_srq_page;
break;
default:
diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.h b/drivers/infiniband/hw/bnxt_re/ib_verbs.h
index 4e113b9..9c74dfe 100644
--- a/drivers/infiniband/hw/bnxt_re/ib_verbs.h
+++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.h
@@ -78,6 +78,7 @@ struct bnxt_re_srq {
struct ib_umem *umem;
spinlock_t lock; /* protect srq */
void *uctx_srq_page;
+ struct hlist_node hash_entry;
};
struct bnxt_re_qp {
diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c
index 9714b9a..1211fe5 100644
--- a/drivers/infiniband/hw/bnxt_re/main.c
+++ b/drivers/infiniband/hw/bnxt_re/main.c
@@ -139,8 +139,10 @@ static void bnxt_re_set_drv_mode(struct bnxt_re_dev *rdev, u8 mode)
if (bnxt_re_hwrm_qcaps(rdev))
dev_err(rdev_to_dev(rdev),
"Failed to query hwrm qcaps\n");
- if (bnxt_qplib_is_chip_gen_p7(rdev->chip_ctx))
+ if (bnxt_qplib_is_chip_gen_p7(rdev->chip_ctx)) {
cctx->modes.toggle_bits |= BNXT_QPLIB_CQ_TOGGLE_BIT;
+ cctx->modes.toggle_bits |= BNXT_QPLIB_SRQ_TOGGLE_BIT;
+ }
}
static void bnxt_re_destroy_chip_ctx(struct bnxt_re_dev *rdev)
@@ -1771,6 +1773,8 @@ static int bnxt_re_dev_init(struct bnxt_re_dev *rdev, u8 wqe_mode)
bnxt_re_vf_res_config(rdev);
}
hash_init(rdev->cq_hash);
+ if (rdev->chip_ctx->modes.toggle_bits & BNXT_QPLIB_SRQ_TOGGLE_BIT)
+ hash_init(rdev->srq_hash);
return 0;
free_sctx:
diff --git a/include/uapi/rdma/bnxt_re-abi.h b/include/uapi/rdma/bnxt_re-abi.h
index e61104f..84917a9 100644
--- a/include/uapi/rdma/bnxt_re-abi.h
+++ b/include/uapi/rdma/bnxt_re-abi.h
@@ -134,8 +134,13 @@ struct bnxt_re_srq_req {
__aligned_u64 srq_handle;
};
+enum bnxt_re_srq_mask {
+ BNXT_RE_SRQ_TOGGLE_PAGE_SUPPORT = 0x1,
+};
+
struct bnxt_re_srq_resp {
__u32 srqid;
+ __aligned_u64 comp_mask;
};
enum bnxt_re_shpg_offt {
--
2.5.5
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH for-next 3/3] RDMA/bnxt_re: Share a page to expose per SRQ info with userspace
2024-08-28 8:47 ` [PATCH for-next 3/3] RDMA/bnxt_re: Share a page to expose per SRQ info with userspace Selvin Xavier
@ 2024-08-29 11:03 ` Leon Romanovsky
2024-08-29 14:54 ` Selvin Xavier
0 siblings, 1 reply; 6+ messages in thread
From: Leon Romanovsky @ 2024-08-29 11:03 UTC (permalink / raw)
To: Selvin Xavier; +Cc: jgg, linux-rdma, andrew.gospodarek, chandramohan.akula
On Wed, Aug 28, 2024 at 01:47:12AM -0700, Selvin Xavier wrote:
> From: Chandramohan Akula <chandramohan.akula@broadcom.com>
>
> Gen P7 adapters needs to share a toggle bits information received
> in kernel driver with the user space. User space needs this
> info to arm the SRQ.
>
> 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 SRQ structure from the SRQ ID.
> SRQ 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 SRQ. This
> can be optimized to enable multiple SRQs from the same
> application share the same page and different offsets
> in the page
>
> Signed-off-by: Chandramohan Akula <chandramohan.akula@broadcom.com>
> Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
> ---
> drivers/infiniband/hw/bnxt_re/bnxt_re.h | 2 ++
> drivers/infiniband/hw/bnxt_re/ib_verbs.c | 34 +++++++++++++++++++++++++++++++-
> drivers/infiniband/hw/bnxt_re/ib_verbs.h | 1 +
> drivers/infiniband/hw/bnxt_re/main.c | 6 +++++-
> include/uapi/rdma/bnxt_re-abi.h | 5 +++++
> 5 files changed, 46 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/infiniband/hw/bnxt_re/bnxt_re.h b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
> index 0912d2f..2be9a62 100644
> --- a/drivers/infiniband/hw/bnxt_re/bnxt_re.h
> +++ b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
> @@ -141,6 +141,7 @@ struct bnxt_re_pacing {
> #define BNXT_RE_GRC_FIFO_REG_BASE 0x2000
>
> #define MAX_CQ_HASH_BITS (16)
> +#define MAX_SRQ_HASH_BITS (16)
> struct bnxt_re_dev {
> struct ib_device ibdev;
> struct list_head list;
> @@ -196,6 +197,7 @@ struct bnxt_re_dev {
> struct work_struct dbq_fifo_check_work;
> struct delayed_work dbq_pacing_work;
> DECLARE_HASHTABLE(cq_hash, MAX_CQ_HASH_BITS);
> + DECLARE_HASHTABLE(srq_hash, MAX_SRQ_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 1e76093..0219c8a 100644
> --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
> +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
> @@ -1685,6 +1685,10 @@ int bnxt_re_destroy_srq(struct ib_srq *ib_srq, struct ib_udata *udata)
>
> if (qplib_srq->cq)
> nq = qplib_srq->cq->nq;
> + if (rdev->chip_ctx->modes.toggle_bits & BNXT_QPLIB_SRQ_TOGGLE_BIT) {
> + free_page((unsigned long)srq->uctx_srq_page);
> + hash_del(&srq->hash_entry);
> + }
> bnxt_qplib_destroy_srq(&rdev->qplib_res, qplib_srq);
> ib_umem_release(srq->umem);
> atomic_dec(&rdev->stats.res.srq_count);
> @@ -1789,9 +1793,18 @@ int bnxt_re_create_srq(struct ib_srq *ib_srq,
> }
>
> if (udata) {
> - struct bnxt_re_srq_resp resp;
> + struct bnxt_re_srq_resp resp = {};
>
> resp.srqid = srq->qplib_srq.id;
> + if (rdev->chip_ctx->modes.toggle_bits & BNXT_QPLIB_SRQ_TOGGLE_BIT) {
> + hash_add(rdev->srq_hash, &srq->hash_entry, srq->qplib_srq.id);
> + srq->uctx_srq_page = (void *)get_zeroed_page(GFP_KERNEL);
> + if (!srq->uctx_srq_page) {
> + rc = -ENOMEM;
> + goto fail;
> + }
> + resp.comp_mask |= BNXT_RE_SRQ_TOGGLE_PAGE_SUPPORT;
> + }
> rc = ib_copy_to_udata(udata, &resp, sizeof(resp));
> if (rc) {
> ibdev_err(&rdev->ibdev, "SRQ copy to udata failed!");
> @@ -4266,6 +4279,19 @@ static struct bnxt_re_cq *bnxt_re_search_for_cq(struct bnxt_re_dev *rdev, u32 cq
> return cq;
> }
>
> +static struct bnxt_re_srq *bnxt_re_search_for_srq(struct bnxt_re_dev *rdev, u32 srq_id)
> +{
> + struct bnxt_re_srq *srq = NULL, *tmp_srq;
> +
> + hash_for_each_possible(rdev->srq_hash, tmp_srq, hash_entry, srq_id) {
> + if (tmp_srq->qplib_srq.id == srq_id) {
> + srq = tmp_srq;
> + break;
> + }
> + }
> + return srq;
> +}
> +
> /* Helper function to mmap the virtual memory from user app */
> int bnxt_re_mmap(struct ib_ucontext *ib_uctx, struct vm_area_struct *vma)
> {
> @@ -4494,6 +4520,7 @@ static int UVERBS_HANDLER(BNXT_RE_METHOD_GET_TOGGLE_MEM)(struct uverbs_attr_bund
> struct bnxt_re_ucontext *uctx;
> struct ib_ucontext *ib_uctx;
> struct bnxt_re_dev *rdev;
> + struct bnxt_re_srq *srq;
> u32 length = PAGE_SIZE;
> struct bnxt_re_cq *cq;
> u64 mem_offset;
> @@ -4525,6 +4552,11 @@ static int UVERBS_HANDLER(BNXT_RE_METHOD_GET_TOGGLE_MEM)(struct uverbs_attr_bund
> addr = (u64)cq->uctx_cq_page;
> break;
> case BNXT_RE_SRQ_TOGGLE_MEM:
> + srq = bnxt_re_search_for_srq(rdev, res_id);
> + if (!srq)
> + return -EINVAL;
> +
> + addr = (u64)srq->uctx_srq_page;
> break;
>
> default:
> diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.h b/drivers/infiniband/hw/bnxt_re/ib_verbs.h
> index 4e113b9..9c74dfe 100644
> --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.h
> +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.h
> @@ -78,6 +78,7 @@ struct bnxt_re_srq {
> struct ib_umem *umem;
> spinlock_t lock; /* protect srq */
> void *uctx_srq_page;
> + struct hlist_node hash_entry;
> };
>
> struct bnxt_re_qp {
> diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c
> index 9714b9a..1211fe5 100644
> --- a/drivers/infiniband/hw/bnxt_re/main.c
> +++ b/drivers/infiniband/hw/bnxt_re/main.c
> @@ -139,8 +139,10 @@ static void bnxt_re_set_drv_mode(struct bnxt_re_dev *rdev, u8 mode)
> if (bnxt_re_hwrm_qcaps(rdev))
> dev_err(rdev_to_dev(rdev),
> "Failed to query hwrm qcaps\n");
> - if (bnxt_qplib_is_chip_gen_p7(rdev->chip_ctx))
> + if (bnxt_qplib_is_chip_gen_p7(rdev->chip_ctx)) {
> cctx->modes.toggle_bits |= BNXT_QPLIB_CQ_TOGGLE_BIT;
> + cctx->modes.toggle_bits |= BNXT_QPLIB_SRQ_TOGGLE_BIT;
> + }
> }
>
> static void bnxt_re_destroy_chip_ctx(struct bnxt_re_dev *rdev)
> @@ -1771,6 +1773,8 @@ static int bnxt_re_dev_init(struct bnxt_re_dev *rdev, u8 wqe_mode)
> bnxt_re_vf_res_config(rdev);
> }
> hash_init(rdev->cq_hash);
> + if (rdev->chip_ctx->modes.toggle_bits & BNXT_QPLIB_SRQ_TOGGLE_BIT)
> + hash_init(rdev->srq_hash);
>
> return 0;
> free_sctx:
> diff --git a/include/uapi/rdma/bnxt_re-abi.h b/include/uapi/rdma/bnxt_re-abi.h
> index e61104f..84917a9 100644
> --- a/include/uapi/rdma/bnxt_re-abi.h
> +++ b/include/uapi/rdma/bnxt_re-abi.h
> @@ -134,8 +134,13 @@ struct bnxt_re_srq_req {
> __aligned_u64 srq_handle;
> };
>
> +enum bnxt_re_srq_mask {
> + BNXT_RE_SRQ_TOGGLE_PAGE_SUPPORT = 0x1,
> +};
> +
> struct bnxt_re_srq_resp {
> __u32 srqid;
I think that you should add __u32 reserved field here to align the
struct.
> + __aligned_u64 comp_mask;
> };
>
> enum bnxt_re_shpg_offt {
> --
> 2.5.5
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH for-next 3/3] RDMA/bnxt_re: Share a page to expose per SRQ info with userspace
2024-08-29 11:03 ` Leon Romanovsky
@ 2024-08-29 14:54 ` Selvin Xavier
0 siblings, 0 replies; 6+ messages in thread
From: Selvin Xavier @ 2024-08-29 14:54 UTC (permalink / raw)
To: Leon Romanovsky; +Cc: jgg, linux-rdma, andrew.gospodarek, chandramohan.akula
[-- Attachment #1: Type: text/plain, Size: 8096 bytes --]
On Thu, Aug 29, 2024 at 4:33 PM Leon Romanovsky <leon@kernel.org> wrote:
>
> On Wed, Aug 28, 2024 at 01:47:12AM -0700, Selvin Xavier wrote:
> > From: Chandramohan Akula <chandramohan.akula@broadcom.com>
> >
> > Gen P7 adapters needs to share a toggle bits information received
> > in kernel driver with the user space. User space needs this
> > info to arm the SRQ.
> >
> > 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 SRQ structure from the SRQ ID.
> > SRQ 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 SRQ. This
> > can be optimized to enable multiple SRQs from the same
> > application share the same page and different offsets
> > in the page
> >
> > Signed-off-by: Chandramohan Akula <chandramohan.akula@broadcom.com>
> > Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
> > ---
> > drivers/infiniband/hw/bnxt_re/bnxt_re.h | 2 ++
> > drivers/infiniband/hw/bnxt_re/ib_verbs.c | 34 +++++++++++++++++++++++++++++++-
> > drivers/infiniband/hw/bnxt_re/ib_verbs.h | 1 +
> > drivers/infiniband/hw/bnxt_re/main.c | 6 +++++-
> > include/uapi/rdma/bnxt_re-abi.h | 5 +++++
> > 5 files changed, 46 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/infiniband/hw/bnxt_re/bnxt_re.h b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
> > index 0912d2f..2be9a62 100644
> > --- a/drivers/infiniband/hw/bnxt_re/bnxt_re.h
> > +++ b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
> > @@ -141,6 +141,7 @@ struct bnxt_re_pacing {
> > #define BNXT_RE_GRC_FIFO_REG_BASE 0x2000
> >
> > #define MAX_CQ_HASH_BITS (16)
> > +#define MAX_SRQ_HASH_BITS (16)
> > struct bnxt_re_dev {
> > struct ib_device ibdev;
> > struct list_head list;
> > @@ -196,6 +197,7 @@ struct bnxt_re_dev {
> > struct work_struct dbq_fifo_check_work;
> > struct delayed_work dbq_pacing_work;
> > DECLARE_HASHTABLE(cq_hash, MAX_CQ_HASH_BITS);
> > + DECLARE_HASHTABLE(srq_hash, MAX_SRQ_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 1e76093..0219c8a 100644
> > --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
> > +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
> > @@ -1685,6 +1685,10 @@ int bnxt_re_destroy_srq(struct ib_srq *ib_srq, struct ib_udata *udata)
> >
> > if (qplib_srq->cq)
> > nq = qplib_srq->cq->nq;
> > + if (rdev->chip_ctx->modes.toggle_bits & BNXT_QPLIB_SRQ_TOGGLE_BIT) {
> > + free_page((unsigned long)srq->uctx_srq_page);
> > + hash_del(&srq->hash_entry);
> > + }
> > bnxt_qplib_destroy_srq(&rdev->qplib_res, qplib_srq);
> > ib_umem_release(srq->umem);
> > atomic_dec(&rdev->stats.res.srq_count);
> > @@ -1789,9 +1793,18 @@ int bnxt_re_create_srq(struct ib_srq *ib_srq,
> > }
> >
> > if (udata) {
> > - struct bnxt_re_srq_resp resp;
> > + struct bnxt_re_srq_resp resp = {};
> >
> > resp.srqid = srq->qplib_srq.id;
> > + if (rdev->chip_ctx->modes.toggle_bits & BNXT_QPLIB_SRQ_TOGGLE_BIT) {
> > + hash_add(rdev->srq_hash, &srq->hash_entry, srq->qplib_srq.id);
> > + srq->uctx_srq_page = (void *)get_zeroed_page(GFP_KERNEL);
> > + if (!srq->uctx_srq_page) {
> > + rc = -ENOMEM;
> > + goto fail;
> > + }
> > + resp.comp_mask |= BNXT_RE_SRQ_TOGGLE_PAGE_SUPPORT;
> > + }
> > rc = ib_copy_to_udata(udata, &resp, sizeof(resp));
> > if (rc) {
> > ibdev_err(&rdev->ibdev, "SRQ copy to udata failed!");
> > @@ -4266,6 +4279,19 @@ static struct bnxt_re_cq *bnxt_re_search_for_cq(struct bnxt_re_dev *rdev, u32 cq
> > return cq;
> > }
> >
> > +static struct bnxt_re_srq *bnxt_re_search_for_srq(struct bnxt_re_dev *rdev, u32 srq_id)
> > +{
> > + struct bnxt_re_srq *srq = NULL, *tmp_srq;
> > +
> > + hash_for_each_possible(rdev->srq_hash, tmp_srq, hash_entry, srq_id) {
> > + if (tmp_srq->qplib_srq.id == srq_id) {
> > + srq = tmp_srq;
> > + break;
> > + }
> > + }
> > + return srq;
> > +}
> > +
> > /* Helper function to mmap the virtual memory from user app */
> > int bnxt_re_mmap(struct ib_ucontext *ib_uctx, struct vm_area_struct *vma)
> > {
> > @@ -4494,6 +4520,7 @@ static int UVERBS_HANDLER(BNXT_RE_METHOD_GET_TOGGLE_MEM)(struct uverbs_attr_bund
> > struct bnxt_re_ucontext *uctx;
> > struct ib_ucontext *ib_uctx;
> > struct bnxt_re_dev *rdev;
> > + struct bnxt_re_srq *srq;
> > u32 length = PAGE_SIZE;
> > struct bnxt_re_cq *cq;
> > u64 mem_offset;
> > @@ -4525,6 +4552,11 @@ static int UVERBS_HANDLER(BNXT_RE_METHOD_GET_TOGGLE_MEM)(struct uverbs_attr_bund
> > addr = (u64)cq->uctx_cq_page;
> > break;
> > case BNXT_RE_SRQ_TOGGLE_MEM:
> > + srq = bnxt_re_search_for_srq(rdev, res_id);
> > + if (!srq)
> > + return -EINVAL;
> > +
> > + addr = (u64)srq->uctx_srq_page;
> > break;
> >
> > default:
> > diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.h b/drivers/infiniband/hw/bnxt_re/ib_verbs.h
> > index 4e113b9..9c74dfe 100644
> > --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.h
> > +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.h
> > @@ -78,6 +78,7 @@ struct bnxt_re_srq {
> > struct ib_umem *umem;
> > spinlock_t lock; /* protect srq */
> > void *uctx_srq_page;
> > + struct hlist_node hash_entry;
> > };
> >
> > struct bnxt_re_qp {
> > diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c
> > index 9714b9a..1211fe5 100644
> > --- a/drivers/infiniband/hw/bnxt_re/main.c
> > +++ b/drivers/infiniband/hw/bnxt_re/main.c
> > @@ -139,8 +139,10 @@ static void bnxt_re_set_drv_mode(struct bnxt_re_dev *rdev, u8 mode)
> > if (bnxt_re_hwrm_qcaps(rdev))
> > dev_err(rdev_to_dev(rdev),
> > "Failed to query hwrm qcaps\n");
> > - if (bnxt_qplib_is_chip_gen_p7(rdev->chip_ctx))
> > + if (bnxt_qplib_is_chip_gen_p7(rdev->chip_ctx)) {
> > cctx->modes.toggle_bits |= BNXT_QPLIB_CQ_TOGGLE_BIT;
> > + cctx->modes.toggle_bits |= BNXT_QPLIB_SRQ_TOGGLE_BIT;
> > + }
> > }
> >
> > static void bnxt_re_destroy_chip_ctx(struct bnxt_re_dev *rdev)
> > @@ -1771,6 +1773,8 @@ static int bnxt_re_dev_init(struct bnxt_re_dev *rdev, u8 wqe_mode)
> > bnxt_re_vf_res_config(rdev);
> > }
> > hash_init(rdev->cq_hash);
> > + if (rdev->chip_ctx->modes.toggle_bits & BNXT_QPLIB_SRQ_TOGGLE_BIT)
> > + hash_init(rdev->srq_hash);
> >
> > return 0;
> > free_sctx:
> > diff --git a/include/uapi/rdma/bnxt_re-abi.h b/include/uapi/rdma/bnxt_re-abi.h
> > index e61104f..84917a9 100644
> > --- a/include/uapi/rdma/bnxt_re-abi.h
> > +++ b/include/uapi/rdma/bnxt_re-abi.h
> > @@ -134,8 +134,13 @@ struct bnxt_re_srq_req {
> > __aligned_u64 srq_handle;
> > };
> >
> > +enum bnxt_re_srq_mask {
> > + BNXT_RE_SRQ_TOGGLE_PAGE_SUPPORT = 0x1,
> > +};
> > +
> > struct bnxt_re_srq_resp {
> > __u32 srqid;
>
> I think that you should add __u32 reserved field here to align the
> struct.
Sure. will post a v2 soon.
Thanks,
>
> > + __aligned_u64 comp_mask;
> > };
> >
> > enum bnxt_re_shpg_offt {
> > --
> > 2.5.5
> >
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4224 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2024-08-29 14:55 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-08-28 8:47 [PATCH for-next 0/3] RDMA/bnxt_re: Toggle bit support for SRQ events Selvin Xavier
2024-08-28 8:47 ` [PATCH for-next 1/3] RDMA/bnxt_re: Get the toggle bits from " Selvin Xavier
2024-08-28 8:47 ` [PATCH for-next 2/3] RDMA/bnxt_re: Refactor the BNXT_RE_METHOD_GET_TOGGLE_MEM method Selvin Xavier
2024-08-28 8:47 ` [PATCH for-next 3/3] RDMA/bnxt_re: Share a page to expose per SRQ info with userspace Selvin Xavier
2024-08-29 11:03 ` Leon Romanovsky
2024-08-29 14:54 ` Selvin Xavier
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox