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 Reviewed-by: Vikas Gupta Reviewed-by: Rajashekar Hudumula --- .../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