aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/clnt.c
diff options
context:
space:
mode:
authorChuck Lever <cel@netapp.com>2006-03-20 13:44:22 -0500
committerTrond Myklebust <Trond.Myklebust@netapp.com>2006-03-20 13:44:22 -0500
commit11c556b3d8d481829ab5f9933a25d29b00913b5a (patch)
treed1127fa5d22aeb035ca9977abbc73a29d5436fbe /net/sunrpc/clnt.c
parentef759a2e54ed434b2f72b52a14edecd6d4eadf74 (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.c9
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;
250out_no_clnt: 251out_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);
317out_free: 318out_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);