Skip to content

Commit a5a7efb

Browse files
committed
Merge: Revert "SUNRPC: Revert e0a912e"
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/6919 This reverts commit d1711eb, which reverted the original SUNRPC/TCP corking/uncorking after work to make the RPC layer use bio_vecs allowing single sock_sendmesg(). The inadvertent inclusion of this upstream commit causes a major regression where the RPC header and payload are flushed in separate TCP packets. JIRA: https://issues.redhat.com/browse/RHEL-92060 Upstream-status: RHEL Only Signed-off-by: Benjamin Coddington <[email protected]> Approved-by: Scott Mayhew <[email protected]> Approved-by: Olga Kornievskaia <[email protected]> Approved-by: CKI KWF Bot <[email protected]> Merged-by: Jan Stancek <[email protected]>
2 parents f3e506d + 9b528eb commit a5a7efb

File tree

2 files changed

+8
-0
lines changed

2 files changed

+8
-0
lines changed

include/linux/sunrpc/svcsock.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ struct svc_sock {
3535
/* Total length of the data (not including fragment headers)
3636
* received so far in the fragments making up this rpc: */
3737
u32 sk_datalen;
38+
/* Number of queued send requests */
39+
atomic_t sk_sendqlen;
3840

3941
struct completion sk_handshake_done;
4042

net/sunrpc/svcsock.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1296,18 +1296,23 @@ static int svc_tcp_sendto(struct svc_rqst *rqstp)
12961296
svc_tcp_release_ctxt(xprt, rqstp->rq_xprt_ctxt);
12971297
rqstp->rq_xprt_ctxt = NULL;
12981298

1299+
atomic_inc(&svsk->sk_sendqlen);
12991300
mutex_lock(&xprt->xpt_mutex);
13001301
if (svc_xprt_is_dead(xprt))
13011302
goto out_notconn;
1303+
tcp_sock_set_cork(svsk->sk_sk, true);
13021304
err = svc_tcp_sendmsg(svsk->sk_sock, xdr, marker, &sent);
13031305
xdr_free_bvec(xdr);
13041306
trace_svcsock_tcp_send(xprt, err < 0 ? (long)err : sent);
13051307
if (err < 0 || sent != (xdr->len + sizeof(marker)))
13061308
goto out_close;
1309+
if (atomic_dec_and_test(&svsk->sk_sendqlen))
1310+
tcp_sock_set_cork(svsk->sk_sk, false);
13071311
mutex_unlock(&xprt->xpt_mutex);
13081312
return sent;
13091313

13101314
out_notconn:
1315+
atomic_dec(&svsk->sk_sendqlen);
13111316
mutex_unlock(&xprt->xpt_mutex);
13121317
return -ENOTCONN;
13131318
out_close:
@@ -1316,6 +1321,7 @@ static int svc_tcp_sendto(struct svc_rqst *rqstp)
13161321
(err < 0) ? "got error" : "sent",
13171322
(err < 0) ? err : sent, xdr->len);
13181323
svc_xprt_deferred_close(xprt);
1324+
atomic_dec(&svsk->sk_sendqlen);
13191325
mutex_unlock(&xprt->xpt_mutex);
13201326
return -EAGAIN;
13211327
}

0 commit comments

Comments
 (0)