xprtrdma: Clear xprt->reestablish_timeout on close
authorChuck Lever <chuck.lever@oracle.com>
Mon, 26 Aug 2019 17:12:51 +0000 (13:12 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Mon, 26 Aug 2019 19:34:59 +0000 (15:34 -0400)
Ensure that the re-establishment delay does not grow exponentially
on each good reconnect. This probably should have been part of
commit 675dd90ad093 ("xprtrdma: Modernize ops->connect").

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
net/sunrpc/xprtrdma/rpc_rdma.c
net/sunrpc/xprtrdma/transport.c
net/sunrpc/xprtrdma/verbs.c

index 19dd29a5c60dc404726cf50e961d0b74df34de1a..b86b5fd62d9f515d23f47e30cdbc31ad708408eb 100644 (file)
@@ -1261,8 +1261,6 @@ void rpcrdma_complete_rqst(struct rpcrdma_rep *rep)
        struct rpc_rqst *rqst = rep->rr_rqst;
        int status;
 
-       xprt->reestablish_timeout = 0;
-
        switch (rep->rr_proc) {
        case rdma_msg:
                status = rpcrdma_decode_msg(r_xprt, rep, rqst);
@@ -1321,6 +1319,12 @@ void rpcrdma_reply_handler(struct rpcrdma_rep *rep)
        u32 credits;
        __be32 *p;
 
+       /* Any data means we had a useful conversation, so
+        * then we don't need to delay the next reconnect.
+        */
+       if (xprt->reestablish_timeout)
+               xprt->reestablish_timeout = 0;
+
        /* Fixed transport header fields */
        xdr_init_decode(&rep->rr_stream, &rep->rr_hdrbuf,
                        rep->rr_hdrbuf.head[0].iov_base, NULL);
index 993b96ff6760dba7eab4b62c619baa81e4b3ac50..160558b4135e667aa8987f4955f751985156cb3c 100644 (file)
@@ -423,8 +423,6 @@ void xprt_rdma_close(struct rpc_xprt *xprt)
 
        if (ep->rep_connected == -ENODEV)
                return;
-       if (ep->rep_connected > 0)
-               xprt->reestablish_timeout = 0;
        rpcrdma_ep_disconnect(ep, ia);
 
        /* Prepare @xprt for the next connection by reinitializing
@@ -434,6 +432,7 @@ void xprt_rdma_close(struct rpc_xprt *xprt)
        xprt->cwnd = RPC_CWNDSHIFT;
 
 out:
+       xprt->reestablish_timeout = 0;
        ++xprt->connect_cookie;
        xprt_disconnect_done(xprt);
 }
index ac2abf4578b94fd7bd492613504ad412ec54168c..1dadc9ef504f9ee3f9cd47d061d6acc56a5b0cfb 100644 (file)
@@ -731,6 +731,8 @@ retry:
        if (rc)
                goto out;
 
+       if (xprt->reestablish_timeout < RPCRDMA_INIT_REEST_TO)
+               xprt->reestablish_timeout = RPCRDMA_INIT_REEST_TO;
        wait_event_interruptible(ep->rep_connect_wait, ep->rep_connected != 0);
        if (ep->rep_connected <= 0) {
                if (ep->rep_connected == -EAGAIN)