Skip to content

Commit 4061c28

Browse files
net: mana: Switch to page pool for jumbo frames
jira LE-3907 commit-author Haiyang Zhang <[email protected]> commit fa37a88 Frag allocators, such as netdev_alloc_frag(), were not designed to work for fragsz > PAGE_SIZE. So, switch to page pool for jumbo frames instead of using page frag allocators. This driver is using page pool for smaller MTUs already. Cc: [email protected] Fixes: 80f6215 ("net: mana: Add support for jumbo frame") Signed-off-by: Haiyang Zhang <[email protected]> Reviewed-by: Long Li <[email protected]> Reviewed-by: Shradha Gupta <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]> (cherry picked from commit fa37a88) Signed-off-by: Shreeya Patel <[email protected]>
1 parent f7381d1 commit 4061c28

File tree

1 file changed

+9
-37
lines changed

1 file changed

+9
-37
lines changed

drivers/net/ethernet/microsoft/mana/mana_en.c

Lines changed: 9 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -655,30 +655,16 @@ int mana_pre_alloc_rxbufs(struct mana_port_context *mpc, int new_mtu, int num_qu
655655
mpc->rxbpre_total = 0;
656656

657657
for (i = 0; i < num_rxb; i++) {
658-
if (mpc->rxbpre_alloc_size > PAGE_SIZE) {
659-
va = netdev_alloc_frag(mpc->rxbpre_alloc_size);
660-
if (!va)
661-
goto error;
662-
663-
page = virt_to_head_page(va);
664-
/* Check if the frag falls back to single page */
665-
if (compound_order(page) <
666-
get_order(mpc->rxbpre_alloc_size)) {
667-
put_page(page);
668-
goto error;
669-
}
670-
} else {
671-
page = dev_alloc_page();
672-
if (!page)
673-
goto error;
658+
page = dev_alloc_pages(get_order(mpc->rxbpre_alloc_size));
659+
if (!page)
660+
goto error;
674661

675-
va = page_to_virt(page);
676-
}
662+
va = page_to_virt(page);
677663

678664
da = dma_map_single(dev, va + mpc->rxbpre_headroom,
679665
mpc->rxbpre_datasize, DMA_FROM_DEVICE);
680666
if (dma_mapping_error(dev, da)) {
681-
put_page(virt_to_head_page(va));
667+
put_page(page);
682668
goto error;
683669
}
684670

@@ -1671,7 +1657,7 @@ static void mana_rx_skb(void *buf_va, bool from_pool,
16711657
}
16721658

16731659
static void *mana_get_rxfrag(struct mana_rxq *rxq, struct device *dev,
1674-
dma_addr_t *da, bool *from_pool, bool is_napi)
1660+
dma_addr_t *da, bool *from_pool)
16751661
{
16761662
struct page *page;
16771663
void *va;
@@ -1682,21 +1668,6 @@ static void *mana_get_rxfrag(struct mana_rxq *rxq, struct device *dev,
16821668
if (rxq->xdp_save_va) {
16831669
va = rxq->xdp_save_va;
16841670
rxq->xdp_save_va = NULL;
1685-
} else if (rxq->alloc_size > PAGE_SIZE) {
1686-
if (is_napi)
1687-
va = napi_alloc_frag(rxq->alloc_size);
1688-
else
1689-
va = netdev_alloc_frag(rxq->alloc_size);
1690-
1691-
if (!va)
1692-
return NULL;
1693-
1694-
page = virt_to_head_page(va);
1695-
/* Check if the frag falls back to single page */
1696-
if (compound_order(page) < get_order(rxq->alloc_size)) {
1697-
put_page(page);
1698-
return NULL;
1699-
}
17001671
} else {
17011672
page = page_pool_dev_alloc_pages(rxq->page_pool);
17021673
if (!page)
@@ -1729,7 +1700,7 @@ static void mana_refill_rx_oob(struct device *dev, struct mana_rxq *rxq,
17291700
dma_addr_t da;
17301701
void *va;
17311702

1732-
va = mana_get_rxfrag(rxq, dev, &da, &from_pool, true);
1703+
va = mana_get_rxfrag(rxq, dev, &da, &from_pool);
17331704
if (!va)
17341705
return;
17351706

@@ -2165,7 +2136,7 @@ static int mana_fill_rx_oob(struct mana_recv_buf_oob *rx_oob, u32 mem_key,
21652136
if (mpc->rxbufs_pre)
21662137
va = mana_get_rxbuf_pre(rxq, &da);
21672138
else
2168-
va = mana_get_rxfrag(rxq, dev, &da, &from_pool, false);
2139+
va = mana_get_rxfrag(rxq, dev, &da, &from_pool);
21692140

21702141
if (!va)
21712142
return -ENOMEM;
@@ -2251,6 +2222,7 @@ static int mana_create_page_pool(struct mana_rxq *rxq, struct gdma_context *gc)
22512222
pprm.nid = gc->numa_node;
22522223
pprm.napi = &rxq->rx_cq.napi;
22532224
pprm.netdev = rxq->ndev;
2225+
pprm.order = get_order(rxq->alloc_size);
22542226

22552227
rxq->page_pool = page_pool_create(&pprm);
22562228

0 commit comments

Comments
 (0)