[PATCH net-next v2 1/6] bnge: Extract bnapi allocation and cleanup into helpers
From: Bhargava Marreddy <hidden>
Date: 2026-09-22 05:30:43
Also in:
lkml
Subsystem:
broadcom bng_en 800 gigabit ethernet driver, networking drivers, the rest · Maintainers:
Vikas Gupta, Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
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 <redacted>
Reviewed-by: Vikas Gupta <vikas.gupta@broadcom.com>
Reviewed-by: Rajashekar Hudumula <redacted>
---
.../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