|
@@ -484,6 +484,27 @@ xprt_rdma_set_port(struct rpc_xprt *xprt, u16 port)
|
|
|
dprintk("RPC: %s: %u\n", __func__, port);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * xprt_rdma_timer - invoked when an RPC times out
|
|
|
+ * @xprt: controlling RPC transport
|
|
|
+ * @task: RPC task that timed out
|
|
|
+ *
|
|
|
+ * Invoked when the transport is still connected, but an RPC
|
|
|
+ * retransmit timeout occurs.
|
|
|
+ *
|
|
|
+ * Since RDMA connections don't have a keep-alive, forcibly
|
|
|
+ * disconnect and retry to connect. This drives full
|
|
|
+ * detection of the network path, and retransmissions of
|
|
|
+ * all pending RPCs.
|
|
|
+ */
|
|
|
+static void
|
|
|
+xprt_rdma_timer(struct rpc_xprt *xprt, struct rpc_task *task)
|
|
|
+{
|
|
|
+ dprintk("RPC: %5u %s: xprt = %p\n", task->tk_pid, __func__, xprt);
|
|
|
+
|
|
|
+ xprt_force_disconnect(xprt);
|
|
|
+}
|
|
|
+
|
|
|
static void
|
|
|
xprt_rdma_connect(struct rpc_xprt *xprt, struct rpc_task *task)
|
|
|
{
|
|
@@ -776,6 +797,7 @@ static struct rpc_xprt_ops xprt_rdma_procs = {
|
|
|
.alloc_slot = xprt_alloc_slot,
|
|
|
.release_request = xprt_release_rqst_cong, /* ditto */
|
|
|
.set_retrans_timeout = xprt_set_retrans_timeout_def, /* ditto */
|
|
|
+ .timer = xprt_rdma_timer,
|
|
|
.rpcbind = rpcb_getport_async, /* sunrpc/rpcb_clnt.c */
|
|
|
.set_port = xprt_rdma_set_port,
|
|
|
.connect = xprt_rdma_connect,
|