On Fri, Jun 12, 2020 at 3:18 AM Jakub Sitnicki <jakub@xxxxxxxxxxxxxx> wrote: > > On Wed, 10 Jun 2020 12:19:43 +0200 > Sabrina Dubroca <sd@xxxxxxxxxxxxxxx> wrote: > > > If the peer is closed, we will never get more data, so > > tcp_bpf_wait_data will get stuck forever. In case we passed > > MSG_DONTWAIT to recv(), we get EAGAIN but we should actually get > > 0. > > > > From man 2 recv: > > > > RETURN VALUE > > > > When a stream socket peer has performed an orderly shutdown, the > > return value will be 0 (the traditional "end-of-file" return). > > > > This patch makes tcp_bpf_wait_data always return 1 when the peer > > socket has been shutdown. Either we have data available, and it would > > have returned 1 anyway, or there isn't, in which case we'll call > > tcp_recvmsg which does the right thing in this situation. > > > > Fixes: 604326b41a6f ("bpf, sockmap: convert to generic sk_msg interface") > > Signed-off-by: Sabrina Dubroca <sd@xxxxxxxxxxxxxxx> > > --- > > net/ipv4/tcp_bpf.c | 3 +++ > > 1 file changed, 3 insertions(+) > > > > diff --git a/net/ipv4/tcp_bpf.c b/net/ipv4/tcp_bpf.c > > index 2b915aafda42..7aa68f4aae6c 100644 > > --- a/net/ipv4/tcp_bpf.c > > +++ b/net/ipv4/tcp_bpf.c > > @@ -245,6 +245,9 @@ static int tcp_bpf_wait_data(struct sock *sk, struct sk_psock *psock, > > DEFINE_WAIT_FUNC(wait, woken_wake_function); > > int ret = 0; > > > > + if (sk->sk_shutdown & RCV_SHUTDOWN) > > + return 1; > > + > > if (!timeo) > > return ret; > > > > Acked-by: Jakub Sitnicki <jakub@xxxxxxxxxxxxxx> Applied. Thanks