Message ID | 20240502045410.3524155-6-dw@davidwei.uk (mailing list archive) |
---|---|
State | RFC |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | bnxt: implement queue api | expand |
On Wed, May 01, 2024 at 09:54:06PM -0700, David Wei wrote: > Refactor the allocation of each rx ring's tpa_info in > bnxt_alloc_tpa_info() out into a standalone function > __bnxt_alloc_one_tpa_info(). > > In case of allocation failures during bnxt_alloc_tpa_info(), clean up > in-place. > > Change bnxt_free_tpa_info() to free a single rx ring passed in as a > parameter. This makes bnxt_free_rx_rings() more symmetrical. > > Signed-off-by: David Wei <dw@davidwei.uk> Hi David, Some minor nits flagged by ./scripts/checkpatch.pl --codespell --max-line-length=80 --strict > --- > drivers/net/ethernet/broadcom/bnxt/bnxt.c | 95 +++++++++++++++-------- > 1 file changed, 62 insertions(+), 33 deletions(-) > > diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c ... > +static int __bnxt_alloc_one_tpa_info(struct bnxt *bp, struct bnxt_rx_ring_info *rxr) > +{ Please consider limiting Networking code to 80 columns wide where it can be trivially achieved. In this case, perhaps: static int __bnxt_alloc_one_tpa_info(struct bnxt *bp, struct bnxt_rx_ring_info *rxr) > + struct rx_agg_cmp *agg; > + int i, rc; > + > + rxr->rx_tpa = kcalloc(bp->max_tpa, sizeof(struct bnxt_tpa_info), > + GFP_KERNEL); The indentation here is not quite right. rxr->rx_tpa = kcalloc(bp->max_tpa, sizeof(struct bnxt_tpa_info), GFP_KERNEL); > + if (!rxr->rx_tpa) > + return -ENOMEM; > + > + if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS)) > + return 0; > + > + for (i = 0; i < bp->max_tpa; i++) { > + agg = kcalloc(MAX_SKB_FRAGS, sizeof(*agg), GFP_KERNEL); > + if (!agg) { > + rc = -ENOMEM; > + goto err_free; > } > - kfree(rxr->rx_tpa); > - rxr->rx_tpa = NULL; > + rxr->rx_tpa[i].agg_arr = agg; > + } > + rxr->rx_tpa_idx_map = kzalloc(sizeof(*rxr->rx_tpa_idx_map), > + GFP_KERNEL); > + if (!rxr->rx_tpa_idx_map) { > + rc = -ENOMEM; > + goto err_free; > } > + > + return 0; > + > +err_free: > + while(i--) { Space before '(' here please. > + kfree(rxr->rx_tpa[i].agg_arr); > + rxr->rx_tpa[i].agg_arr = NULL; > + } > + kfree(rxr->rx_tpa); > + rxr->rx_tpa = NULL; > + > + return rc; > } ...
On 2024-05-04 05:30, Simon Horman wrote: > On Wed, May 01, 2024 at 09:54:06PM -0700, David Wei wrote: >> Refactor the allocation of each rx ring's tpa_info in >> bnxt_alloc_tpa_info() out into a standalone function >> __bnxt_alloc_one_tpa_info(). >> >> In case of allocation failures during bnxt_alloc_tpa_info(), clean up >> in-place. >> >> Change bnxt_free_tpa_info() to free a single rx ring passed in as a >> parameter. This makes bnxt_free_rx_rings() more symmetrical. >> >> Signed-off-by: David Wei <dw@davidwei.uk> > > Hi David, > > Some minor nits flagged by > > ./scripts/checkpatch.pl --codespell --max-line-length=80 --strict I didn't run through the usual checks because this is an RFC. I'll fix it for the next series, thanks. > >> --- >> drivers/net/ethernet/broadcom/bnxt/bnxt.c | 95 +++++++++++++++-------- >> 1 file changed, 62 insertions(+), 33 deletions(-) >> >> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c > > ... > >> +static int __bnxt_alloc_one_tpa_info(struct bnxt *bp, struct bnxt_rx_ring_info *rxr) >> +{ > > Please consider limiting Networking code to 80 columns wide where > it can be trivially achieved. > > In this case, perhaps: > > static int __bnxt_alloc_one_tpa_info(struct bnxt *bp, > struct bnxt_rx_ring_info *rxr) > >> + struct rx_agg_cmp *agg; >> + int i, rc; >> + >> + rxr->rx_tpa = kcalloc(bp->max_tpa, sizeof(struct bnxt_tpa_info), >> + GFP_KERNEL); > > The indentation here is not quite right. > > rxr->rx_tpa = kcalloc(bp->max_tpa, sizeof(struct bnxt_tpa_info), > GFP_KERNEL); > >> + if (!rxr->rx_tpa) >> + return -ENOMEM; >> + >> + if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS)) >> + return 0; >> + >> + for (i = 0; i < bp->max_tpa; i++) { >> + agg = kcalloc(MAX_SKB_FRAGS, sizeof(*agg), GFP_KERNEL); >> + if (!agg) { >> + rc = -ENOMEM; >> + goto err_free; >> } >> - kfree(rxr->rx_tpa); >> - rxr->rx_tpa = NULL; >> + rxr->rx_tpa[i].agg_arr = agg; >> + } >> + rxr->rx_tpa_idx_map = kzalloc(sizeof(*rxr->rx_tpa_idx_map), >> + GFP_KERNEL); >> + if (!rxr->rx_tpa_idx_map) { >> + rc = -ENOMEM; >> + goto err_free; >> } >> + >> + return 0; >> + >> +err_free: >> + while(i--) { > > Space before '(' here please. > >> + kfree(rxr->rx_tpa[i].agg_arr); >> + rxr->rx_tpa[i].agg_arr = NULL; >> + } >> + kfree(rxr->rx_tpa); >> + rxr->rx_tpa = NULL; >> + >> + return rc; >> } > > ...
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 7b20303f3b7d..bda49e7f6c3d 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -3500,29 +3500,66 @@ static int bnxt_alloc_ring(struct bnxt *bp, struct bnxt_ring_mem_info *rmem) return 0; } -static void bnxt_free_tpa_info(struct bnxt *bp) +static void bnxt_free_tpa_info(struct bnxt *bp, struct bnxt_rx_ring_info *rxr) { - int i, j; + int i; - for (i = 0; i < bp->rx_nr_rings; i++) { - struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i]; + kfree(rxr->rx_tpa_idx_map); + rxr->rx_tpa_idx_map = NULL; + if (rxr->rx_tpa) { + for (i = 0; i < bp->max_tpa; i++) { + kfree(rxr->rx_tpa[i].agg_arr); + rxr->rx_tpa[i].agg_arr = NULL; + } + } + kfree(rxr->rx_tpa); + rxr->rx_tpa = NULL; +} - kfree(rxr->rx_tpa_idx_map); - rxr->rx_tpa_idx_map = NULL; - if (rxr->rx_tpa) { - for (j = 0; j < bp->max_tpa; j++) { - kfree(rxr->rx_tpa[j].agg_arr); - rxr->rx_tpa[j].agg_arr = NULL; - } +static int __bnxt_alloc_one_tpa_info(struct bnxt *bp, struct bnxt_rx_ring_info *rxr) +{ + struct rx_agg_cmp *agg; + int i, rc; + + rxr->rx_tpa = kcalloc(bp->max_tpa, sizeof(struct bnxt_tpa_info), + GFP_KERNEL); + if (!rxr->rx_tpa) + return -ENOMEM; + + if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS)) + return 0; + + for (i = 0; i < bp->max_tpa; i++) { + agg = kcalloc(MAX_SKB_FRAGS, sizeof(*agg), GFP_KERNEL); + if (!agg) { + rc = -ENOMEM; + goto err_free; } - kfree(rxr->rx_tpa); - rxr->rx_tpa = NULL; + rxr->rx_tpa[i].agg_arr = agg; + } + rxr->rx_tpa_idx_map = kzalloc(sizeof(*rxr->rx_tpa_idx_map), + GFP_KERNEL); + if (!rxr->rx_tpa_idx_map) { + rc = -ENOMEM; + goto err_free; } + + return 0; + +err_free: + while(i--) { + kfree(rxr->rx_tpa[i].agg_arr); + rxr->rx_tpa[i].agg_arr = NULL; + } + kfree(rxr->rx_tpa); + rxr->rx_tpa = NULL; + + return rc; } static int bnxt_alloc_tpa_info(struct bnxt *bp) { - int i, j; + int i, rc; bp->max_tpa = MAX_TPA; if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) { @@ -3533,27 +3570,18 @@ static int bnxt_alloc_tpa_info(struct bnxt *bp) for (i = 0; i < bp->rx_nr_rings; i++) { struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i]; - struct rx_agg_cmp *agg; - - rxr->rx_tpa = kcalloc(bp->max_tpa, sizeof(struct bnxt_tpa_info), - GFP_KERNEL); - if (!rxr->rx_tpa) - return -ENOMEM; - if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS)) - continue; - for (j = 0; j < bp->max_tpa; j++) { - agg = kcalloc(MAX_SKB_FRAGS, sizeof(*agg), GFP_KERNEL); - if (!agg) - return -ENOMEM; - rxr->rx_tpa[j].agg_arr = agg; - } - rxr->rx_tpa_idx_map = kzalloc(sizeof(*rxr->rx_tpa_idx_map), - GFP_KERNEL); - if (!rxr->rx_tpa_idx_map) - return -ENOMEM; + rc = __bnxt_alloc_one_tpa_info(bp, rxr); + if (rc) + goto err_free; } return 0; + +err_free: + while (i--) + bnxt_free_tpa_info(bp, &bp->rx_ring[i]); + + return rc; } static void bnxt_free_rx_rings(struct bnxt *bp) @@ -3563,11 +3591,12 @@ static void bnxt_free_rx_rings(struct bnxt *bp) if (!bp->rx_ring) return; - bnxt_free_tpa_info(bp); for (i = 0; i < bp->rx_nr_rings; i++) { struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i]; struct bnxt_ring_struct *ring; + bnxt_free_tpa_info(bp, rxr); + if (rxr->xdp_prog) bpf_prog_put(rxr->xdp_prog);
Refactor the allocation of each rx ring's tpa_info in bnxt_alloc_tpa_info() out into a standalone function __bnxt_alloc_one_tpa_info(). In case of allocation failures during bnxt_alloc_tpa_info(), clean up in-place. Change bnxt_free_tpa_info() to free a single rx ring passed in as a parameter. This makes bnxt_free_rx_rings() more symmetrical. Signed-off-by: David Wei <dw@davidwei.uk> --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 95 +++++++++++++++-------- 1 file changed, 62 insertions(+), 33 deletions(-)