Skip to content

Commit 86b0550

Browse files
skotur-brcmkuba-moo
authored andcommitted
bnxt_en: Use the unified RX page pool buffers for XDP and non-XDP
Convert to use the page pool buffers for the aggregation ring when running in non-XDP mode. This simplifies the driver and we benefit from the recycling of pages. Adjust the page pool size to account for the aggregation ring size. Signed-off-by: Somnath Kotur <[email protected]> Signed-off-by: Michael Chan <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent c6cfc6c commit 86b0550

File tree

2 files changed

+14
-60
lines changed

2 files changed

+14
-60
lines changed

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

Lines changed: 14 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -877,48 +877,15 @@ static inline int bnxt_alloc_rx_page(struct bnxt *bp,
877877
struct rx_bd *rxbd =
878878
&rxr->rx_agg_desc_ring[RX_RING(prod)][RX_IDX(prod)];
879879
struct bnxt_sw_rx_agg_bd *rx_agg_buf;
880-
struct pci_dev *pdev = bp->pdev;
881880
struct page *page;
882881
dma_addr_t mapping;
883882
u16 sw_prod = rxr->rx_sw_agg_prod;
884883
unsigned int offset = 0;
885884

886-
if (BNXT_RX_PAGE_MODE(bp)) {
887-
page = __bnxt_alloc_rx_page(bp, &mapping, rxr, &offset, gfp);
888-
889-
if (!page)
890-
return -ENOMEM;
891-
892-
} else {
893-
if (PAGE_SIZE > BNXT_RX_PAGE_SIZE) {
894-
page = rxr->rx_page;
895-
if (!page) {
896-
page = alloc_page(gfp);
897-
if (!page)
898-
return -ENOMEM;
899-
rxr->rx_page = page;
900-
rxr->rx_page_offset = 0;
901-
}
902-
offset = rxr->rx_page_offset;
903-
rxr->rx_page_offset += BNXT_RX_PAGE_SIZE;
904-
if (rxr->rx_page_offset == PAGE_SIZE)
905-
rxr->rx_page = NULL;
906-
else
907-
get_page(page);
908-
} else {
909-
page = alloc_page(gfp);
910-
if (!page)
911-
return -ENOMEM;
912-
}
885+
page = __bnxt_alloc_rx_page(bp, &mapping, rxr, &offset, gfp);
913886

914-
mapping = dma_map_page_attrs(&pdev->dev, page, offset,
915-
BNXT_RX_PAGE_SIZE, DMA_FROM_DEVICE,
916-
DMA_ATTR_WEAK_ORDERING);
917-
if (dma_mapping_error(&pdev->dev, mapping)) {
918-
__free_page(page);
919-
return -EIO;
920-
}
921-
}
887+
if (!page)
888+
return -ENOMEM;
922889

923890
if (unlikely(test_bit(sw_prod, rxr->rx_agg_bmap)))
924891
sw_prod = bnxt_find_next_agg_idx(rxr, sw_prod);
@@ -1204,6 +1171,7 @@ static struct sk_buff *bnxt_rx_agg_pages_skb(struct bnxt *bp,
12041171
total_frag_len = __bnxt_rx_agg_pages(bp, cpr, shinfo, idx,
12051172
agg_bufs, tpa, NULL);
12061173
if (!total_frag_len) {
1174+
skb_mark_for_recycle(skb);
12071175
dev_kfree_skb(skb);
12081176
return NULL;
12091177
}
@@ -1794,6 +1762,7 @@ static void bnxt_deliver_skb(struct bnxt *bp, struct bnxt_napi *bnapi,
17941762
return;
17951763
}
17961764
skb_record_rx_queue(skb, bnapi->index);
1765+
skb_mark_for_recycle(skb);
17971766
napi_gro_receive(&bnapi->napi, skb);
17981767
}
17991768

@@ -3002,30 +2971,16 @@ static void bnxt_free_one_rx_ring_skbs(struct bnxt *bp, int ring_nr)
30022971
if (!page)
30032972
continue;
30042973

3005-
if (BNXT_RX_PAGE_MODE(bp)) {
3006-
dma_unmap_page_attrs(&pdev->dev, rx_agg_buf->mapping,
3007-
BNXT_RX_PAGE_SIZE, bp->rx_dir,
3008-
DMA_ATTR_WEAK_ORDERING);
3009-
rx_agg_buf->page = NULL;
3010-
__clear_bit(i, rxr->rx_agg_bmap);
3011-
3012-
page_pool_recycle_direct(rxr->page_pool, page);
3013-
} else {
3014-
dma_unmap_page_attrs(&pdev->dev, rx_agg_buf->mapping,
3015-
BNXT_RX_PAGE_SIZE, DMA_FROM_DEVICE,
3016-
DMA_ATTR_WEAK_ORDERING);
3017-
rx_agg_buf->page = NULL;
3018-
__clear_bit(i, rxr->rx_agg_bmap);
2974+
dma_unmap_page_attrs(&pdev->dev, rx_agg_buf->mapping,
2975+
BNXT_RX_PAGE_SIZE, bp->rx_dir,
2976+
DMA_ATTR_WEAK_ORDERING);
2977+
rx_agg_buf->page = NULL;
2978+
__clear_bit(i, rxr->rx_agg_bmap);
30192979

3020-
__free_page(page);
3021-
}
2980+
page_pool_recycle_direct(rxr->page_pool, page);
30222981
}
30232982

30242983
skip_rx_agg_free:
3025-
if (rxr->rx_page) {
3026-
__free_page(rxr->rx_page);
3027-
rxr->rx_page = NULL;
3028-
}
30292984
map = rxr->rx_tpa_idx_map;
30302985
if (map)
30312986
memset(map->agg_idx_bmap, 0, sizeof(map->agg_idx_bmap));
@@ -3244,7 +3199,9 @@ static int bnxt_alloc_rx_page_pool(struct bnxt *bp,
32443199
{
32453200
struct page_pool_params pp = { 0 };
32463201

3247-
pp.pool_size = bp->rx_ring_size;
3202+
pp.pool_size = bp->rx_agg_ring_size;
3203+
if (BNXT_RX_PAGE_MODE(bp))
3204+
pp.pool_size += bp->rx_ring_size;
32483205
pp.nid = dev_to_node(&bp->pdev->dev);
32493206
pp.napi = &rxr->bnapi->napi;
32503207
pp.dev = &bp->pdev->dev;

drivers/net/ethernet/broadcom/bnxt/bnxt.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -919,9 +919,6 @@ struct bnxt_rx_ring_info {
919919
unsigned long *rx_agg_bmap;
920920
u16 rx_agg_bmap_size;
921921

922-
struct page *rx_page;
923-
unsigned int rx_page_offset;
924-
925922
dma_addr_t rx_desc_mapping[MAX_RX_PAGES];
926923
dma_addr_t rx_agg_desc_mapping[MAX_RX_AGG_PAGES];
927924

0 commit comments

Comments
 (0)