Subject: [PATCH] RPC: add rq_rtt field to rpc_rqst Description: Currently it is cumbersome to derive the RTT data from the address of an RPC request. This patch adds an rq_rtt field which is a copy of the RPC client's cl_rtt field. That makes it easier and cleaner to find the RTT data when needed, and reduces the number of loads and AGIs in several places. Test-plan: None. Created: Sun, 05 Dec 2004 23:29:44 -0500 Signed-off-by: Chuck Lever --- include/linux/sunrpc/xprt.h | 1 + net/sunrpc/xprt.c | 3 ++- net/sunrpc/xprtsock.c | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff -X /home/cel/src/linux/dont-diff -Naurp 63-rpc-rq_xprt/include/linux/sunrpc/xprt.h 64-rpc-rq_rtt/include/linux/sunrpc/xprt.h --- 63-rpc-rq_xprt/include/linux/sunrpc/xprt.h 2004-12-05 23:00:49.098253000 -0500 +++ 64-rpc-rq_rtt/include/linux/sunrpc/xprt.h 2004-12-05 23:01:00.286053000 -0500 @@ -88,6 +88,7 @@ struct rpc_rqst { rq_inited : 1; /* release this request */ __u32 rq_xid; /* request XID */ int rq_cong; /* has incremented xprt->cong */ + struct rpc_rtt * rq_rtt; /* round trip estimator data */ int rq_received; /* receive completed */ u32 rq_seqno; /* gss seq no. used on req. */ int rq_enc_pages_num; diff -X /home/cel/src/linux/dont-diff -Naurp 63-rpc-rq_xprt/net/sunrpc/xprt.c 64-rpc-rq_rtt/net/sunrpc/xprt.c --- 63-rpc-rq_xprt/net/sunrpc/xprt.c 2004-12-05 18:45:44.919629000 -0500 +++ 64-rpc-rq_rtt/net/sunrpc/xprt.c 2004-12-05 18:47:35.116504000 -0500 @@ -343,7 +343,7 @@ int xprt_adjust_timeout(struct rpc_rqst xprt_reset_majortimeo(req); /* Reset the RTT counters == "slow start" */ spin_lock_bh(&xprt->xprt_lock); - rpc_init_rtt(to_rpc_task(req)->tk_client->cl_rtt, to->to_initval); + rpc_init_rtt(req->rq_rtt, to->to_initval); spin_unlock_bh(&xprt->xprt_lock); pprintk("RPC: %lu timeout\n", jiffies); status = -ETIMEDOUT; @@ -656,6 +656,7 @@ static void inline xprt_request_init(str INIT_LIST_HEAD(&req->rq_list); req->rq_timeout = xprt->timeout.to_initval; + req->rq_rtt = task->tk_client->cl_rtt; req->rq_xprt = xprt; req->rq_xid_needed = 1; req->rq_inited = 1; diff -X /home/cel/src/linux/dont-diff -Naurp 63-rpc-rq_xprt/net/sunrpc/xprtsock.c 64-rpc-rq_rtt/net/sunrpc/xprtsock.c --- 63-rpc-rq_xprt/net/sunrpc/xprtsock.c 2004-12-05 21:00:04.477067000 -0500 +++ 64-rpc-rq_rtt/net/sunrpc/xprtsock.c 2004-12-05 21:00:13.071472000 -0500 @@ -503,8 +503,8 @@ static void xs_tcp_timeout(struct rpc_xp static fastcall void xs_udp_set_receive_timeout(struct rpc_task *task) { int timer = task->tk_msg.rpc_proc->p_timer; - struct rpc_rtt *rtt = task->tk_client->cl_rtt; struct rpc_rqst *req = &task->tk_rqst; + struct rpc_rtt *rtt = req->rq_rtt; struct rpc_xprt *xprt = task->tk_xprt; task->tk_timeout = rpc_calc_rto(rtt, timer); @@ -662,7 +662,7 @@ static void xs_udp_data_ready(struct soc timer = task->tk_msg.rpc_proc->p_timer; xprt_adjust_cwnd(rovr, copied); if (timer) { - struct rpc_rtt *rtt = task->tk_client->cl_rtt; + struct rpc_rtt *rtt = rovr->rq_rtt; if (rovr->rq_ntrans == 1) rpc_update_rtt(rtt, timer, (long)jiffies - rovr->rq_xtime);