Re: [PATCH bpf] xsk: do not sleep in poll() when need_wakeup set

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
> 



[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux