Message ID | 20250329061548.1357925-1-wangliang74@huawei.com (mailing list archive) |
---|---|
State | New |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net] xsk: correct tx_ring_empty_descs count statistics | expand |
On 03/29, Wang Liang wrote: > The tx_ring_empty_descs count may be incorrect, when set the XDP_TX_RING > option but do not reserve tx ring. Because xsk_poll() try to wakeup the > driver by calling xsk_generic_xmit() for non-zero-copy mode. So the > tx_ring_empty_descs count increases once the xsk_poll()is called: > > xsk_poll > xsk_generic_xmit > __xsk_generic_xmit > xskq_cons_peek_desc > xskq_cons_read_desc > q->queue_empty_descs++; > > To avoid this count error, add check for tx descs before send msg in poll. > > Fixes: df551058f7a3 ("xsk: Fix crash in poll when device does not support ndo_xsk_wakeup") > Signed-off-by: Wang Liang <wangliang74@huawei.com> Acked-by: Stanislav Fomichev <sdf@fomichev.me>
diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c index 89d2bef96469..fb01e6736677 100644 --- a/net/xdp/xsk.c +++ b/net/xdp/xsk.c @@ -989,7 +989,7 @@ static __poll_t xsk_poll(struct file *file, struct socket *sock, if (pool->cached_need_wakeup) { if (xs->zc) xsk_wakeup(xs, pool->cached_need_wakeup); - else if (xs->tx) + else if (xs->tx && xskq_has_descs(xs->tx)) /* Poll needs to drive Tx also in copy mode */ xsk_generic_xmit(sk); }
The tx_ring_empty_descs count may be incorrect, when set the XDP_TX_RING option but do not reserve tx ring. Because xsk_poll() try to wakeup the driver by calling xsk_generic_xmit() for non-zero-copy mode. So the tx_ring_empty_descs count increases once the xsk_poll()is called: xsk_poll xsk_generic_xmit __xsk_generic_xmit xskq_cons_peek_desc xskq_cons_read_desc q->queue_empty_descs++; To avoid this count error, add check for tx descs before send msg in poll. Fixes: df551058f7a3 ("xsk: Fix crash in poll when device does not support ndo_xsk_wakeup") Signed-off-by: Wang Liang <wangliang74@huawei.com> --- net/xdp/xsk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)