linux-nfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Chuck Lever <chuck.lever@oracle.com>
To: anna.schumaker@netapp.com
Cc: linux-rdma@vger.kernel.org, linux-nfs@vger.kernel.org
Subject: [PATCH v2 02/20] xprtrdma: Reset credit grant properly after a disconnect
Date: Mon, 01 Oct 2018 14:25:14 -0400	[thread overview]
Message-ID: <20181001182514.18578.63401.stgit@manet.1015granger.net> (raw)
In-Reply-To: <20181001182005.18578.57544.stgit@manet.1015granger.net>

On a fresh connection, an RPC/RDMA client is supposed to send only
one RPC Call until it gets a credit grant in the first RPC Reply
from the server [RFC 8166, Section 3.3.3].

There is a bug in the Linux client's credit accounting mechanism
introduced by commit e7ce710a8802 ("xprtrdma: Avoid deadlock when
credit window is reset"). On connect, it simply dumps all pending
RPC Calls onto the new connection.

Servers have been tolerant of this bad behavior. Currently no server
implementation ever changes its credit grant over reconnects, and
servers always repost enough Receives before connections are fully
established.

To correct this issue, ensure that the client resets both the credit
grant _and_ the congestion window when handling a reconnect.

Fixes: e7ce710a8802 ("xprtrdma: Avoid deadlock when credit ... ")
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Cc: stable@kernel.org
---
 net/sunrpc/xprtrdma/svc_rdma_backchannel.c |    1 +
 net/sunrpc/xprtrdma/transport.c            |    6 ++++++
 2 files changed, 7 insertions(+)

diff --git a/net/sunrpc/xprtrdma/svc_rdma_backchannel.c b/net/sunrpc/xprtrdma/svc_rdma_backchannel.c
index a681800..b982766 100644
--- a/net/sunrpc/xprtrdma/svc_rdma_backchannel.c
+++ b/net/sunrpc/xprtrdma/svc_rdma_backchannel.c
@@ -248,6 +248,7 @@ static int svc_rdma_bc_sendto(struct svcxprt_rdma *rdma,
 xprt_rdma_bc_close(struct rpc_xprt *xprt)
 {
 	dprintk("svcrdma: %s: xprt %p\n", __func__, xprt);
+	xprt->cwnd = RPC_CWNDSHIFT;
 }
 
 static void
diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c
index 143ce25..98cbc7b 100644
--- a/net/sunrpc/xprtrdma/transport.c
+++ b/net/sunrpc/xprtrdma/transport.c
@@ -468,6 +468,12 @@
 		xprt->reestablish_timeout = 0;
 	xprt_disconnect_done(xprt);
 	rpcrdma_ep_disconnect(ep, ia);
+
+	/* Prepare @xprt for the next connection by reinitializing
+	 * its credit grant to one (see RFC 8166, Section 3.3.3).
+	 */
+	r_xprt->rx_buf.rb_credits = 1;
+	xprt->cwnd = RPC_CWNDSHIFT;
 }
 
 /**

  parent reply	other threads:[~2018-10-02  1:04 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-01 18:25 [PATCH v2 00/20] NFS/RDMA client patches for v4.20 Chuck Lever
2018-10-01 18:25 ` [PATCH v2 01/20] xprtrdma: xprt_release_rqst_cong is called outside of transport_lock Chuck Lever
2018-10-01 18:25 ` Chuck Lever [this message]
2018-10-01 18:25 ` [PATCH v2 03/20] xprtrdma: Create more MRs at a time Chuck Lever
2018-10-01 18:25 ` [PATCH v2 04/20] xprtrdma: Explicitly resetting MRs is no longer necessary Chuck Lever
2018-10-01 18:25 ` [PATCH v2 05/20] xprtrdma: Name MR trace events consistently Chuck Lever
2018-10-01 18:25 ` [PATCH v2 06/20] sunrpc: Fix connect metrics Chuck Lever
2018-10-01 18:25 ` [PATCH v2 07/20] sunrpc: Report connect_time in seconds Chuck Lever
2018-10-01 18:25 ` [PATCH v2 08/20] xprtrdma: Rename rpcrdma_conn_upcall Chuck Lever
2018-10-01 18:25 ` [PATCH v2 09/20] xprtrdma: Conventional variable names in rpcrdma_conn_upcall Chuck Lever
2018-10-01 18:25 ` [PATCH v2 10/20] xprtrdma: Eliminate "connstate" variable from rpcrdma_conn_upcall() Chuck Lever
2018-10-01 18:26 ` [PATCH v2 11/20] xprtrdma: Re-organize the switch() in rpcrdma_conn_upcall Chuck Lever
2018-10-01 18:26 ` [PATCH v2 12/20] xprtrdma: Simplify RPC wake-ups on connect Chuck Lever
2018-10-01 18:26 ` [PATCH v2 13/20] xprtrdma: Rename rpcrdma_qp_async_error_upcall Chuck Lever
2018-10-01 18:26 ` [PATCH v2 14/20] xprtrdma: Remove memory address of "ep" from an error message Chuck Lever
2018-10-01 18:26 ` [PATCH v2 15/20] xprtrdma: Don't disable BH's in backchannel server Chuck Lever
2018-10-01 18:26 ` [PATCH v2 16/20] xprtrdma: Move rb_flags initialization Chuck Lever
2018-10-01 18:26 ` [PATCH v2 17/20] xprtrdma: Report when there were zero posted Receives Chuck Lever
2018-10-01 18:26 ` [PATCH v2 18/20] xprtrdma: Add documenting comments Chuck Lever
2018-10-01 18:26 ` [PATCH v2 19/20] xprtrdma: Clean up xprt_rdma_disconnect_inject Chuck Lever
2018-10-01 18:26 ` [PATCH v2 20/20] xprtrdma: Squelch a sparse warning Chuck Lever

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181001182514.18578.63401.stgit@manet.1015granger.net \
    --to=chuck.lever@oracle.com \
    --cc=anna.schumaker@netapp.com \
    --cc=linux-nfs@vger.kernel.org \
    --cc=linux-rdma@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).