linux-rdma.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH rdma-rc 0/4] RDMA/bnxt_re: Bug fixes for bnxt_re driver
@ 2025-08-05 10:09 Kalesh AP
  2025-08-05 10:09 ` [PATCH rdma-rc 1/4] RDMA/bnxt_re: Fix to do SRQ armena by default Kalesh AP
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Kalesh AP @ 2025-08-05 10:09 UTC (permalink / raw)
  To: leon, jgg; +Cc: linux-rdma, andrew.gospodarek, selvin.xavier, Kalesh AP

Hi,

This series of patches provides few fixes for the bnxt_re driver.
A couple of SRQ related fixes, one fix for a possible memory leak.

Thanks,
Kalesh AP

Anantha Prabhu (1):
  RDMA/bnxt_re: Fix to initialize the PBL array

Kalesh AP (1):
  RDMA/bnxt_re: Fix a possible memory leak in the driver

Kashyap Desai (2):
  RDMA/bnxt_re: Fix to do SRQ armena by default
  RDMA/bnxt_re: Fix to remove workload check in SRQ limit path

 drivers/infiniband/hw/bnxt_re/ib_verbs.c  |  8 ++----
 drivers/infiniband/hw/bnxt_re/main.c      | 23 +++++++++++++++++
 drivers/infiniband/hw/bnxt_re/qplib_fp.c  | 30 +----------------------
 drivers/infiniband/hw/bnxt_re/qplib_fp.h  |  2 --
 drivers/infiniband/hw/bnxt_re/qplib_res.c |  2 ++
 5 files changed, 28 insertions(+), 37 deletions(-)

-- 
2.43.5


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH rdma-rc 1/4] RDMA/bnxt_re: Fix to do SRQ armena by default
  2025-08-05 10:09 [PATCH rdma-rc 0/4] RDMA/bnxt_re: Bug fixes for bnxt_re driver Kalesh AP
@ 2025-08-05 10:09 ` Kalesh AP
  2025-08-05 10:09 ` [PATCH rdma-rc 2/4] RDMA/bnxt_re: Fix to remove workload check in SRQ limit path Kalesh AP
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Kalesh AP @ 2025-08-05 10:09 UTC (permalink / raw)
  To: leon, jgg
  Cc: linux-rdma, andrew.gospodarek, selvin.xavier, Kashyap Desai,
	Saravanan Vajravel, Kalesh AP

From: Kashyap Desai <kashyap.desai@broadcom.com>

Whenever SRQ is created, make sure SRQ arm enable is always
set. Driver is always ready to receive SRQ ASYNC event.

Additional note -
There is no need to do srq arm enable conditionally.
See bnxt_qplib_armen_db in bnxt_qplib_create_cq().

Fixes: 37cb11acf1f7 ("RDMA/bnxt_re: Add SRQ support for Broadcom adapters")
Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com>
Signed-off-by: Saravanan Vajravel <saravanan.vajravel@broadcom.com>
Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
---
 drivers/infiniband/hw/bnxt_re/qplib_fp.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.c b/drivers/infiniband/hw/bnxt_re/qplib_fp.c
index be34c605d516..eb82440cdded 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_fp.c
+++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.c
@@ -705,8 +705,7 @@ int bnxt_qplib_create_srq(struct bnxt_qplib_res *res,
 	srq->dbinfo.db = srq->dpi->dbr;
 	srq->dbinfo.max_slot = 1;
 	srq->dbinfo.priv_db = res->dpi_tbl.priv_db;
-	if (srq->threshold)
-		bnxt_qplib_armen_db(&srq->dbinfo, DBC_DBC_TYPE_SRQ_ARMENA);
+	bnxt_qplib_armen_db(&srq->dbinfo, DBC_DBC_TYPE_SRQ_ARMENA);
 	srq->arm_req = false;
 
 	return 0;
-- 
2.43.5


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH rdma-rc 2/4] RDMA/bnxt_re: Fix to remove workload check in SRQ limit path
  2025-08-05 10:09 [PATCH rdma-rc 0/4] RDMA/bnxt_re: Bug fixes for bnxt_re driver Kalesh AP
  2025-08-05 10:09 ` [PATCH rdma-rc 1/4] RDMA/bnxt_re: Fix to do SRQ armena by default Kalesh AP
@ 2025-08-05 10:09 ` Kalesh AP
  2025-08-05 10:09 ` [PATCH rdma-rc 3/4] RDMA/bnxt_re: Fix a possible memory leak in the driver Kalesh AP
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Kalesh AP @ 2025-08-05 10:09 UTC (permalink / raw)
  To: leon, jgg
  Cc: linux-rdma, andrew.gospodarek, selvin.xavier, Kashyap Desai,
	Saravanan Vajravel, Kalesh AP

From: Kashyap Desai <kashyap.desai@broadcom.com>

There should not be any checks of current workload to set
srq_limit value to SRQ hw context.

Remove all such workload checks and make a direct call to
set srq_limit via doorbell SRQ_ARM.

Fixes: 37cb11acf1f7 ("RDMA/bnxt_re: Add SRQ support for Broadcom adapters")
Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com>
Signed-off-by: Saravanan Vajravel <saravanan.vajravel@broadcom.com>
Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
---
 drivers/infiniband/hw/bnxt_re/ib_verbs.c |  8 ++-----
 drivers/infiniband/hw/bnxt_re/qplib_fp.c | 27 ------------------------
 drivers/infiniband/hw/bnxt_re/qplib_fp.h |  2 --
 3 files changed, 2 insertions(+), 35 deletions(-)

diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
index 063801384b2b..2e3866e74736 100644
--- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
+++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
@@ -1921,7 +1921,6 @@ int bnxt_re_modify_srq(struct ib_srq *ib_srq, struct ib_srq_attr *srq_attr,
 	struct bnxt_re_srq *srq = container_of(ib_srq, struct bnxt_re_srq,
 					       ib_srq);
 	struct bnxt_re_dev *rdev = srq->rdev;
-	int rc;
 
 	switch (srq_attr_mask) {
 	case IB_SRQ_MAX_WR:
@@ -1933,11 +1932,8 @@ int bnxt_re_modify_srq(struct ib_srq *ib_srq, struct ib_srq_attr *srq_attr,
 			return -EINVAL;
 
 		srq->qplib_srq.threshold = srq_attr->srq_limit;
-		rc = bnxt_qplib_modify_srq(&rdev->qplib_res, &srq->qplib_srq);
-		if (rc) {
-			ibdev_err(&rdev->ibdev, "Modify HW SRQ failed!");
-			return rc;
-		}
+		bnxt_qplib_srq_arm_db(&srq->qplib_srq.dbinfo, srq->qplib_srq.threshold);
+
 		/* On success, update the shadow */
 		srq->srq_limit = srq_attr->srq_limit;
 		/* No need to Build and send response back to udata */
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.c b/drivers/infiniband/hw/bnxt_re/qplib_fp.c
index eb82440cdded..c2784561156f 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_fp.c
+++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.c
@@ -706,7 +706,6 @@ int bnxt_qplib_create_srq(struct bnxt_qplib_res *res,
 	srq->dbinfo.max_slot = 1;
 	srq->dbinfo.priv_db = res->dpi_tbl.priv_db;
 	bnxt_qplib_armen_db(&srq->dbinfo, DBC_DBC_TYPE_SRQ_ARMENA);
-	srq->arm_req = false;
 
 	return 0;
 fail:
@@ -716,24 +715,6 @@ int bnxt_qplib_create_srq(struct bnxt_qplib_res *res,
 	return rc;
 }
 
-int bnxt_qplib_modify_srq(struct bnxt_qplib_res *res,
-			  struct bnxt_qplib_srq *srq)
-{
-	struct bnxt_qplib_hwq *srq_hwq = &srq->hwq;
-	u32 count;
-
-	count = __bnxt_qplib_get_avail(srq_hwq);
-	if (count > srq->threshold) {
-		srq->arm_req = false;
-		bnxt_qplib_srq_arm_db(&srq->dbinfo, srq->threshold);
-	} else {
-		/* Deferred arming */
-		srq->arm_req = true;
-	}
-
-	return 0;
-}
-
 int bnxt_qplib_query_srq(struct bnxt_qplib_res *res,
 			 struct bnxt_qplib_srq *srq)
 {
@@ -775,7 +756,6 @@ int bnxt_qplib_post_srq_recv(struct bnxt_qplib_srq *srq,
 	struct bnxt_qplib_hwq *srq_hwq = &srq->hwq;
 	struct rq_wqe *srqe;
 	struct sq_sge *hw_sge;
-	u32 count = 0;
 	int i, next;
 
 	spin_lock(&srq_hwq->lock);
@@ -807,15 +787,8 @@ int bnxt_qplib_post_srq_recv(struct bnxt_qplib_srq *srq,
 
 	bnxt_qplib_hwq_incr_prod(&srq->dbinfo, srq_hwq, srq->dbinfo.max_slot);
 
-	spin_lock(&srq_hwq->lock);
-	count = __bnxt_qplib_get_avail(srq_hwq);
-	spin_unlock(&srq_hwq->lock);
 	/* Ring DB */
 	bnxt_qplib_ring_prod_db(&srq->dbinfo, DBC_DBC_TYPE_SRQ);
-	if (srq->arm_req == true && count > srq->threshold) {
-		srq->arm_req = false;
-		bnxt_qplib_srq_arm_db(&srq->dbinfo, srq->threshold);
-	}
 
 	return 0;
 }
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.h b/drivers/infiniband/hw/bnxt_re/qplib_fp.h
index 0d9487c889ff..846501f12227 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_fp.h
+++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.h
@@ -543,8 +543,6 @@ int bnxt_qplib_enable_nq(struct pci_dev *pdev, struct bnxt_qplib_nq *nq,
 			 srqn_handler_t srq_handler);
 int bnxt_qplib_create_srq(struct bnxt_qplib_res *res,
 			  struct bnxt_qplib_srq *srq);
-int bnxt_qplib_modify_srq(struct bnxt_qplib_res *res,
-			  struct bnxt_qplib_srq *srq);
 int bnxt_qplib_query_srq(struct bnxt_qplib_res *res,
 			 struct bnxt_qplib_srq *srq);
 void bnxt_qplib_destroy_srq(struct bnxt_qplib_res *res,
-- 
2.43.5


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH rdma-rc 3/4] RDMA/bnxt_re: Fix a possible memory leak in the driver
  2025-08-05 10:09 [PATCH rdma-rc 0/4] RDMA/bnxt_re: Bug fixes for bnxt_re driver Kalesh AP
  2025-08-05 10:09 ` [PATCH rdma-rc 1/4] RDMA/bnxt_re: Fix to do SRQ armena by default Kalesh AP
  2025-08-05 10:09 ` [PATCH rdma-rc 2/4] RDMA/bnxt_re: Fix to remove workload check in SRQ limit path Kalesh AP
@ 2025-08-05 10:09 ` Kalesh AP
  2025-08-05 10:10 ` [PATCH rdma-rc 4/4] RDMA/bnxt_re: Fix to initialize the PBL array Kalesh AP
  2025-08-13 10:35 ` [PATCH rdma-rc 0/4] RDMA/bnxt_re: Bug fixes for bnxt_re driver Leon Romanovsky
  4 siblings, 0 replies; 6+ messages in thread
From: Kalesh AP @ 2025-08-05 10:09 UTC (permalink / raw)
  To: leon, jgg
  Cc: linux-rdma, andrew.gospodarek, selvin.xavier, Kalesh AP,
	Sriharsha Basavapatna

The GID context reuse logic requires the context memory to be
not freed if and when DEL_GID firmware command fails. But, if
there's no subsequent ADD_GID to reuse it, the context memory
must be freed when the driver is unloaded. Otherwise it leads
to a memory leak.

Below is the kmemleak trace reported:

unreferenced object 0xffff88817a4f34d0 (size 8):
  comm "insmod", pid 1072504, jiffies 4402561550
  hex dump (first 8 bytes):
  01 00 00 00 00 00 00 00                          ........
  backtrace (crc ccaa009e):
  __kmalloc_cache_noprof+0x33e/0x400
  0xffffffffc2db9d48
  add_modify_gid+0x5e0/0xb60 [ib_core]
  __ib_cache_gid_add+0x213/0x350 [ib_core]
  update_gid+0xf2/0x180 [ib_core]
  enum_netdev_ipv4_ips+0x3f3/0x690 [ib_core]
  enum_all_gids_of_dev_cb+0x125/0x1b0 [ib_core]
  ib_enum_roce_netdev+0x14b/0x250 [ib_core]
  ib_cache_setup_one+0x2e5/0x540 [ib_core]
  ib_register_device+0x82c/0xf10 [ib_core]
  0xffffffffc2df5ad9
  0xffffffffc2da8b07
  0xffffffffc2db174d
  auxiliary_bus_probe+0xa5/0x120
  really_probe+0x1e4/0x850
  __driver_probe_device+0x18f/0x3d0

Fixes: 4a62c5e9e2e1 ("RDMA/bnxt_re: Do not free the ctx_tbl entry if delete GID fails")
Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Reviewed-by: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
---
 drivers/infiniband/hw/bnxt_re/main.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c
index 293b0a96c8e3..df7cf8d68e27 100644
--- a/drivers/infiniband/hw/bnxt_re/main.c
+++ b/drivers/infiniband/hw/bnxt_re/main.c
@@ -2017,6 +2017,28 @@ static void bnxt_re_free_nqr_mem(struct bnxt_re_dev *rdev)
 	rdev->nqr = NULL;
 }
 
+/* When DEL_GID fails, driver is not freeing GID ctx memory.
+ * To avoid the memory leak, free the memory during unload
+ */
+static void bnxt_re_free_gid_ctx(struct bnxt_re_dev *rdev)
+{
+	struct bnxt_qplib_sgid_tbl *sgid_tbl = &rdev->qplib_res.sgid_tbl;
+	struct bnxt_re_gid_ctx *ctx, **ctx_tbl;
+	int i;
+
+	if (!sgid_tbl->active)
+		return;
+
+	ctx_tbl = sgid_tbl->ctx;
+	for (i = 0; i < sgid_tbl->max; i++) {
+		if (sgid_tbl->hw_id[i] == 0xFFFF)
+			continue;
+
+		ctx = ctx_tbl[i];
+		kfree(ctx);
+	}
+}
+
 static void bnxt_re_dev_uninit(struct bnxt_re_dev *rdev, u8 op_type)
 {
 	u8 type;
@@ -2030,6 +2052,7 @@ static void bnxt_re_dev_uninit(struct bnxt_re_dev *rdev, u8 op_type)
 	if (test_and_clear_bit(BNXT_RE_FLAG_QOS_WORK_REG, &rdev->flags))
 		cancel_delayed_work_sync(&rdev->worker);
 
+	bnxt_re_free_gid_ctx(rdev);
 	if (test_and_clear_bit(BNXT_RE_FLAG_RESOURCES_INITIALIZED,
 			       &rdev->flags))
 		bnxt_re_cleanup_res(rdev);
-- 
2.43.5


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH rdma-rc 4/4] RDMA/bnxt_re: Fix to initialize the PBL array
  2025-08-05 10:09 [PATCH rdma-rc 0/4] RDMA/bnxt_re: Bug fixes for bnxt_re driver Kalesh AP
                   ` (2 preceding siblings ...)
  2025-08-05 10:09 ` [PATCH rdma-rc 3/4] RDMA/bnxt_re: Fix a possible memory leak in the driver Kalesh AP
@ 2025-08-05 10:10 ` Kalesh AP
  2025-08-13 10:35 ` [PATCH rdma-rc 0/4] RDMA/bnxt_re: Bug fixes for bnxt_re driver Leon Romanovsky
  4 siblings, 0 replies; 6+ messages in thread
From: Kalesh AP @ 2025-08-05 10:10 UTC (permalink / raw)
  To: leon, jgg
  Cc: linux-rdma, andrew.gospodarek, selvin.xavier, Anantha Prabhu,
	Saravanan Vajravel, Kalesh AP

From: Anantha Prabhu <anantha.prabhu@broadcom.com>

memset the PBL page pointer and page map arrays before
populating the SGL addresses of the HWQ.

Fixes: 0c4dcd602817 ("RDMA/bnxt_re: Refactor hardware queue memory allocation")
Signed-off-by: Anantha Prabhu <anantha.prabhu@broadcom.com>
Reviewed-by: Saravanan Vajravel <saravanan.vajravel@broadcom.com>
Reviewed-by: Selvin Xavier <selvin.xavier@broadcom.com>
Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
---
 drivers/infiniband/hw/bnxt_re/qplib_res.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/infiniband/hw/bnxt_re/qplib_res.c b/drivers/infiniband/hw/bnxt_re/qplib_res.c
index 6cd05207ffed..cc5c82d96839 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_res.c
+++ b/drivers/infiniband/hw/bnxt_re/qplib_res.c
@@ -121,6 +121,7 @@ static int __alloc_pbl(struct bnxt_qplib_res *res,
 	pbl->pg_arr = vmalloc_array(pages, sizeof(void *));
 	if (!pbl->pg_arr)
 		return -ENOMEM;
+	memset(pbl->pg_arr, 0, pages * sizeof(void *));
 
 	pbl->pg_map_arr = vmalloc_array(pages, sizeof(dma_addr_t));
 	if (!pbl->pg_map_arr) {
@@ -128,6 +129,7 @@ static int __alloc_pbl(struct bnxt_qplib_res *res,
 		pbl->pg_arr = NULL;
 		return -ENOMEM;
 	}
+	memset(pbl->pg_map_arr, 0, pages * sizeof(dma_addr_t));
 	pbl->pg_count = 0;
 	pbl->pg_size = sginfo->pgsize;
 
-- 
2.43.5


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH rdma-rc 0/4] RDMA/bnxt_re: Bug fixes for bnxt_re driver
  2025-08-05 10:09 [PATCH rdma-rc 0/4] RDMA/bnxt_re: Bug fixes for bnxt_re driver Kalesh AP
                   ` (3 preceding siblings ...)
  2025-08-05 10:10 ` [PATCH rdma-rc 4/4] RDMA/bnxt_re: Fix to initialize the PBL array Kalesh AP
@ 2025-08-13 10:35 ` Leon Romanovsky
  4 siblings, 0 replies; 6+ messages in thread
From: Leon Romanovsky @ 2025-08-13 10:35 UTC (permalink / raw)
  To: jgg, Kalesh AP; +Cc: linux-rdma, andrew.gospodarek, selvin.xavier


On Tue, 05 Aug 2025 15:39:56 +0530, Kalesh AP wrote:
> This series of patches provides few fixes for the bnxt_re driver.
> A couple of SRQ related fixes, one fix for a possible memory leak.
> 
> Thanks,
> Kalesh AP
> 
> Anantha Prabhu (1):
>   RDMA/bnxt_re: Fix to initialize the PBL array
> 
> [...]

Applied, thanks!

[1/4] RDMA/bnxt_re: Fix to do SRQ armena by default
      https://git.kernel.org/rdma/rdma/c/6296f9a5293ada
[2/4] RDMA/bnxt_re: Fix to remove workload check in SRQ limit path
      https://git.kernel.org/rdma/rdma/c/666bce0bd7e771
[3/4] RDMA/bnxt_re: Fix a possible memory leak in the driver
      https://git.kernel.org/rdma/rdma/c/ba60a1e8cbbd39
[4/4] RDMA/bnxt_re: Fix to initialize the PBL array
      https://git.kernel.org/rdma/rdma/c/806b9f494f6279

Best regards,
-- 
Leon Romanovsky <leon@kernel.org>


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2025-08-13 10:35 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-05 10:09 [PATCH rdma-rc 0/4] RDMA/bnxt_re: Bug fixes for bnxt_re driver Kalesh AP
2025-08-05 10:09 ` [PATCH rdma-rc 1/4] RDMA/bnxt_re: Fix to do SRQ armena by default Kalesh AP
2025-08-05 10:09 ` [PATCH rdma-rc 2/4] RDMA/bnxt_re: Fix to remove workload check in SRQ limit path Kalesh AP
2025-08-05 10:09 ` [PATCH rdma-rc 3/4] RDMA/bnxt_re: Fix a possible memory leak in the driver Kalesh AP
2025-08-05 10:10 ` [PATCH rdma-rc 4/4] RDMA/bnxt_re: Fix to initialize the PBL array Kalesh AP
2025-08-13 10:35 ` [PATCH rdma-rc 0/4] RDMA/bnxt_re: Bug fixes for bnxt_re driver Leon Romanovsky

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).