diff options
author | Chuck Lever <cel@netapp.com> | 2006-03-20 13:44:22 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-03-20 13:44:22 -0500 |
commit | 11c556b3d8d481829ab5f9933a25d29b00913b5a (patch) | |
tree | d1127fa5d22aeb035ca9977abbc73a29d5436fbe /net/sunrpc/clnt.c | |
parent | ef759a2e54ed434b2f72b52a14edecd6d4eadf74 (diff) |
SUNRPC: provide a mechanism for collecting stats in the RPC client
Add a simple mechanism for collecting stats in the RPC client. Stats are
tabulated during xprt_release. Note that per_cpu shenanigans are not
required here because the RPC client already serializes on the transport
write lock.
Test plan:
Compile kernel with CONFIG_NFS enabled. Basic performance regression
testing with high-speed networking and high performance server.
Signed-off-by: Chuck Lever <cel@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'net/sunrpc/clnt.c')
-rw-r--r-- | net/sunrpc/clnt.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 84eb5b4565fc..0bb23e8e9d0c 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
@@ -28,12 +28,11 @@ | |||
28 | #include <linux/mm.h> | 28 | #include <linux/mm.h> |
29 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
30 | #include <linux/utsname.h> | 30 | #include <linux/utsname.h> |
31 | #include <linux/workqueue.h> | ||
31 | 32 | ||
32 | #include <linux/sunrpc/clnt.h> | 33 | #include <linux/sunrpc/clnt.h> |
33 | #include <linux/workqueue.h> | ||
34 | #include <linux/sunrpc/rpc_pipe_fs.h> | 34 | #include <linux/sunrpc/rpc_pipe_fs.h> |
35 | 35 | #include <linux/sunrpc/metrics.h> | |
36 | #include <linux/nfs.h> | ||
37 | 36 | ||
38 | 37 | ||
39 | #define RPC_SLACK_SPACE (1024) /* total overkill */ | 38 | #define RPC_SLACK_SPACE (1024) /* total overkill */ |
@@ -147,6 +146,7 @@ rpc_new_client(struct rpc_xprt *xprt, char *servname, | |||
147 | clnt->cl_vers = version->number; | 146 | clnt->cl_vers = version->number; |
148 | clnt->cl_prot = xprt->prot; | 147 | clnt->cl_prot = xprt->prot; |
149 | clnt->cl_stats = program->stats; | 148 | clnt->cl_stats = program->stats; |
149 | clnt->cl_metrics = rpc_alloc_iostats(clnt); | ||
150 | rpc_init_wait_queue(&clnt->cl_pmap_default.pm_bindwait, "bindwait"); | 150 | rpc_init_wait_queue(&clnt->cl_pmap_default.pm_bindwait, "bindwait"); |
151 | 151 | ||
152 | if (!clnt->cl_port) | 152 | if (!clnt->cl_port) |
@@ -245,6 +245,7 @@ rpc_clone_client(struct rpc_clnt *clnt) | |||
245 | if (new->cl_auth) | 245 | if (new->cl_auth) |
246 | atomic_inc(&new->cl_auth->au_count); | 246 | atomic_inc(&new->cl_auth->au_count); |
247 | new->cl_pmap = &new->cl_pmap_default; | 247 | new->cl_pmap = &new->cl_pmap_default; |
248 | new->cl_metrics = rpc_alloc_iostats(clnt); | ||
248 | rpc_init_wait_queue(&new->cl_pmap_default.pm_bindwait, "bindwait"); | 249 | rpc_init_wait_queue(&new->cl_pmap_default.pm_bindwait, "bindwait"); |
249 | return new; | 250 | return new; |
250 | out_no_clnt: | 251 | out_no_clnt: |
@@ -315,6 +316,8 @@ rpc_destroy_client(struct rpc_clnt *clnt) | |||
315 | if (clnt->cl_server != clnt->cl_inline_name) | 316 | if (clnt->cl_server != clnt->cl_inline_name) |
316 | kfree(clnt->cl_server); | 317 | kfree(clnt->cl_server); |
317 | out_free: | 318 | out_free: |
319 | rpc_free_iostats(clnt->cl_metrics); | ||
320 | clnt->cl_metrics = NULL; | ||
318 | if (clnt->cl_dentry) | 321 | if (clnt->cl_dentry) |
319 | dput(clnt->cl_dentry); | 322 | dput(clnt->cl_dentry); |
320 | kfree(clnt); | 323 | kfree(clnt); |