]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] RPC over UDP congestion control updates [2/8]
authorTrond Myklebust <trond.myklebust@fys.uio.no>
Tue, 16 Jul 2002 08:53:43 +0000 (01:53 -0700)
committerTrond Myklebust <trond.myklebust@fys.uio.no>
Tue, 16 Jul 2002 08:53:43 +0000 (01:53 -0700)
Implement a count of the number of timeouts that have occured since
we last recorded a successful reply from the server.

For the moment this information is merely used in order to improve the
estimate of whether or not the server is down. It will be used in
patch 3/8 in order to improve the timeout backoff algorithm.

include/linux/sunrpc/timer.h
net/sunrpc/clnt.c
net/sunrpc/timer.c
net/sunrpc/xprt.c

index 5f59407fed49555a7ca3df67006dd4a1ec9c3114..35b5a5c251702cdfaf36bd1ef2c4507475dc777e 100644 (file)
@@ -9,10 +9,13 @@
 #ifndef _LINUX_SUNRPC_TIMER_H
 #define _LINUX_SUNRPC_TIMER_H
 
+#include <asm/atomic.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 */
+       atomic_t  ntimeouts;    /* Global count of the number of timeouts */
 };
 
 
@@ -20,4 +23,19 @@ 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);
 
+static inline void rpc_inc_timeo(struct rpc_rtt *rt)
+{
+       atomic_inc(&rt->ntimeouts);
+}
+
+static inline void rpc_clear_timeo(struct rpc_rtt *rt)
+{
+       atomic_set(&rt->ntimeouts, 0);
+}
+
+static inline int rpc_ntimeo(struct rpc_rtt *rt)
+{
+       return atomic_read(&rt->ntimeouts);
+}
+
 #endif /* _LINUX_SUNRPC_TIMER_H */
index c6acb6aa4bf7a9c50cf442d779d2a66dcaf147ce..657deb7640ee5285d90843c986a1e860d72ff109 100644 (file)
@@ -671,7 +671,7 @@ call_timeout(struct rpc_task *task)
                rpc_exit(task, -EIO);
                return;
        }
-       if (clnt->cl_chatty && !(task->tk_flags & RPC_CALL_MAJORSEEN)) {
+       if (clnt->cl_chatty && !(task->tk_flags & RPC_CALL_MAJORSEEN) && rpc_ntimeo(&clnt->cl_rtt) > 7) {
                task->tk_flags |= RPC_CALL_MAJORSEEN;
                if (req)
                        printk(KERN_NOTICE "%s: server %s not responding, still trying\n",
index 00387735a34a5f09f93f7335c82b2c2dcedaaace..184017a23143f0378ef96eabbd4e5d19b8389f68 100644 (file)
@@ -22,6 +22,7 @@ rpc_init_rtt(struct rpc_rtt *rt, long timeo)
                rt->srtt[i] = t;
                rt->sdrtt[i] = RPC_RTO_INIT;
        }
+       atomic_set(&rt->ntimeouts, 0);
 }
 
 void
index 6f791e001589471502e5c798b1cdb37c349f0b3a..715143c6508952749d6e05e3938a6f22738b553a 100644 (file)
@@ -493,6 +493,8 @@ xprt_complete_rqst(struct rpc_xprt *xprt, struct rpc_rqst *req, int copied)
                        int timer = rpcproc_timer(clnt, task->tk_msg.rpc_proc);
                        if (timer)
                                rpc_update_rtt(&clnt->cl_rtt, timer, (long)jiffies - req->rq_xtime);
+               }
+               rpc_clear_timeo(&clnt->cl_rtt);
        }
 
 #ifdef RPC_PROFILE
@@ -942,6 +944,7 @@ xprt_timer(struct rpc_task *task)
        if (req->rq_received)
                goto out;
        req->rq_nresend++;
+       rpc_inc_timeo(&task->tk_client->cl_rtt);
        xprt_adjust_cwnd(xprt, -ETIMEDOUT);
 
        dprintk("RPC: %4d xprt_timer (%s request)\n",