From: Greg Banks <gnb@sgi.com>
To: "J. Bruce Fields" <bfields@fieldses.org>
Cc: Linux NFS ML <linux-nfs@vger.kernel.org>
Subject: [patch 28/29] knfsd: introduce NFSD_INC_STAT()
Date: Wed, 01 Apr 2009 07:28:28 +1100 [thread overview]
Message-ID: <20090331202948.630464000@sgi.com> (raw)
In-Reply-To: 20090331202800.739621000@sgi.com
Replace direct adds and increments of counters in the global nfsdstats
structure with the two macros NFSD_INC_STAT() and NFSD_ADD_STAT().
This doesn't change any functionality but prepares for a subsequent
patch which changes the definitions of those macros to make the
nfsdstats counters per-cpu for performance.
This is a preliminary step towards making the NFS server statistics
be gathered per-CPU.
Signed-off-by: Greg Banks <gnb-cP1dWloDopni96+mSzHFpQC/G2K4zDHf@public.gmane.org>
Reviewed-by: David Chinner <dgc@sgi.com>
Reviewed-by: Peter Leckie <pleckie-cP1dWloDopni96+mSzHFpQC/G2K4zDHf@public.gmane.org>
---
fs/nfsd/nfs4proc.c | 2 +-
fs/nfsd/nfsfh.c | 2 +-
fs/nfsd/vfs.c | 4 ++--
include/linux/nfsd/stats.h | 5 +++++
4 files changed, 9 insertions(+), 4 deletions(-)
Index: bfields/fs/nfsd/nfs4proc.c
===================================================================
--- bfields.orig/fs/nfsd/nfs4proc.c
+++ bfields/fs/nfsd/nfs4proc.c
@@ -872,7 +872,7 @@ nfsd4_proc_null(struct svc_rqst *rqstp,
static inline void nfsd4_increment_op_stats(u32 opnum)
{
if (opnum >= FIRST_NFS4_OP && opnum <= LAST_NFS4_OP)
- nfsdstats.nfs4_opcount[opnum]++;
+ NFSD_INC_STAT(nfs4_opcount[opnum]);
}
typedef __be32(*nfsd4op_func)(struct svc_rqst *, struct nfsd4_compound_state *,
Index: bfields/fs/nfsd/nfsfh.c
===================================================================
--- bfields.orig/fs/nfsd/nfsfh.c
+++ bfields/fs/nfsd/nfsfh.c
@@ -354,7 +354,7 @@ skip_pseudoflavor_check:
}
out:
if (error == nfserr_stale)
- nfsdstats.fh_stale++;
+ NFSD_INC_STAT(fh_stale);
return error;
}
Index: bfields/fs/nfsd/vfs.c
===================================================================
--- bfields.orig/fs/nfsd/vfs.c
+++ bfields/fs/nfsd/vfs.c
@@ -87,6 +87,7 @@ struct raparm_hbucket {
#define RAPARM_HASH_SIZE (1<<RAPARM_HASH_BITS)
#define RAPARM_HASH_MASK (RAPARM_HASH_SIZE-1)
static struct raparm_hbucket raparm_hash[RAPARM_HASH_SIZE];
+static int raparm_cache_size;
/*
* Called from nfsd_lookup and encode_dirent. Check if we have crossed
@@ -809,7 +810,7 @@ nfsd_get_raparms(dev_t dev, ino_t ino)
if (ra->p_count == 0)
frap = rap;
}
- depth = nfsdstats.ra_size*11/10;
+ depth = raparm_cache_size*11/10;
if (!frap) {
spin_unlock(&rab->pb_lock);
return NULL;
@@ -827,7 +828,7 @@ found:
rab->pb_head = ra;
}
ra->p_count++;
- nfsdstats.ra_depth[depth*10/nfsdstats.ra_size]++;
+ NFSD_INC_STAT(ra_depth[depth*10/raparm_cache_size]);
spin_unlock(&rab->pb_lock);
return ra;
}
@@ -938,7 +939,7 @@ nfsd_vfs_read(struct svc_rqst *rqstp, st
}
if (host_err >= 0) {
- nfsdstats.io_read += host_err;
+ NFSD_ADD_STAT(io_read, host_err);
*count = host_err;
err = 0;
fsnotify_access(file->f_path.dentry);
@@ -1010,7 +1011,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, s
host_err = vfs_writev(file, (struct iovec __user *)vec, vlen, &offset);
set_fs(oldfs);
if (host_err >= 0) {
- nfsdstats.io_write += host_err;
+ NFSD_ADD_STAT(io_write, host_err);
fsnotify_modify(file->f_path.dentry);
}
@@ -2111,6 +2112,7 @@ nfsd_racache_init(int cache_size)
int nperbucket;
struct raparms **raparm = NULL;
+ raparm_cache_size = cache_size;
if (raparm_hash[0].pb_head)
return 0;
@@ -2134,7 +2136,7 @@ nfsd_racache_init(int cache_size)
*raparm = NULL;
}
- nfsdstats.ra_size = cache_size;
+ NFSD_SET_STAT(ra_size, cache_size);
return 0;
out_nomem:
Index: bfields/include/linux/nfsd/stats.h
===================================================================
--- bfields.orig/include/linux/nfsd/stats.h
+++ bfields/include/linux/nfsd/stats.h
@@ -47,6 +47,13 @@ struct nfsd_stats {
unsigned int rcage; /* instant: age in milliseconds of last
* entry reused from the LRU list */
};
+#define NFSD_INC_STAT(field) \
+ (nfsdstats.field++)
+#define NFSD_ADD_STAT(field, v) \
+ (nfsdstats.field += (v))
+#define NFSD_SET_STAT(field, v) \
+ (nfsdstats.field = (v))
+
struct nfsd_op_stats {
#define NFSD_STATS_OP_FSINFO 0 /* includes NULLPROC,FSSTAT,FSINFO,
Index: bfields/fs/nfsd/nfscache.c
===================================================================
--- bfields.orig/fs/nfsd/nfscache.c
+++ bfields/fs/nfsd/nfscache.c
@@ -155,8 +155,8 @@ static int nfsd_cache_bucket_expand(stru
spin_lock(&b->lock);
b->size += increment;
- nfsdstats.rcentries += increment;
- nfsdstats.rcmem += increment * sizeof(struct svc_cacherep);
+ NFSD_ADD_STAT(rcentries, increment);
+ NFSD_ADD_STAT(rcmem, increment * sizeof(struct svc_cacherep));
list_splice(&lru, &b->lru);
spin_unlock(&b->lock);
@@ -188,10 +188,10 @@ int nfsd_reply_cache_init(void)
if (!b->hash)
goto out_nomem;
- nfsdstats.rcmem += HASHSIZE * sizeof(struct hlist_head);
+ NFSD_ADD_STAT(rcmem, HASHSIZE * sizeof(struct hlist_head));
}
- nfsdstats.rchashsize = HASHSIZE;
+ NFSD_SET_STAT(rchashsize, HASHSIZE);
cache_disabled = 0;
return 0;
out_nomem:
@@ -275,7 +275,7 @@ nfsd_cache_lookup(struct svc_rqst *rqstp
rqstp->rq_cacherep = NULL;
if (cache_disabled || type == RC_NOCACHE) {
- nfsdstats.rcnocache++;
+ NFSD_INC_STAT(rcnocache);
return RC_DOIT;
}
h = request_hash(xid, svc_addr_in(rqstp));
@@ -295,13 +295,13 @@ nfsd_cache_lookup(struct svc_rqst *rqstp
proc == rp->c_proc &&
proto == rp->c_prot && vers == rp->c_vers &&
time_after(rp->c_timestamp, age)) {
- nfsdstats.rchits++;
- nfsdstats.rcprobes += nprobes;
+ NFSD_INC_STAT(rchits);
+ NFSD_ADD_STAT(rcprobes, nprobes);
goto found_entry;
}
}
- nfsdstats.rcmisses++;
- nfsdstats.rcprobes += nprobes;
+ NFSD_INC_STAT(rcmisses);
+ NFSD_ADD_STAT(rcprobes, nprobes);
/* This loop shouldn't take more than a few iterations normally */
{
@@ -332,14 +332,14 @@ nfsd_cache_lookup(struct svc_rqst *rqstp
if (rp->c_state != RC_UNUSED) {
/* reusing an existing cache entry */
age = jiffies - rp->c_timestamp;
- nfsdstats.rcage = age;
+ NFSD_SET_STAT(rcage, age);
if (age < CACHE_THRESH_AGE &&
b->size < CACHE_BUCKET_MAX_SIZE &&
nfsd_cache_expand_ratelimit(b)) {
expand = CACHE_BUCKET_INCREMENT;
if (b->size + expand > CACHE_BUCKET_MAX_SIZE)
expand = CACHE_BUCKET_MAX_SIZE - b->size;
- nfsdstats.rcexpands++;
+ NFSD_INC_STAT(rcexpands);
}
}
@@ -360,7 +360,7 @@ nfsd_cache_lookup(struct svc_rqst *rqstp
if (rp->c_type == RC_REPLBUFF) {
kfree(rp->c_replvec.iov_base);
rp->c_replvec.iov_base = NULL;
- nfsdstats.rcmem -= rp->c_replvec.iov_len;
+ NFSD_ADD_STAT(rcmem, -rp->c_replvec.iov_len);
}
rp->c_type = RC_NOCACHE;
out:
@@ -473,7 +473,7 @@ nfsd_cache_update(struct svc_rqst *rqstp
rp->c_state = RC_DONE;
rp->c_timestamp = jiffies;
if (moremem)
- nfsdstats.rcmem += moremem;
+ NFSD_ADD_STAT(rcmem, moremem);
spin_unlock(&b->lock);
return;
}
Index: bfields/fs/nfsd/nfssvc.c
===================================================================
--- bfields.orig/fs/nfsd/nfssvc.c
+++ bfields/fs/nfsd/nfssvc.c
@@ -425,7 +425,7 @@ nfsd(void *vrqstp)
allow_signal(SIGINT);
allow_signal(SIGQUIT);
- nfsdstats.th_cnt++;
+ NFSD_INC_STAT(th_cnt);
mutex_unlock(&nfsd_mutex);
/*
@@ -476,7 +476,7 @@ nfsd(void *vrqstp)
flush_signals(current);
mutex_lock(&nfsd_mutex);
- nfsdstats.th_cnt --;
+ NFSD_ADD_STAT(th_cnt, -1);
out:
/* Release the thread */
--
Greg
next prev parent reply other threads:[~2009-03-31 21:02 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-03-31 20:28 [patch 00/29] SGI enhancedNFS patches Greg Banks
2009-03-31 20:28 ` [patch 01/29] knfsd: Add infrastructure for measuring RPC service times Greg Banks
2009-04-25 2:13 ` J. Bruce Fields
2009-04-25 2:14 ` J. Bruce Fields
2009-04-25 2:52 ` Greg Banks
2009-03-31 20:28 ` [patch 02/29] knfsd: Add stats table infrastructure Greg Banks
2009-04-25 3:56 ` J. Bruce Fields
2009-04-26 4:12 ` Greg Banks
2009-03-31 20:28 ` [patch 03/29] knfsd: add userspace controls for stats tables Greg Banks
2009-04-25 21:57 ` J. Bruce Fields
2009-04-25 22:03 ` J. Bruce Fields
2009-04-27 16:06 ` Chuck Lever
2009-04-27 23:22 ` J. Bruce Fields
2009-04-28 15:37 ` Chuck Lever
2009-04-28 15:57 ` J. Bruce Fields
2009-04-28 16:03 ` Chuck Lever
2009-04-28 16:26 ` J. Bruce Fields
2009-04-29 1:45 ` Greg Banks
[not found] ` <ac442c870904271827w6041a67ew82fe36a843beeac3@mail.gmail.com>
[not found] ` <ac442c870904271827w6041a67ew82fe36a843beeac3-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2009-04-28 1:31 ` Greg Banks
2009-04-26 4:14 ` Greg Banks
2009-03-31 20:28 ` [patch 04/29] knfsd: Add stats updating API Greg Banks
2009-03-31 20:28 ` [patch 05/29] knfsd: Infrastructure for providing stats to userspace Greg Banks
2009-04-01 0:28 ` J. Bruce Fields
2009-04-01 3:43 ` Greg Banks
2009-03-31 20:28 ` [patch 06/29] knfsd: Gather per-export stats Greg Banks
2009-03-31 20:28 ` [patch 07/29] knfsd: Prefetch the per-export stats entry Greg Banks
2009-03-31 20:28 ` [patch 08/29] knfsd: Gather per-client stats Greg Banks
2009-03-31 20:28 ` [patch 09/29] knfsd: Cache per-client stats entry on TCP transports Greg Banks
2009-03-31 20:28 ` [patch 10/29] knfsd: Update per-client & per-export stats from NFSv3 Greg Banks
2009-03-31 20:28 ` [patch 11/29] knfsd: Update per-client & per-export stats from NFSv2 Greg Banks
2009-03-31 20:28 ` [patch 12/29] knfsd: Update per-client & per-export stats from NFSv4 Greg Banks
2009-03-31 20:28 ` [patch 13/29] knfsd: reply cache cleanups Greg Banks
2009-05-12 19:54 ` J. Bruce Fields
2009-03-31 20:28 ` [patch 14/29] knfsd: better hashing in the reply cache Greg Banks
2009-05-08 22:01 ` J. Bruce Fields
2009-03-31 20:28 ` [patch 15/29] knfsd: fix reply cache memory corruption Greg Banks
2009-05-12 19:55 ` J. Bruce Fields
2009-03-31 20:28 ` [patch 16/29] knfsd: use client IPv4 address in reply cache hash Greg Banks
2009-05-11 21:48 ` J. Bruce Fields
2009-03-31 20:28 ` [patch 17/29] knfsd: make the reply cache SMP-friendly Greg Banks
2009-03-31 20:28 ` [patch 18/29] knfsd: dynamically expand the reply cache Greg Banks
2009-05-26 18:57 ` J. Bruce Fields
2009-05-26 19:04 ` J. Bruce Fields
2009-05-26 21:24 ` Rob Gardner
2009-05-26 21:52 ` J. Bruce Fields
2009-05-27 0:28 ` Greg Banks
2009-03-31 20:28 ` [patch 19/29] knfsd: faster probing in " Greg Banks
2009-03-31 20:28 ` [patch 20/29] knfsd: add extended reply cache stats Greg Banks
2009-03-31 20:28 ` [patch 21/29] knfsd: remove unreported filehandle stats counters Greg Banks
2009-05-12 20:00 ` J. Bruce Fields
2009-03-31 20:28 ` [patch 22/29] knfsd: make svc_authenticate() scale Greg Banks
2009-05-12 21:24 ` J. Bruce Fields
2009-03-31 20:28 ` [patch 23/29] knfsd: introduce SVC_INC_STAT Greg Banks
2009-03-31 20:28 ` [patch 24/29] knfsd: remove the program field from struct svc_stat Greg Banks
2009-03-31 20:28 ` [patch 25/29] knfsd: allocate svc_serv.sv_stats dynamically Greg Banks
2009-03-31 20:28 ` [patch 26/29] knfsd: make svc_serv.sv_stats per-CPU Greg Banks
2009-03-31 20:28 ` [patch 27/29] knfsd: move hot procedure count field out of svc_procedure Greg Banks
2009-03-31 20:28 ` Greg Banks [this message]
2009-03-31 20:28 ` [patch 29/29] knfsd: make nfsdstats per-CPU Greg Banks
2009-04-01 0:23 ` [patch 00/29] SGI enhancedNFS patches J. Bruce Fields
2009-04-01 3:32 ` Greg Banks
[not found] ` <ac442c870903312032t34630c6dvdbb644cb510f8079-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2009-04-01 6:34 ` Jeff Garzik
2009-04-01 6:41 ` Greg Banks
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090331202948.630464000@sgi.com \
--to=gnb@sgi.com \
--cc=bfields@fieldses.org \
--cc=linux-nfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.