4880
/* Don't wait for non-blocking sockets. */
4886
NOTIFYCALLRET(vsk, err, recvPreBlock, sk, target, &recvData);
4892
timeout = schedule_timeout(timeout);
4895
if (signal_pending(current)) {
4896
err = sock_intr_errno(timeout);
4898
} else if (timeout == 0) {
4903
prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
4875
} else if (ready > 0) {
4878
VSOCK_STATS_STREAM_CONSUME_HIST(vsk);
4880
NOTIFYCALLRET(vsk, err, recvPreDequeue, sk, target, &recvData);
4885
if (flags & MSG_PEEK) {
4886
read = VMCIQPair_PeekV(vsk->qpair, msg->msg_iov, len - copied, 0);
4888
read = VMCIQPair_DequeueV(vsk->qpair, msg->msg_iov, len - copied, 0);
4896
ASSERT(read <= INT_MAX);
4899
NOTIFYCALLRET(vsk, err, recvPostDequeue, sk, target, read,
4900
!(flags & MSG_PEEK), &recvData);
4905
if (read >= target || flags & MSG_PEEK) {
4910
if (sk->sk_err != 0 || (sk->sk_shutdown & RCV_SHUTDOWN) ||
4911
(vsk->peerShutdown & SEND_SHUTDOWN)) {
4914
/* Don't wait for non-blocking sockets. */
4920
NOTIFYCALLRET(vsk, err, recvPreBlock, sk, target, &recvData);
4926
timeout = schedule_timeout(timeout);
4929
if (signal_pending(current)) {
4930
err = sock_intr_errno(timeout);
4932
} else if (timeout == 0) {
4937
prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
4906
4941
if (sk->sk_err) {
4907
4942
err = -sk->sk_err;
4909
4943
} else if (sk->sk_shutdown & RCV_SHUTDOWN) {
4912
} else if ((vsk->peerShutdown & SEND_SHUTDOWN) &&
4913
VSockVmciStreamHasData(vsk) < target) {
4918
VSOCK_STATS_STREAM_CONSUME_HIST(vsk);
4920
NOTIFYCALLRET(vsk, err, recvPreDequeue, sk, target, &recvData);
4925
if (flags & MSG_PEEK) {
4926
copied = VMCIQPair_PeekV(vsk->qpair, msg->msg_iov, len, 0);
4928
copied = VMCIQPair_DequeueV(vsk->qpair, msg->msg_iov, len, 0);
4936
ASSERT(copied >= target);
4939
* We only do these additional bookkeeping/notification steps if we actually
4940
* copied something out of the queue pair instead of just peeking ahead.
4942
if (!(flags & MSG_PEEK)) {
4945
* If the other side has shutdown for sending and there is nothing more to
4946
* read, then modify the socket state.
4949
* We only do these additional bookkeeping/notification steps if we
4950
* actually copied something out of the queue pair instead of just peeking
4948
if (vsk->peerShutdown & SEND_SHUTDOWN) {
4949
if (VSockVmciStreamHasData(vsk) <= 0) {
4950
sk->sk_state = SS_UNCONNECTED;
4951
sock_set_flag(sk, SOCK_DONE);
4952
sk->sk_state_change(sk);
4954
if (!(flags & MSG_PEEK)) {
4956
* If the other side has shutdown for sending and there is nothing more
4957
* to read, then modify the socket state.
4959
if (vsk->peerShutdown & SEND_SHUTDOWN) {
4960
if (VSockVmciStreamHasData(vsk) <= 0) {
4961
sk->sk_state = SS_UNCONNECTED;
4962
sock_set_flag(sk, SOCK_DONE);
4963
sk->sk_state_change(sk);
4957
NOTIFYCALLRET(vsk, err, recvPostDequeue, sk, target, copied,
4958
!(flags & MSG_PEEK), &recvData);
4963
ASSERT(copied <= INT_MAX);
4967
4971
finish_wait(sk_sleep(sk), &wait);