Message ID | 20211214102607.7677-1-magnus.karlsson@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | bd0687c18e635b63233dc87f38058cd728802ab4 |
Delegated to: | BPF |
Headers | show |
Series | [bpf] xsk: do not sleep in poll() when need_wakeup set | expand |
On Tue, Dec 14, 2021 at 11:26:07AM +0100, Magnus Karlsson wrote: > From: Magnus Karlsson <magnus.karlsson@intel.com> > > 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@intel.com> > Signed-off-by: Magnus Karlsson <magnus.karlsson@intel.com> Acked-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com> > --- > 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 >
Hello: This patch was applied to bpf/bpf.git (master) by Daniel Borkmann <daniel@iogearbox.net>: On Tue, 14 Dec 2021 11:26:07 +0100 you wrote: > From: Magnus Karlsson <magnus.karlsson@intel.com> > > 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. > > [...] Here is the summary with links: - [bpf] xsk: do not sleep in poll() when need_wakeup set https://git.kernel.org/bpf/bpf/c/bd0687c18e63 You are awesome, thank you!
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))