diff --git a/net/ipv4/udp_bpf.c b/net/ipv4/udp_bpf.c index 9f33b07b1481..5e6d82816103 100644 --- a/net/ipv4/udp_bpf.c +++ b/net/ipv4/udp_bpf.c @@ -74,7 +74,9 @@ static int udp_bpf_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, if (unlikely(!psock)) return sk_udp_recvmsg(sk, msg, len, flags); + lock_sock(sk); if (!psock_has_data(psock)) { + release_sock(sk); ret = sk_udp_recvmsg(sk, msg, len, flags); goto out; } @@ -86,16 +88,20 @@ static int udp_bpf_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int data; timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT); + release_sock(sk); data = udp_msg_wait_data(sk, psock, timeo); + lock_sock(sk); if (data) { if (psock_has_data(psock)) goto msg_bytes_ready; + release_sock(sk); ret = sk_udp_recvmsg(sk, msg, len, flags); goto out; } copied = -EAGAIN; } ret = copied; + release_sock(sk); out: sk_psock_put(sk, psock); return ret;