* [PATCH net v2] net/mlx5e: do as little as possible in napi poll when budget is 0
@ 2023-05-17 1:59 Jakub Kicinski
2023-05-17 2:04 ` Jakub Kicinski
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Jakub Kicinski @ 2023-05-17 1:59 UTC (permalink / raw)
To: davem
Cc: netdev, edumazet, pabeni, Jakub Kicinski, Tariq Toukan, saeedm,
leon, brouer
NAPI gets called with budget of 0 from netpoll, which has interrupts
disabled. We should try to free some space on Tx rings and nothing
else.
Specifically do not try to handle XDP TX or try to refill Rx buffers -
we can't use the page pool from IRQ context. Don't check if IRQs moved,
either, that makes no sense in netpoll. Netpoll calls _all_ the rings
from whatever CPU it happens to be invoked on.
In general do as little as possible, the work quickly adds up when
there's tens of rings to poll.
The immediate stack trace I was seeing is:
__do_softirq+0xd1/0x2c0
__local_bh_enable_ip+0xc7/0x120
</IRQ>
<TASK>
page_pool_put_defragged_page+0x267/0x320
mlx5e_free_xdpsq_desc+0x99/0xd0
mlx5e_poll_xdpsq_cq+0x138/0x3b0
mlx5e_napi_poll+0xc3/0x8b0
netpoll_poll_dev+0xce/0x150
AFAIU page pool takes a BH lock, releases it and since BH is now
enabled tries to run softirqs.
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
Fixes: 60bbf7eeef10 ("mlx5: use page_pool for xdp_return_frame call")
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
I'm pointing Fixes at where page_pool was added, although that's
probably not 100% fair.
v2:
- don't call napi_complete_done()
v1: https://lore.kernel.org/all/20230512025740.1068965-1-kuba@kernel.org/
CC: saeedm@nvidia.com
CC: leon@kernel.org
CC: brouer@redhat.com
---
.../net/ethernet/mellanox/mlx5/core/en_txrx.c | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
index a50bfda18e96..fbb2d963fb7e 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
@@ -161,20 +161,22 @@ int mlx5e_napi_poll(struct napi_struct *napi, int budget)
}
}
+ /* budget=0 means we may be in IRQ context, do as little as possible */
+ if (unlikely(!budget))
+ goto out;
+
busy |= mlx5e_poll_xdpsq_cq(&c->xdpsq.cq);
if (c->xdp)
busy |= mlx5e_poll_xdpsq_cq(&c->rq_xdpsq.cq);
- if (likely(budget)) { /* budget=0 means: don't poll rx rings */
- if (xsk_open)
- work_done = mlx5e_poll_rx_cq(&xskrq->cq, budget);
+ if (xsk_open)
+ work_done = mlx5e_poll_rx_cq(&xskrq->cq, budget);
- if (likely(budget - work_done))
- work_done += mlx5e_poll_rx_cq(&rq->cq, budget - work_done);
+ if (likely(budget - work_done))
+ work_done += mlx5e_poll_rx_cq(&rq->cq, budget - work_done);
- busy |= work_done == budget;
- }
+ busy |= work_done == budget;
mlx5e_poll_ico_cq(&c->icosq.cq);
if (mlx5e_poll_ico_cq(&c->async_icosq.cq))
--
2.40.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH net v2] net/mlx5e: do as little as possible in napi poll when budget is 0
2023-05-17 1:59 [PATCH net v2] net/mlx5e: do as little as possible in napi poll when budget is 0 Jakub Kicinski
@ 2023-05-17 2:04 ` Jakub Kicinski
2023-05-18 16:35 ` Simon Horman
2023-05-19 7:50 ` patchwork-bot+netdevbpf
2 siblings, 0 replies; 4+ messages in thread
From: Jakub Kicinski @ 2023-05-17 2:04 UTC (permalink / raw)
To: davem; +Cc: netdev, edumazet, pabeni, Tariq Toukan, saeedm, leon, brouer
On Tue, 16 May 2023 18:59:35 -0700 Jakub Kicinski wrote:
> NAPI gets called with budget of 0 from netpoll, which has interrupts
> disabled. We should try to free some space on Tx rings and nothing
> else.
>
> Specifically do not try to handle XDP TX or try to refill Rx buffers -
> we can't use the page pool from IRQ context. Don't check if IRQs moved,
> either, that makes no sense in netpoll. Netpoll calls _all_ the rings
> from whatever CPU it happens to be invoked on.
>
> In general do as little as possible, the work quickly adds up when
> there's tens of rings to poll.
>
> The immediate stack trace I was seeing is:
>
> __do_softirq+0xd1/0x2c0
> __local_bh_enable_ip+0xc7/0x120
> </IRQ>
> <TASK>
> page_pool_put_defragged_page+0x267/0x320
> mlx5e_free_xdpsq_desc+0x99/0xd0
> mlx5e_poll_xdpsq_cq+0x138/0x3b0
> mlx5e_napi_poll+0xc3/0x8b0
> netpoll_poll_dev+0xce/0x150
>
> AFAIU page pool takes a BH lock, releases it and since BH is now
> enabled tries to run softirqs.
>
> Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
> Fixes: 60bbf7eeef10 ("mlx5: use page_pool for xdp_return_frame call")
> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
There's a condition which should be simplified later on:
if (budget && work_done == budget)
work_done--;
but I think we may be better off doing that as a follow up,
to keep this patch short and readable.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH net v2] net/mlx5e: do as little as possible in napi poll when budget is 0
2023-05-17 1:59 [PATCH net v2] net/mlx5e: do as little as possible in napi poll when budget is 0 Jakub Kicinski
2023-05-17 2:04 ` Jakub Kicinski
@ 2023-05-18 16:35 ` Simon Horman
2023-05-19 7:50 ` patchwork-bot+netdevbpf
2 siblings, 0 replies; 4+ messages in thread
From: Simon Horman @ 2023-05-18 16:35 UTC (permalink / raw)
To: Jakub Kicinski
Cc: davem, netdev, edumazet, pabeni, Tariq Toukan, saeedm, leon,
brouer
On Tue, May 16, 2023 at 06:59:35PM -0700, Jakub Kicinski wrote:
> NAPI gets called with budget of 0 from netpoll, which has interrupts
> disabled. We should try to free some space on Tx rings and nothing
> else.
>
> Specifically do not try to handle XDP TX or try to refill Rx buffers -
> we can't use the page pool from IRQ context. Don't check if IRQs moved,
> either, that makes no sense in netpoll. Netpoll calls _all_ the rings
> from whatever CPU it happens to be invoked on.
>
> In general do as little as possible, the work quickly adds up when
> there's tens of rings to poll.
>
> The immediate stack trace I was seeing is:
>
> __do_softirq+0xd1/0x2c0
> __local_bh_enable_ip+0xc7/0x120
> </IRQ>
> <TASK>
> page_pool_put_defragged_page+0x267/0x320
> mlx5e_free_xdpsq_desc+0x99/0xd0
> mlx5e_poll_xdpsq_cq+0x138/0x3b0
> mlx5e_napi_poll+0xc3/0x8b0
> netpoll_poll_dev+0xce/0x150
>
> AFAIU page pool takes a BH lock, releases it and since BH is now
> enabled tries to run softirqs.
>
> Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
> Fixes: 60bbf7eeef10 ("mlx5: use page_pool for xdp_return_frame call")
> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
> ---
> I'm pointing Fixes at where page_pool was added, although that's
> probably not 100% fair.
>
> v2:
> - don't call napi_complete_done()
> v1: https://lore.kernel.org/all/20230512025740.1068965-1-kuba@kernel.org/
Reviewed-by: Simon Horman <simon.horman@corigine.com>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH net v2] net/mlx5e: do as little as possible in napi poll when budget is 0
2023-05-17 1:59 [PATCH net v2] net/mlx5e: do as little as possible in napi poll when budget is 0 Jakub Kicinski
2023-05-17 2:04 ` Jakub Kicinski
2023-05-18 16:35 ` Simon Horman
@ 2023-05-19 7:50 ` patchwork-bot+netdevbpf
2 siblings, 0 replies; 4+ messages in thread
From: patchwork-bot+netdevbpf @ 2023-05-19 7:50 UTC (permalink / raw)
To: Jakub Kicinski
Cc: davem, netdev, edumazet, pabeni, tariqt, saeedm, leon, brouer
Hello:
This patch was applied to netdev/net.git (main)
by David S. Miller <davem@davemloft.net>:
On Tue, 16 May 2023 18:59:35 -0700 you wrote:
> NAPI gets called with budget of 0 from netpoll, which has interrupts
> disabled. We should try to free some space on Tx rings and nothing
> else.
>
> Specifically do not try to handle XDP TX or try to refill Rx buffers -
> we can't use the page pool from IRQ context. Don't check if IRQs moved,
> either, that makes no sense in netpoll. Netpoll calls _all_ the rings
> from whatever CPU it happens to be invoked on.
>
> [...]
Here is the summary with links:
- [net,v2] net/mlx5e: do as little as possible in napi poll when budget is 0
https://git.kernel.org/netdev/net/c/afbed3f74830
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2023-05-19 7:50 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-05-17 1:59 [PATCH net v2] net/mlx5e: do as little as possible in napi poll when budget is 0 Jakub Kicinski
2023-05-17 2:04 ` Jakub Kicinski
2023-05-18 16:35 ` Simon Horman
2023-05-19 7:50 ` patchwork-bot+netdevbpf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).