[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <YbiMIzFt0EXzc+fQ@boxer>
Date: Tue, 14 Dec 2021 13:20:51 +0100
From: Maciej Fijalkowski <maciej.fijalkowski@...el.com>
To: Magnus Karlsson <magnus.karlsson@...il.com>
Cc: magnus.karlsson@...el.com, bjorn@...nel.org, ast@...nel.org,
daniel@...earbox.net, netdev@...r.kernel.org,
jonathan.lemon@...il.com, bpf@...r.kernel.org,
Keith Wiles <keith.wiles@...el.com>
Subject: Re: [PATCH bpf] xsk: do not sleep in poll() when need_wakeup set
On Tue, Dec 14, 2021 at 11:26:07AM +0100, Magnus Karlsson wrote:
> From: Magnus Karlsson <magnus.karlsson@...el.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@...el.com>
> Signed-off-by: Magnus Karlsson <magnus.karlsson@...el.com>
Acked-by: Maciej Fijalkowski <maciej.fijalkowski@...el.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
>
Powered by blists - more mailing lists