Loading net/sunrpc/xprtsock.c +25 −6 Original line number Diff line number Diff line Loading @@ -642,6 +642,7 @@ static int xs_tcp_send_request(struct rpc_task *task) struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); struct xdr_buf *xdr = &req->rq_snd_buf; bool zerocopy = true; bool vm_wait = false; int status; int sent; Loading Loading @@ -677,15 +678,33 @@ static int xs_tcp_send_request(struct rpc_task *task) return 0; } if (status < 0) WARN_ON_ONCE(sent == 0 && status == 0); if (status == -EAGAIN ) { /* * Return EAGAIN if we're sure we're hitting the * socket send buffer limits. */ if (test_bit(SOCK_NOSPACE, &transport->sock->flags)) break; /* * Did we hit a memory allocation failure? */ if (sent == 0) { status = -EAGAIN; status = -ENOBUFS; if (vm_wait) break; /* Retry, knowing now that we're below the * socket send buffer limit */ vm_wait = true; } continue; } if (status < 0) break; vm_wait = false; } if (status == -EAGAIN && sk_stream_is_writeable(transport->inet)) status = -ENOBUFS; switch (status) { case -ENOTSOCK: Loading Loading
net/sunrpc/xprtsock.c +25 −6 Original line number Diff line number Diff line Loading @@ -642,6 +642,7 @@ static int xs_tcp_send_request(struct rpc_task *task) struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); struct xdr_buf *xdr = &req->rq_snd_buf; bool zerocopy = true; bool vm_wait = false; int status; int sent; Loading Loading @@ -677,15 +678,33 @@ static int xs_tcp_send_request(struct rpc_task *task) return 0; } if (status < 0) WARN_ON_ONCE(sent == 0 && status == 0); if (status == -EAGAIN ) { /* * Return EAGAIN if we're sure we're hitting the * socket send buffer limits. */ if (test_bit(SOCK_NOSPACE, &transport->sock->flags)) break; /* * Did we hit a memory allocation failure? */ if (sent == 0) { status = -EAGAIN; status = -ENOBUFS; if (vm_wait) break; /* Retry, knowing now that we're below the * socket send buffer limit */ vm_wait = true; } continue; } if (status < 0) break; vm_wait = false; } if (status == -EAGAIN && sk_stream_is_writeable(transport->inet)) status = -ENOBUFS; switch (status) { case -ENOTSOCK: Loading