Skip to content

Commit 5883a3e

Browse files
spikehkuba-moo
authored andcommitted
bnxt_en: refactor tpa_info alloc/free into helpers
Refactor bnxt_rx_ring_info->tpa_info operations into helpers that work on a single tpa_info in prep for queue API using them. There are 2 pairs of operations: * bnxt_alloc_one_tpa_info() * bnxt_free_one_tpa_info() These alloc/free the tpa_info array itself. * bnxt_alloc_one_tpa_info_data() * bnxt_free_one_tpa_info_data() These alloc/free the frags stored in tpa_info array. Reviewed-by: Somnath Kotur <[email protected]> Signed-off-by: David Wei <[email protected]> Reviewed-by: Michael Chan <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 8588c99 commit 5883a3e

File tree

1 file changed

+90
-52
lines changed
  • drivers/net/ethernet/broadcom/bnxt

1 file changed

+90
-52
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt.c

Lines changed: 90 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -3421,15 +3421,11 @@ static void bnxt_free_one_rx_agg_ring(struct bnxt *bp, struct bnxt_rx_ring_info
34213421
}
34223422
}
34233423

3424-
static void bnxt_free_one_rx_ring_skbs(struct bnxt *bp, int ring_nr)
3424+
static void bnxt_free_one_tpa_info_data(struct bnxt *bp,
3425+
struct bnxt_rx_ring_info *rxr)
34253426
{
3426-
struct bnxt_rx_ring_info *rxr = &bp->rx_ring[ring_nr];
3427-
struct bnxt_tpa_idx_map *map;
34283427
int i;
34293428

3430-
if (!rxr->rx_tpa)
3431-
goto skip_rx_tpa_free;
3432-
34333429
for (i = 0; i < bp->max_tpa; i++) {
34343430
struct bnxt_tpa_info *tpa_info = &rxr->rx_tpa[i];
34353431
u8 *data = tpa_info->data;
@@ -3440,6 +3436,17 @@ static void bnxt_free_one_rx_ring_skbs(struct bnxt *bp, int ring_nr)
34403436
tpa_info->data = NULL;
34413437
page_pool_free_va(rxr->head_pool, data, false);
34423438
}
3439+
}
3440+
3441+
static void bnxt_free_one_rx_ring_skbs(struct bnxt *bp,
3442+
struct bnxt_rx_ring_info *rxr)
3443+
{
3444+
struct bnxt_tpa_idx_map *map;
3445+
3446+
if (!rxr->rx_tpa)
3447+
goto skip_rx_tpa_free;
3448+
3449+
bnxt_free_one_tpa_info_data(bp, rxr);
34433450

34443451
skip_rx_tpa_free:
34453452
if (!rxr->rx_buf_ring)
@@ -3467,7 +3474,7 @@ static void bnxt_free_rx_skbs(struct bnxt *bp)
34673474
return;
34683475

34693476
for (i = 0; i < bp->rx_nr_rings; i++)
3470-
bnxt_free_one_rx_ring_skbs(bp, i);
3477+
bnxt_free_one_rx_ring_skbs(bp, &bp->rx_ring[i]);
34713478
}
34723479

34733480
static void bnxt_free_skbs(struct bnxt *bp)
@@ -3608,29 +3615,64 @@ static int bnxt_alloc_ring(struct bnxt *bp, struct bnxt_ring_mem_info *rmem)
36083615
return 0;
36093616
}
36103617

3618+
static void bnxt_free_one_tpa_info(struct bnxt *bp,
3619+
struct bnxt_rx_ring_info *rxr)
3620+
{
3621+
int i;
3622+
3623+
kfree(rxr->rx_tpa_idx_map);
3624+
rxr->rx_tpa_idx_map = NULL;
3625+
if (rxr->rx_tpa) {
3626+
for (i = 0; i < bp->max_tpa; i++) {
3627+
kfree(rxr->rx_tpa[i].agg_arr);
3628+
rxr->rx_tpa[i].agg_arr = NULL;
3629+
}
3630+
}
3631+
kfree(rxr->rx_tpa);
3632+
rxr->rx_tpa = NULL;
3633+
}
3634+
36113635
static void bnxt_free_tpa_info(struct bnxt *bp)
36123636
{
3613-
int i, j;
3637+
int i;
36143638

36153639
for (i = 0; i < bp->rx_nr_rings; i++) {
36163640
struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i];
36173641

3618-
kfree(rxr->rx_tpa_idx_map);
3619-
rxr->rx_tpa_idx_map = NULL;
3620-
if (rxr->rx_tpa) {
3621-
for (j = 0; j < bp->max_tpa; j++) {
3622-
kfree(rxr->rx_tpa[j].agg_arr);
3623-
rxr->rx_tpa[j].agg_arr = NULL;
3624-
}
3625-
}
3626-
kfree(rxr->rx_tpa);
3627-
rxr->rx_tpa = NULL;
3642+
bnxt_free_one_tpa_info(bp, rxr);
36283643
}
36293644
}
36303645

3646+
static int bnxt_alloc_one_tpa_info(struct bnxt *bp,
3647+
struct bnxt_rx_ring_info *rxr)
3648+
{
3649+
struct rx_agg_cmp *agg;
3650+
int i;
3651+
3652+
rxr->rx_tpa = kcalloc(bp->max_tpa, sizeof(struct bnxt_tpa_info),
3653+
GFP_KERNEL);
3654+
if (!rxr->rx_tpa)
3655+
return -ENOMEM;
3656+
3657+
if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS))
3658+
return 0;
3659+
for (i = 0; i < bp->max_tpa; i++) {
3660+
agg = kcalloc(MAX_SKB_FRAGS, sizeof(*agg), GFP_KERNEL);
3661+
if (!agg)
3662+
return -ENOMEM;
3663+
rxr->rx_tpa[i].agg_arr = agg;
3664+
}
3665+
rxr->rx_tpa_idx_map = kzalloc(sizeof(*rxr->rx_tpa_idx_map),
3666+
GFP_KERNEL);
3667+
if (!rxr->rx_tpa_idx_map)
3668+
return -ENOMEM;
3669+
3670+
return 0;
3671+
}
3672+
36313673
static int bnxt_alloc_tpa_info(struct bnxt *bp)
36323674
{
3633-
int i, j;
3675+
int i, rc;
36343676

36353677
bp->max_tpa = MAX_TPA;
36363678
if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
@@ -3641,25 +3683,10 @@ static int bnxt_alloc_tpa_info(struct bnxt *bp)
36413683

36423684
for (i = 0; i < bp->rx_nr_rings; i++) {
36433685
struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i];
3644-
struct rx_agg_cmp *agg;
3645-
3646-
rxr->rx_tpa = kcalloc(bp->max_tpa, sizeof(struct bnxt_tpa_info),
3647-
GFP_KERNEL);
3648-
if (!rxr->rx_tpa)
3649-
return -ENOMEM;
36503686

3651-
if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS))
3652-
continue;
3653-
for (j = 0; j < bp->max_tpa; j++) {
3654-
agg = kcalloc(MAX_SKB_FRAGS, sizeof(*agg), GFP_KERNEL);
3655-
if (!agg)
3656-
return -ENOMEM;
3657-
rxr->rx_tpa[j].agg_arr = agg;
3658-
}
3659-
rxr->rx_tpa_idx_map = kzalloc(sizeof(*rxr->rx_tpa_idx_map),
3660-
GFP_KERNEL);
3661-
if (!rxr->rx_tpa_idx_map)
3662-
return -ENOMEM;
3687+
rc = bnxt_alloc_one_tpa_info(bp, rxr);
3688+
if (rc)
3689+
return rc;
36633690
}
36643691
return 0;
36653692
}
@@ -4268,10 +4295,31 @@ static void bnxt_alloc_one_rx_ring_page(struct bnxt *bp,
42684295
rxr->rx_agg_prod = prod;
42694296
}
42704297

4298+
static int bnxt_alloc_one_tpa_info_data(struct bnxt *bp,
4299+
struct bnxt_rx_ring_info *rxr)
4300+
{
4301+
dma_addr_t mapping;
4302+
u8 *data;
4303+
int i;
4304+
4305+
for (i = 0; i < bp->max_tpa; i++) {
4306+
data = __bnxt_alloc_rx_frag(bp, &mapping, rxr,
4307+
GFP_KERNEL);
4308+
if (!data)
4309+
return -ENOMEM;
4310+
4311+
rxr->rx_tpa[i].data = data;
4312+
rxr->rx_tpa[i].data_ptr = data + bp->rx_offset;
4313+
rxr->rx_tpa[i].mapping = mapping;
4314+
}
4315+
4316+
return 0;
4317+
}
4318+
42714319
static int bnxt_alloc_one_rx_ring(struct bnxt *bp, int ring_nr)
42724320
{
42734321
struct bnxt_rx_ring_info *rxr = &bp->rx_ring[ring_nr];
4274-
int i;
4322+
int rc;
42754323

42764324
bnxt_alloc_one_rx_ring_skb(bp, rxr, ring_nr);
42774325

@@ -4281,19 +4329,9 @@ static int bnxt_alloc_one_rx_ring(struct bnxt *bp, int ring_nr)
42814329
bnxt_alloc_one_rx_ring_page(bp, rxr, ring_nr);
42824330

42834331
if (rxr->rx_tpa) {
4284-
dma_addr_t mapping;
4285-
u8 *data;
4286-
4287-
for (i = 0; i < bp->max_tpa; i++) {
4288-
data = __bnxt_alloc_rx_frag(bp, &mapping, rxr,
4289-
GFP_KERNEL);
4290-
if (!data)
4291-
return -ENOMEM;
4292-
4293-
rxr->rx_tpa[i].data = data;
4294-
rxr->rx_tpa[i].data_ptr = data + bp->rx_offset;
4295-
rxr->rx_tpa[i].mapping = mapping;
4296-
}
4332+
rc = bnxt_alloc_one_tpa_info_data(bp, rxr);
4333+
if (rc)
4334+
return rc;
42974335
}
42984336
return 0;
42994337
}
@@ -13663,7 +13701,7 @@ static void bnxt_rx_ring_reset(struct bnxt *bp)
1366313701
bnxt_reset_task(bp, true);
1366413702
break;
1366513703
}
13666-
bnxt_free_one_rx_ring_skbs(bp, i);
13704+
bnxt_free_one_rx_ring_skbs(bp, rxr);
1366713705
rxr->rx_prod = 0;
1366813706
rxr->rx_agg_prod = 0;
1366913707
rxr->rx_sw_agg_prod = 0;

0 commit comments

Comments
 (0)