The RPC/RDMA code always performed a reconnect-with-backoff, even when re-establishing a connection to a server after the RPC layer closed it due to being idle. --- net/sunrpc/xprtrdma/transport.c | 5 +++-- net/sunrpc/xprtrdma/verbs.c | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c index c7d2380..278a544 100644 --- a/net/sunrpc/xprtrdma/transport.c +++ b/net/sunrpc/xprtrdma/transport.c @@ -486,8 +486,9 @@ xprt_rdma_connect(struct rpc_task *task) struct rpcrdma_xprt *r_xprt = rpcx_to_rdmax(xprt); if (!xprt_test_and_set_connecting(xprt)) { - if (r_xprt->rx_ep.rep_connected != 0) { - /* Reconnect */ + if (r_xprt->rx_ep.rep_connected && + r_xprt->rx_ep.rep_connected != -EPIPE) { + /* Reconnect with backoff */ schedule_delayed_work(&r_xprt->rdma_connect, xprt->reestablish_timeout); } else { diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c index a63d0c0..9ef7e0d 100644 --- a/net/sunrpc/xprtrdma/verbs.c +++ b/net/sunrpc/xprtrdma/verbs.c @@ -317,7 +317,7 @@ rpcrdma_conn_upcall(struct rdma_cm_id *id, struct rdma_cm_event *event) connstate = -ECONNREFUSED; goto connected; case RDMA_CM_EVENT_DISCONNECTED: - connstate = -ECONNABORTED; + connstate = -EPIPE; goto connected; case RDMA_CM_EVENT_DEVICE_REMOVAL: connstate = -ENODEV; -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html