--- 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);