Commit 4b619313 authored by Chuck Lever's avatar Chuck Lever Committed by Wentao Guan
Browse files

Revert "SUNRPC: Reduce thread wake-up rate when receiving large RPC messages"

stable inclusion
from stable-v6.6.76
commit 225b88642aef6558550ccde63e06cc5438bb2b8d
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IBW08Q

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=225b88642aef6558550ccde63e06cc5438bb2b8d



--------------------------------

commit 966a675da844f1a764bb44557c21561cc3d09840 upstream.

I noticed that a handful of NFSv3 fstests were taking an
unexpectedly long time to run. Troubleshooting showed that the
server's TCP window closed and never re-opened, which caused the
client to trigger an RPC retransmit timeout after 180 seconds.

The client's recovery action was to establish a fresh connection
and retransmit the timed-out requests. This worked, but it adds a
long delay.

I tracked the problem to the commit that attempted to reduce the
rate at which the network layer delivers TCP socket data_ready
callbacks. Under most circumstances this change worked as expected,
but for NFSv3, which has no session or other type of throttling, it
can overwhelm the receiver on occasion.

I'm sure I could tweak the lowat settings, but the small benefit
doesn't seem worth the bother. Just revert it.

Fixes: 2b877fc5 ("SUNRPC: Reduce thread wake-up rate when receiving large RPC messages")
Cc: Jakub Kicinski <kuba@kernel.org>
Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
(cherry picked from commit 225b88642aef6558550ccde63e06cc5438bb2b8d)
Signed-off-by: default avatarWentao Guan <guanwentao@uniontech.com>
parent 2d930b3e
Loading
Loading
Loading
Loading
+1 −11
Original line number Diff line number Diff line
@@ -1093,9 +1093,6 @@ static void svc_tcp_fragment_received(struct svc_sock *svsk)
	/* If we have more data, signal svc_xprt_enqueue() to try again */
	svsk->sk_tcplen = 0;
	svsk->sk_marker = xdr_zero;

	smp_wmb();
	tcp_set_rcvlowat(svsk->sk_sk, 1);
}

/**
@@ -1185,17 +1182,10 @@ static int svc_tcp_recvfrom(struct svc_rqst *rqstp)
		goto err_delete;
	if (len == want)
		svc_tcp_fragment_received(svsk);
	else {
		/* Avoid more ->sk_data_ready() calls until the rest
		 * of the message has arrived. This reduces service
		 * thread wake-ups on large incoming messages. */
		tcp_set_rcvlowat(svsk->sk_sk,
				 svc_sock_reclen(svsk) - svsk->sk_tcplen);

	else
		trace_svcsock_tcp_recv_short(&svsk->sk_xprt,
				svc_sock_reclen(svsk),
				svsk->sk_tcplen - sizeof(rpc_fraghdr));
	}
	goto err_noclose;
error:
	if (len != -EAGAIN)