[PATCH net-next v2 1/6] bnge: Extract bnapi allocation and cleanup into helpers
From: Bhargava Marreddy
Date: Tue Sep 22 2026 - 01:31:25 EST
Factor bn->bnapi allocation and free logic out of bnge_{alloc,free}_core()
into new bnge_{alloc,free}_bnapi_mem() helpers.
Prepare the driver to move bnapi allocation out of the open/close path,
and add NULL guards for rx_ring and tx_ring in core driver cleanup paths.
Signed-off-by: Bhargava Marreddy <bhargava.marreddy@xxxxxxxxxxxx>
Reviewed-by: Vikas Gupta <vikas.gupta@xxxxxxxxxxxx>
Reviewed-by: Rajashekar Hudumula <rajashekar.hudumula@xxxxxxxxxxxx>
---
.../net/ethernet/broadcom/bnge/bnge_netdev.c | 38 ++++++++++++++++---
1 file changed, 32 insertions(+), 6 deletions(-)
diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c
index a4288f0258f8..c1810a309888 100644
--- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c
+++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c
@@ -825,6 +825,9 @@ static void bnge_free_tpa_info(struct bnge_net *bn)
struct bnge_dev *bd = bn->bd;
int i, j;
+ if (!bn->rx_ring)
+ return;
+
for (i = 0; i < bd->rx_nr_rings; i++) {
struct bnge_rx_ring_info *rxr = &bn->rx_ring[i];
@@ -881,6 +884,9 @@ static void bnge_free_rx_rings(struct bnge_net *bn)
struct bnge_dev *bd = bn->bd;
int i;
+ if (!bn->rx_ring)
+ return;
+
bnge_free_tpa_info(bn);
for (i = 0; i < bd->rx_nr_rings; i++) {
struct bnge_rx_ring_info *rxr = &bn->rx_ring[i];
@@ -1024,6 +1030,9 @@ static void bnge_free_tx_rings(struct bnge_net *bn)
struct bnge_dev *bd = bn->bd;
int i;
+ if (!bn->tx_ring)
+ return;
+
for (i = 0; i < bd->tx_nr_rings; i++) {
struct bnge_tx_ring_info *txr = &bn->tx_ring[i];
struct bnge_ring_struct *ring;
@@ -1195,6 +1204,12 @@ static int bnge_init_ring_grps(struct bnge_net *bn)
return 0;
}
+static void bnge_free_bnapi_mem(struct bnge_net *bn)
+{
+ kfree(bn->bnapi);
+ bn->bnapi = NULL;
+}
+
static void bnge_free_core(struct bnge_net *bn)
{
bnge_free_vnic_attributes(bn);
@@ -1211,15 +1226,13 @@ static void bnge_free_core(struct bnge_net *bn)
bn->tx_ring = NULL;
kfree(bn->rx_ring);
bn->rx_ring = NULL;
- kfree(bn->bnapi);
- bn->bnapi = NULL;
+ bnge_free_bnapi_mem(bn);
}
-static int bnge_alloc_core(struct bnge_net *bn)
+static int bnge_alloc_bnapi_mem(struct bnge_net *bn)
{
struct bnge_dev *bd = bn->bd;
- int i, j, size, arr_size;
- int rc = -ENOMEM;
+ int i, size, arr_size;
void *bnapi;
arr_size = L1_CACHE_ALIGN(sizeof(struct bnge_napi *) *
@@ -1227,7 +1240,7 @@ static int bnge_alloc_core(struct bnge_net *bn)
size = L1_CACHE_ALIGN(sizeof(struct bnge_napi));
bnapi = kzalloc(arr_size + size * bd->nq_nr_rings, GFP_KERNEL);
if (!bnapi)
- return rc;
+ return -ENOMEM;
bn->bnapi = bnapi;
bnapi += arr_size;
@@ -1241,6 +1254,19 @@ static int bnge_alloc_core(struct bnge_net *bn)
nqr->ring_struct.ring_mem.flags = BNGE_RMEM_RING_PTE_FLAG;
}
+ return 0;
+}
+
+static int bnge_alloc_core(struct bnge_net *bn)
+{
+ struct bnge_dev *bd = bn->bd;
+ int i, j, rc;
+
+ rc = bnge_alloc_bnapi_mem(bn);
+ if (rc)
+ return rc;
+
+ rc = -ENOMEM;
bn->rx_ring = kzalloc_objs(struct bnge_rx_ring_info, bd->rx_nr_rings);
if (!bn->rx_ring)
goto err_free_core;
--
2.47.3