Skip to content

Commit 15cec63

Browse files
Wei Fangkuba-moo
authored andcommitted
net: fec: tx processing does not call XDP APIs if budget is 0
According to the clarification [1] in the latest napi.rst, the tx processing cannot call any XDP (or page pool) APIs if the "budget" is 0. Because NAPI is called with the budget of 0 (such as netpoll) indicates we may be in an IRQ context, however, we cannot use the page pool from IRQ context. [1] https://lore.kernel.org/all/[email protected]/ Fixes: 20f7973 ("net: fec: recycle pages for transmitted XDP frames") Signed-off-by: Wei Fang <[email protected]> Suggested-by: Jakub Kicinski <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 2e3c5df commit 15cec63

File tree

1 file changed

+12
-4
lines changed

1 file changed

+12
-4
lines changed

drivers/net/ethernet/freescale/fec_main.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1372,7 +1372,7 @@ fec_enet_hwtstamp(struct fec_enet_private *fep, unsigned ts,
13721372
}
13731373

13741374
static void
1375-
fec_enet_tx_queue(struct net_device *ndev, u16 queue_id)
1375+
fec_enet_tx_queue(struct net_device *ndev, u16 queue_id, int budget)
13761376
{
13771377
struct fec_enet_private *fep;
13781378
struct xdp_frame *xdpf;
@@ -1416,6 +1416,14 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id)
14161416
if (!skb)
14171417
goto tx_buf_done;
14181418
} else {
1419+
/* Tx processing cannot call any XDP (or page pool) APIs if
1420+
* the "budget" is 0. Because NAPI is called with budget of
1421+
* 0 (such as netpoll) indicates we may be in an IRQ context,
1422+
* however, we can't use the page pool from IRQ context.
1423+
*/
1424+
if (unlikely(!budget))
1425+
break;
1426+
14191427
xdpf = txq->tx_buf[index].xdp;
14201428
if (bdp->cbd_bufaddr)
14211429
dma_unmap_single(&fep->pdev->dev,
@@ -1508,14 +1516,14 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id)
15081516
writel(0, txq->bd.reg_desc_active);
15091517
}
15101518

1511-
static void fec_enet_tx(struct net_device *ndev)
1519+
static void fec_enet_tx(struct net_device *ndev, int budget)
15121520
{
15131521
struct fec_enet_private *fep = netdev_priv(ndev);
15141522
int i;
15151523

15161524
/* Make sure that AVB queues are processed first. */
15171525
for (i = fep->num_tx_queues - 1; i >= 0; i--)
1518-
fec_enet_tx_queue(ndev, i);
1526+
fec_enet_tx_queue(ndev, i, budget);
15191527
}
15201528

15211529
static void fec_enet_update_cbd(struct fec_enet_priv_rx_q *rxq,
@@ -1858,7 +1866,7 @@ static int fec_enet_rx_napi(struct napi_struct *napi, int budget)
18581866

18591867
do {
18601868
done += fec_enet_rx(ndev, budget - done);
1861-
fec_enet_tx(ndev);
1869+
fec_enet_tx(ndev, budget);
18621870
} while ((done < budget) && fec_enet_collect_events(fep));
18631871

18641872
if (done < budget) {

0 commit comments

Comments
 (0)