mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-06 13:13:51 +00:00
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/20230720161323.2025379-1-kuba@kernel.org/
Fixes: 20f7973990
("net: fec: recycle pages for transmitted XDP frames")
Signed-off-by: Wei Fang <wei.fang@nxp.com>
Suggested-by: Jakub Kicinski <kuba@kernel.org>
Link: https://lore.kernel.org/r/20230725074148.2936402-1-wei.fang@nxp.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
2e3c5df2ee
commit
15cec633fc
@ -1372,7 +1372,7 @@ fec_enet_hwtstamp(struct fec_enet_private *fep, unsigned ts,
|
||||
}
|
||||
|
||||
static void
|
||||
fec_enet_tx_queue(struct net_device *ndev, u16 queue_id)
|
||||
fec_enet_tx_queue(struct net_device *ndev, u16 queue_id, int budget)
|
||||
{
|
||||
struct fec_enet_private *fep;
|
||||
struct xdp_frame *xdpf;
|
||||
@ -1416,6 +1416,14 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id)
|
||||
if (!skb)
|
||||
goto tx_buf_done;
|
||||
} else {
|
||||
/* Tx processing cannot call any XDP (or page pool) APIs if
|
||||
* the "budget" is 0. Because NAPI is called with budget of
|
||||
* 0 (such as netpoll) indicates we may be in an IRQ context,
|
||||
* however, we can't use the page pool from IRQ context.
|
||||
*/
|
||||
if (unlikely(!budget))
|
||||
break;
|
||||
|
||||
xdpf = txq->tx_buf[index].xdp;
|
||||
if (bdp->cbd_bufaddr)
|
||||
dma_unmap_single(&fep->pdev->dev,
|
||||
@ -1508,14 +1516,14 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id)
|
||||
writel(0, txq->bd.reg_desc_active);
|
||||
}
|
||||
|
||||
static void fec_enet_tx(struct net_device *ndev)
|
||||
static void fec_enet_tx(struct net_device *ndev, int budget)
|
||||
{
|
||||
struct fec_enet_private *fep = netdev_priv(ndev);
|
||||
int i;
|
||||
|
||||
/* Make sure that AVB queues are processed first. */
|
||||
for (i = fep->num_tx_queues - 1; i >= 0; i--)
|
||||
fec_enet_tx_queue(ndev, i);
|
||||
fec_enet_tx_queue(ndev, i, budget);
|
||||
}
|
||||
|
||||
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)
|
||||
|
||||
do {
|
||||
done += fec_enet_rx(ndev, budget - done);
|
||||
fec_enet_tx(ndev);
|
||||
fec_enet_tx(ndev, budget);
|
||||
} while ((done < budget) && fec_enet_collect_events(fep));
|
||||
|
||||
if (done < budget) {
|
||||
|
Loading…
Reference in New Issue
Block a user