So we can get a feel for how effective the hashing function is. As Chuck Lever pointed out to me, it's generally acceptable to do "expensive" stuff when reading the stats since that's a relatively rare activity. Cc: Chuck Lever <chuck.lever@xxxxxxxxxx> Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx> --- fs/nfsd/nfscache.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/fs/nfsd/nfscache.c b/fs/nfsd/nfscache.c index a5ac9ab..172e211 100644 --- a/fs/nfsd/nfscache.c +++ b/fs/nfsd/nfscache.c @@ -551,6 +551,25 @@ nfsd_cache_append(struct svc_rqst *rqstp, struct kvec *data) return 1; } +/* Get stats on the hashtable itself */ +static unsigned int +nfsd_repcache_max_chain_len(void) +{ + int i; + struct hlist_node *pos; + unsigned int max = 0; + + for (i = 0; i < HASHSIZE; ++i) { + unsigned int cur = 0; + + hlist_for_each(pos, &cache_hash[i]) + ++cur; + max = max(cur, max); + } + + return max; +} + /* * Note that fields may be added, removed or reordered in the future. Programs * scraping this file for info should test the labels to ensure they're @@ -566,6 +585,7 @@ static int nfsd_reply_cache_stats_show(struct seq_file *m, void *v) seq_printf(m, "cache misses: %u\n", nfsdstats.rcmisses); seq_printf(m, "not cached: %u\n", nfsdstats.rcnocache); seq_printf(m, "checksum misses: %u\n", csum_misses); + seq_printf(m, "max chain len: %u\n", nfsd_repcache_max_chain_len()); spin_unlock(&cache_lock); return 0; } -- 1.7.11.7 -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html