summaryrefslogtreecommitdiff
path: root/include/linux/sunrpc
diff options
context:
space:
mode:
authorTrond Myklebust <trond.myklebust@fys.uio.no>2002-07-16 01:53:29 -0700
committerTrond Myklebust <trond.myklebust@fys.uio.no>2002-07-16 01:53:29 -0700
commit77d7903022dbd92040f4afdfb5e05d9005a88a7f (patch)
treeba6f7a5b70f03d2c67dec1d2fca833b634000437 /include/linux/sunrpc
parentad4d2648caa581162d6c6e2a3805a0095448ae15 (diff)
[PATCH] RPC over UDP congestion control updates [1/8]
Implement the basic round trip timing algorithm in order to adapt the timeout values for the most common NFS operations to the server's rate of response. Algorithm is described in Van Jacobson's paper 1998 paper on http://www-nrg.ee.lbl.gov/nrg-papers.html, and is the same as is used for most TCP stacks. Following the *BSD code, we implement separate rtt timers for GETATTR, LOOKUP, READ/READDIR/READLINK, and WRITE. In addition to this, there is one extra timer for the COMMIT operation. All the remaining RPC calls use the current system in which a fixed timeout value gets set by the 'timeo' mount option. In case of a timeout, the current exponential backoff algoritm is implemented. Subsequent patches will improve this...
Diffstat (limited to 'include/linux/sunrpc')
-rw-r--r--include/linux/sunrpc/clnt.h5
-rw-r--r--include/linux/sunrpc/timer.h23
-rw-r--r--include/linux/sunrpc/xprt.h5
3 files changed, 30 insertions, 3 deletions
diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h
index be4c52c62c1c..d278df00ecb9 100644
--- a/include/linux/sunrpc/clnt.h
+++ b/include/linux/sunrpc/clnt.h
@@ -15,6 +15,7 @@
#include <linux/sunrpc/auth.h>
#include <linux/sunrpc/stats.h>
#include <linux/sunrpc/xdr.h>
+#include <linux/sunrpc/timer.h>
#include <asm/signal.h>
/*
@@ -52,6 +53,8 @@ struct rpc_clnt {
unsigned int cl_flags; /* misc client flags */
unsigned long cl_hardmax; /* max hard timeout */
+ struct rpc_rtt cl_rtt; /* RTO estimator data */
+
struct rpc_portmap cl_pmap; /* port mapping */
struct rpc_wait_queue cl_bindwait; /* waiting on getport() */
@@ -91,6 +94,7 @@ struct rpc_procinfo {
kxdrproc_t p_decode; /* XDR decode function */
unsigned int p_bufsiz; /* req. buffer size */
unsigned int p_count; /* call count */
+ unsigned int p_timer; /* Which RTT timer to use */
};
#define rpcproc_bufsiz(clnt, proc) ((clnt)->cl_procinfo[proc].p_bufsiz)
@@ -98,6 +102,7 @@ struct rpc_procinfo {
#define rpcproc_decode(clnt, proc) ((clnt)->cl_procinfo[proc].p_decode)
#define rpcproc_name(clnt, proc) ((clnt)->cl_procinfo[proc].p_procname)
#define rpcproc_count(clnt, proc) ((clnt)->cl_procinfo[proc].p_count)
+#define rpcproc_timer(clnt, proc) ((clnt)->cl_procinfo[proc].p_timer)
#define RPC_CONGESTED(clnt) (RPCXPRT_CONGESTED((clnt)->cl_xprt))
#define RPC_PEERADDR(clnt) (&(clnt)->cl_xprt->addr)
diff --git a/include/linux/sunrpc/timer.h b/include/linux/sunrpc/timer.h
new file mode 100644
index 000000000000..5f59407fed49
--- /dev/null
+++ b/include/linux/sunrpc/timer.h
@@ -0,0 +1,23 @@
+/*
+ * linux/include/linux/sunrpc/timer.h
+ *
+ * Declarations for the RPC transport timer.
+ *
+ * Copyright (C) 2002 Trond Myklebust <trond.myklebust@fys.uio.no>
+ */
+
+#ifndef _LINUX_SUNRPC_TIMER_H
+#define _LINUX_SUNRPC_TIMER_H
+
+struct rpc_rtt {
+ long timeo; /* default timeout value */
+ long srtt[5]; /* smoothed round trip time << 3 */
+ long sdrtt[5]; /* soothed medium deviation of RTT */
+};
+
+
+extern void rpc_init_rtt(struct rpc_rtt *rt, long timeo);
+extern void rpc_update_rtt(struct rpc_rtt *rt, int timer, long m);
+extern long rpc_calc_rto(struct rpc_rtt *rt, int timer);
+
+#endif /* _LINUX_SUNRPC_TIMER_H */
diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h
index 31a27bf00e41..2759e979b351 100644
--- a/include/linux/sunrpc/xprt.h
+++ b/include/linux/sunrpc/xprt.h
@@ -98,9 +98,8 @@ struct rpc_rqst {
u32 rq_bytes_sent; /* Bytes we have sent */
-#ifdef RPC_PROFILE
- unsigned long rq_xtime; /* when transmitted */
-#endif
+ long rq_xtime; /* when transmitted */
+ int rq_nresend;
};
#define rq_svec rq_snd_buf.head
#define rq_slen rq_snd_buf.len