aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChuck Lever <cel@netapp.com>2006-03-20 13:44:17 -0500
committerTrond Myklebust <Trond.Myklebust@netapp.com>2006-03-20 13:44:17 -0500
commitef759a2e54ed434b2f72b52a14edecd6d4eadf74 (patch)
treeaa495ef4691387839146683dfae0f0084fbe6137
parent262ca07de4d7f1bff20361c1353bb14b3607afb2 (diff)
SUNRPC: introduce per-task RPC iostats
Account for various things that occur while an RPC task is executed. Separate timers for RPC round trip and RPC execution time show how long RPC requests wait in queue before being sent. Eventually these will be accumulated at xprt_release time in one place where they can be viewed from userland. Test plan: Compile kernel with CONFIG_NFS enabled. Signed-off-by: Chuck Lever <cel@netapp.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r--include/linux/sunrpc/sched.h6
-rw-r--r--net/sunrpc/clnt.c2
-rw-r--r--net/sunrpc/sched.c3
-rw-r--r--net/sunrpc/xprt.c2
-rw-r--r--net/sunrpc/xprtsock.c1
5 files changed, 14 insertions, 0 deletions
diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h
index 6c23f73a799a..45a64ae963ee 100644
--- a/include/linux/sunrpc/sched.h
+++ b/include/linux/sunrpc/sched.h
@@ -86,6 +86,12 @@ struct rpc_task {
86 struct work_struct tk_work; /* Async task work queue */ 86 struct work_struct tk_work; /* Async task work queue */
87 struct rpc_wait tk_wait; /* RPC wait */ 87 struct rpc_wait tk_wait; /* RPC wait */
88 } u; 88 } u;
89
90 unsigned short tk_timeouts; /* maj timeouts */
91 size_t tk_bytes_sent; /* total bytes sent */
92 unsigned long tk_start; /* RPC task init timestamp */
93 long tk_rtt; /* round-trip time (jiffies) */
94
89#ifdef RPC_DEBUG 95#ifdef RPC_DEBUG
90 unsigned short tk_pid; /* debugging aid */ 96 unsigned short tk_pid; /* debugging aid */
91#endif 97#endif
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
index cad7efe2cb22..84eb5b4565fc 100644
--- a/net/sunrpc/clnt.c
+++ b/net/sunrpc/clnt.c
@@ -996,6 +996,8 @@ call_timeout(struct rpc_task *task)
996 } 996 }
997 997
998 dprintk("RPC: %4d call_timeout (major)\n", task->tk_pid); 998 dprintk("RPC: %4d call_timeout (major)\n", task->tk_pid);
999 task->tk_timeouts++;
1000
999 if (RPC_IS_SOFT(task)) { 1001 if (RPC_IS_SOFT(task)) {
1000 printk(KERN_NOTICE "%s: server %s not responding, timed out\n", 1002 printk(KERN_NOTICE "%s: server %s not responding, timed out\n",
1001 clnt->cl_protname, clnt->cl_server); 1003 clnt->cl_protname, clnt->cl_server);
diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c
index aa0449dcd8e5..cd51b5468332 100644
--- a/net/sunrpc/sched.c
+++ b/net/sunrpc/sched.c
@@ -817,6 +817,9 @@ void rpc_init_task(struct rpc_task *task, struct rpc_clnt *clnt, int flags, cons
817 817
818 BUG_ON(task->tk_ops == NULL); 818 BUG_ON(task->tk_ops == NULL);
819 819
820 /* starting timestamp */
821 task->tk_start = jiffies;
822
820 dprintk("RPC: %4d new task procpid %d\n", task->tk_pid, 823 dprintk("RPC: %4d new task procpid %d\n", task->tk_pid,
821 current->pid); 824 current->pid);
822} 825}
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c
index 93a0a3ca0d5f..c6241976a6ee 100644
--- a/net/sunrpc/xprt.c
+++ b/net/sunrpc/xprt.c
@@ -648,6 +648,8 @@ void xprt_complete_rqst(struct rpc_task *task, int copied)
648 task->tk_pid, ntohl(req->rq_xid), copied); 648 task->tk_pid, ntohl(req->rq_xid), copied);
649 649
650 task->tk_xprt->stat.recvs++; 650 task->tk_xprt->stat.recvs++;
651 task->tk_rtt = (long)jiffies - req->rq_xtime;
652
651 list_del_init(&req->rq_list); 653 list_del_init(&req->rq_list);
652 req->rq_received = req->rq_private_buf.len = copied; 654 req->rq_received = req->rq_private_buf.len = copied;
653 rpc_wake_up_task(task); 655 rpc_wake_up_task(task);
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index 6766b7f1ecf9..4b4e7dfdff14 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -382,6 +382,7 @@ static int xs_tcp_send_request(struct rpc_task *task)
382 /* If we've sent the entire packet, immediately 382 /* If we've sent the entire packet, immediately
383 * reset the count of bytes sent. */ 383 * reset the count of bytes sent. */
384 req->rq_bytes_sent += status; 384 req->rq_bytes_sent += status;
385 task->tk_bytes_sent += status;
385 if (likely(req->rq_bytes_sent >= req->rq_slen)) { 386 if (likely(req->rq_bytes_sent >= req->rq_slen)) {
386 req->rq_bytes_sent = 0; 387 req->rq_bytes_sent = 0;
387 return 0; 388 return 0;