Skip to content

Commit aab155e

Browse files
committed
SUNRPC: Set TCP_CORK until the transmit queue is empty
jira LE-3571 Rebuild_History Non-Buildable kernel-4.18.0-553.60.1.el8_10 commit-author Trond Myklebust <trond.myklebust@hammerspace.com> commit d737e5d When we have multiple RPC requests queued up, it makes sense to set the TCP_CORK option while the transmit queue is non-empty. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> (cherry picked from commit d737e5d) Signed-off-by: Jonathan Maple <jmaple@ciq.com>
1 parent 0a970c6 commit aab155e

File tree

3 files changed

+7
-1
lines changed

3 files changed

+7
-1
lines changed

include/linux/sunrpc/xprt.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,7 @@ struct rpc_xprt {
253253
struct rpc_task * snd_task; /* Task blocked in send */
254254

255255
struct list_head xmit_queue; /* Send queue */
256+
atomic_long_t xmit_queuelen;
256257

257258
struct svc_xprt *bc_xprt; /* NFSv4.1 backchannel */
258259
#if defined(CONFIG_SUNRPC_BACKCHANNEL)

net/sunrpc/xprt.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,6 +1357,7 @@ xprt_request_enqueue_transmit(struct rpc_task *task)
13571357
list_add_tail(&req->rq_xmit, &xprt->xmit_queue);
13581358
INIT_LIST_HEAD(&req->rq_xmit2);
13591359
out:
1360+
atomic_long_inc(&xprt->xmit_queuelen);
13601361
set_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate);
13611362
spin_unlock(&xprt->queue_lock);
13621363
}
@@ -1386,6 +1387,7 @@ xprt_request_dequeue_transmit_locked(struct rpc_task *task)
13861387
}
13871388
} else
13881389
list_del(&req->rq_xmit2);
1390+
atomic_long_dec(&req->rq_xprt->xmit_queuelen);
13891391
}
13901392

13911393
/**

net/sunrpc/xprtsock.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1029,6 +1029,7 @@ static int xs_tcp_send_request(struct rpc_rqst *req)
10291029
* to cope with writespace callbacks arriving _after_ we have
10301030
* called sendmsg(). */
10311031
req->rq_xtime = ktime_get();
1032+
tcp_sock_set_cork(transport->inet, true);
10321033
while (1) {
10331034
status = xprt_sock_sendmsg(transport->sock, &msg, xdr,
10341035
transport->xmit.offset, rm, &sent);
@@ -1043,6 +1044,8 @@ static int xs_tcp_send_request(struct rpc_rqst *req)
10431044
if (likely(req->rq_bytes_sent >= msglen)) {
10441045
req->rq_xmit_bytes_sent += transport->xmit.offset;
10451046
transport->xmit.offset = 0;
1047+
if (atomic_long_read(&xprt->xmit_queuelen) == 1)
1048+
tcp_sock_set_cork(transport->inet, false);
10461049
return 0;
10471050
}
10481051

@@ -2235,6 +2238,7 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
22352238
(char *)&addr_pref, sizeof(addr_pref));
22362239

22372240
xs_tcp_set_socket_timeouts(xprt, sock);
2241+
tcp_sock_set_nodelay(sk);
22382242

22392243
lock_sock(sk);
22402244

@@ -2250,7 +2254,6 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
22502254

22512255
/* socket options */
22522256
sock_reset_flag(sk, SOCK_LINGER);
2253-
tcp_sk(sk)->nonagle |= TCP_NAGLE_OFF;
22542257

22552258
xprt_clear_connected(xprt);
22562259

0 commit comments

Comments
 (0)