--- x/net/vmw_vsock/vsock_bpf.c +++ y/net/vmw_vsock/vsock_bpf.c @@ -77,37 +77,29 @@ static int vsock_bpf_recvmsg(struct sock size_t len, int flags, int *addr_len) { struct sk_psock *psock; - int copied; + int copied = -EAGAIN; psock = sk_psock_get(sk); if (unlikely(!psock)) - return __vsock_recvmsg(sk, msg, len, flags); + return -EAGAIN; lock_sock(sk); - if (vsock_has_data(sk, psock) && sk_psock_queue_empty(psock)) { - release_sock(sk); - sk_psock_put(sk, psock); - return __vsock_recvmsg(sk, msg, len, flags); - } + if (vsock_has_data(sk, psock) && sk_psock_queue_empty(psock)) + goto out; copied = sk_msg_recvmsg(sk, psock, msg, len, flags); while (copied == 0) { long timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT); - if (!vsock_msg_wait_data(sk, psock, timeo)) { - copied = -EAGAIN; + copied = -EAGAIN; + if (!vsock_msg_wait_data(sk, psock, timeo)) + break; + if (sk_psock_queue_empty(psock)) break; - } - - if (sk_psock_queue_empty(psock)) { - release_sock(sk); - sk_psock_put(sk, psock); - return __vsock_recvmsg(sk, msg, len, flags); - } - copied = sk_msg_recvmsg(sk, psock, msg, len, flags); } +out: release_sock(sk); sk_psock_put(sk, psock);