SUNRPC: Set TCP_CORK until the transmit queue is empty
[sfrench/cifs-2.6.git] / net / sunrpc / xprtsock.c
index e35760f238a400cac8734088299d2656f78bd8a6..a64f5ed1edb4cbe1aaac27f112998f6047365556 100644 (file)
@@ -1018,6 +1018,7 @@ static int xs_tcp_send_request(struct rpc_rqst *req)
         * to cope with writespace callbacks arriving _after_ we have
         * called sendmsg(). */
        req->rq_xtime = ktime_get();
+       tcp_sock_set_cork(transport->inet, true);
        while (1) {
                status = xprt_sock_sendmsg(transport->sock, &msg, xdr,
                                           transport->xmit.offset, rm, &sent);
@@ -1032,6 +1033,8 @@ static int xs_tcp_send_request(struct rpc_rqst *req)
                if (likely(req->rq_bytes_sent >= msglen)) {
                        req->rq_xmit_bytes_sent += transport->xmit.offset;
                        transport->xmit.offset = 0;
+                       if (atomic_long_read(&xprt->xmit_queuelen) == 1)
+                               tcp_sock_set_cork(transport->inet, false);
                        return 0;
                }
 
@@ -2163,6 +2166,7 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
                }
 
                xs_tcp_set_socket_timeouts(xprt, sock);
+               tcp_sock_set_nodelay(sk);
 
                write_lock_bh(&sk->sk_callback_lock);
 
@@ -2177,7 +2181,6 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
 
                /* socket options */
                sock_reset_flag(sk, SOCK_LINGER);
-               tcp_sk(sk)->nonagle |= TCP_NAGLE_OFF;
 
                xprt_clear_connected(xprt);