On Tue, Dec 14, 2021 at 11:26:07AM +0100, Magnus Karlsson wrote: > From: Magnus Karlsson <magnus.karlsson@xxxxxxxxx> > > Do not sleep in poll() when the need_wakeup flag is set. When this > flag is set, the application needs to explicitly wake up the driver > with a syscall (poll, recvmsg, sendmsg, etc.) to guarantee that Rx > and/or Tx processing will be processed promptly. But the current code > in poll(), sleeps first then wakes up the driver. This means that no > driver processing will occur (baring any interrupts) until the timeout > has expired. > > Fix this by checking the need_wakeup flag first and if set, wake the > driver and return to the application. Only if need_wakeup is not set > should the process sleep if there is a timeout set in the poll() call. > > Fixes: 77cd0d7b3f25 ("xsk: add support for need_wakeup flag in AF_XDP rings") > Reported-by: Keith Wiles <keith.wiles@xxxxxxxxx> > Signed-off-by: Magnus Karlsson <magnus.karlsson@xxxxxxxxx> Acked-by: Maciej Fijalkowski <maciej.fijalkowski@xxxxxxxxx> > --- > net/xdp/xsk.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c > index f16074eb53c7..7a466ea962c5 100644 > --- a/net/xdp/xsk.c > +++ b/net/xdp/xsk.c > @@ -677,8 +677,6 @@ static __poll_t xsk_poll(struct file *file, struct socket *sock, > struct xdp_sock *xs = xdp_sk(sk); > struct xsk_buff_pool *pool; > > - sock_poll_wait(file, sock, wait); > - > if (unlikely(!xsk_is_bound(xs))) > return mask; > > @@ -690,6 +688,8 @@ static __poll_t xsk_poll(struct file *file, struct socket *sock, > else > /* Poll needs to drive Tx also in copy mode */ > __xsk_sendmsg(sk); > + } else { > + sock_poll_wait(file, sock, wait); > } > > if (xs->rx && !xskq_prod_is_empty(xs->rx)) > > base-commit: 0be2516f865f5a876837184a8385163ff64a5889 > -- > 2.29.0 >