Commit e2b20950 authored by Shankar Anand's avatar Shankar Anand Committed by Linus Torvalds

[PATCH] knfsd: nfsd4: add per-operation server stats

Add an nfs4 operations count array to nfsd_stats structure.  The count is
incremented in nfsd4_proc_compound() where all the operations are handled
by the nfsv4 server.  This count of individual nfsv4 operations is also
entered into /proc filesystem.

Signed-off-by: Shankar Anand<shanand@novell.com>
Signed-off-by: default avatarNeil Brown <neilb@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent cd6b3956
...@@ -721,6 +721,12 @@ nfsd4_proc_null(struct svc_rqst *rqstp, void *argp, void *resp) ...@@ -721,6 +721,12 @@ nfsd4_proc_null(struct svc_rqst *rqstp, void *argp, void *resp)
return nfs_ok; return nfs_ok;
} }
static inline void nfsd4_increment_op_stats(u32 opnum)
{
if (opnum >= FIRST_NFS4_OP && opnum <= LAST_NFS4_OP)
nfsdstats.nfs4_opcount[opnum]++;
}
/* /*
* COMPOUND call. * COMPOUND call.
...@@ -930,6 +936,8 @@ nfsd4_proc_compound(struct svc_rqst *rqstp, ...@@ -930,6 +936,8 @@ nfsd4_proc_compound(struct svc_rqst *rqstp,
/* XXX Ugh, we need to get rid of this kind of special case: */ /* XXX Ugh, we need to get rid of this kind of special case: */
if (op->opnum == OP_READ && op->u.read.rd_filp) if (op->opnum == OP_READ && op->u.read.rd_filp)
fput(op->u.read.rd_filp); fput(op->u.read.rd_filp);
nfsd4_increment_op_stats(op->opnum);
} }
out: out:
......
...@@ -72,6 +72,16 @@ static int nfsd_proc_show(struct seq_file *seq, void *v) ...@@ -72,6 +72,16 @@ static int nfsd_proc_show(struct seq_file *seq, void *v)
/* show my rpc info */ /* show my rpc info */
svc_seq_show(seq, &nfsd_svcstats); svc_seq_show(seq, &nfsd_svcstats);
#ifdef CONFIG_NFSD_V4
/* Show count for individual nfsv4 operations */
/* Writing operation numbers 0 1 2 also for maintaining uniformity */
seq_printf(seq,"proc4ops %u", LAST_NFS4_OP + 1);
for (i = 0; i <= LAST_NFS4_OP; i++)
seq_printf(seq, " %u", nfsdstats.nfs4_opcount[i]);
seq_putc(seq, '\n');
#endif
return 0; return 0;
} }
......
...@@ -157,6 +157,12 @@ enum nfs_opnum4 { ...@@ -157,6 +157,12 @@ enum nfs_opnum4 {
OP_ILLEGAL = 10044, OP_ILLEGAL = 10044,
}; };
/*Defining first and last NFS4 operations implemented.
Needs to be updated if more operations are defined in future.*/
#define FIRST_NFS4_OP OP_ACCESS
#define LAST_NFS4_OP OP_RELEASE_LOCKOWNER
enum nfsstat4 { enum nfsstat4 {
NFS4_OK = 0, NFS4_OK = 0,
NFS4ERR_PERM = 1, NFS4ERR_PERM = 1,
......
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
#ifndef LINUX_NFSD_STATS_H #ifndef LINUX_NFSD_STATS_H
#define LINUX_NFSD_STATS_H #define LINUX_NFSD_STATS_H
#include <linux/nfs4.h>
struct nfsd_stats { struct nfsd_stats {
unsigned int rchits; /* repcache hits */ unsigned int rchits; /* repcache hits */
unsigned int rcmisses; /* repcache hits */ unsigned int rcmisses; /* repcache hits */
...@@ -27,6 +29,10 @@ struct nfsd_stats { ...@@ -27,6 +29,10 @@ struct nfsd_stats {
unsigned int ra_size; /* size of ra cache */ unsigned int ra_size; /* size of ra cache */
unsigned int ra_depth[11]; /* number of times ra entry was found that deep unsigned int ra_depth[11]; /* number of times ra entry was found that deep
* in the cache (10percentiles). [10] = not found */ * in the cache (10percentiles). [10] = not found */
#ifdef CONFIG_NFSD_V4
unsigned int nfs4_opcount[LAST_NFS4_OP + 1]; /* count of individual nfsv4 operations */
#endif
}; };
/* thread usage wraps very million seconds (approx one fortnight) */ /* thread usage wraps very million seconds (approx one fortnight) */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment