Revert "nfsd: make all of the nfsd stats per-network namespace"
This reverts commit 8e153e6f02
.
This commit is contained in:
parent
e7983f03a7
commit
2a0e4e700f
9 changed files with 91 additions and 64 deletions
|
@ -80,6 +80,8 @@ enum {
|
|||
|
||||
int nfsd_drc_slab_create(void);
|
||||
void nfsd_drc_slab_free(void);
|
||||
int nfsd_net_reply_cache_init(struct nfsd_net *nn);
|
||||
void nfsd_net_reply_cache_destroy(struct nfsd_net *nn);
|
||||
int nfsd_reply_cache_init(struct nfsd_net *);
|
||||
void nfsd_reply_cache_shutdown(struct nfsd_net *);
|
||||
int nfsd_cache_lookup(struct svc_rqst *);
|
||||
|
|
|
@ -10,7 +10,6 @@
|
|||
|
||||
#include <net/net_namespace.h>
|
||||
#include <net/netns/generic.h>
|
||||
#include <linux/nfs4.h>
|
||||
#include <linux/percpu_counter.h>
|
||||
#include <linux/siphash.h>
|
||||
|
||||
|
@ -29,19 +28,7 @@ enum {
|
|||
NFSD_STATS_PAYLOAD_MISSES,
|
||||
/* amount of memory (in bytes) currently consumed by the DRC */
|
||||
NFSD_STATS_DRC_MEM_USAGE,
|
||||
NFSD_STATS_RC_HITS, /* repcache hits */
|
||||
NFSD_STATS_RC_MISSES, /* repcache misses */
|
||||
NFSD_STATS_RC_NOCACHE, /* uncached reqs */
|
||||
NFSD_STATS_FH_STALE, /* FH stale error */
|
||||
NFSD_STATS_IO_READ, /* bytes returned to read requests */
|
||||
NFSD_STATS_IO_WRITE, /* bytes passed in write requests */
|
||||
#ifdef CONFIG_NFSD_V4
|
||||
NFSD_STATS_FIRST_NFS4_OP, /* count of individual nfsv4 operations */
|
||||
NFSD_STATS_LAST_NFS4_OP = NFSD_STATS_FIRST_NFS4_OP + LAST_NFS4_OP,
|
||||
#define NFSD_STATS_NFS4_OP(op) (NFSD_STATS_FIRST_NFS4_OP + (op))
|
||||
NFSD_STATS_WDELEG_GETATTR, /* count of getattr conflict with wdeleg */
|
||||
#endif
|
||||
NFSD_STATS_COUNTERS_NUM
|
||||
NFSD_NET_COUNTERS_NUM
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -181,7 +168,7 @@ struct nfsd_net {
|
|||
atomic_t num_drc_entries;
|
||||
|
||||
/* Per-netns stats counters */
|
||||
struct percpu_counter counter[NFSD_STATS_COUNTERS_NUM];
|
||||
struct percpu_counter counter[NFSD_NET_COUNTERS_NUM];
|
||||
|
||||
/* longest hash chain seen */
|
||||
unsigned int longest_chain;
|
||||
|
|
|
@ -2431,10 +2431,10 @@ nfsd4_proc_null(struct svc_rqst *rqstp)
|
|||
return rpc_success;
|
||||
}
|
||||
|
||||
static inline void nfsd4_increment_op_stats(struct nfsd_net *nn, u32 opnum)
|
||||
static inline void nfsd4_increment_op_stats(u32 opnum)
|
||||
{
|
||||
if (opnum >= FIRST_NFS4_OP && opnum <= LAST_NFS4_OP)
|
||||
percpu_counter_inc(&nn->counter[NFSD_STATS_NFS4_OP(opnum)]);
|
||||
percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_NFS4_OP(opnum)]);
|
||||
}
|
||||
|
||||
static const struct nfsd4_operation nfsd4_ops[];
|
||||
|
@ -2709,7 +2709,7 @@ encode_op:
|
|||
status, nfsd4_op_name(op->opnum));
|
||||
|
||||
nfsd4_cstate_clear_replay(cstate);
|
||||
nfsd4_increment_op_stats(nn, op->opnum);
|
||||
nfsd4_increment_op_stats(op->opnum);
|
||||
}
|
||||
|
||||
fh_put(current_fh);
|
||||
|
|
|
@ -176,6 +176,27 @@ void nfsd_drc_slab_free(void)
|
|||
kmem_cache_destroy(drc_slab);
|
||||
}
|
||||
|
||||
/**
|
||||
* nfsd_net_reply_cache_init - per net namespace reply cache set-up
|
||||
* @nn: nfsd_net being initialized
|
||||
*
|
||||
* Returns zero on succes; otherwise a negative errno is returned.
|
||||
*/
|
||||
int nfsd_net_reply_cache_init(struct nfsd_net *nn)
|
||||
{
|
||||
return nfsd_percpu_counters_init(nn->counter, NFSD_NET_COUNTERS_NUM);
|
||||
}
|
||||
|
||||
/**
|
||||
* nfsd_net_reply_cache_destroy - per net namespace reply cache tear-down
|
||||
* @nn: nfsd_net being freed
|
||||
*
|
||||
*/
|
||||
void nfsd_net_reply_cache_destroy(struct nfsd_net *nn)
|
||||
{
|
||||
nfsd_percpu_counters_destroy(nn->counter, NFSD_NET_COUNTERS_NUM);
|
||||
}
|
||||
|
||||
int nfsd_reply_cache_init(struct nfsd_net *nn)
|
||||
{
|
||||
unsigned int hashsize;
|
||||
|
@ -457,7 +478,7 @@ out:
|
|||
*/
|
||||
int nfsd_cache_lookup(struct svc_rqst *rqstp)
|
||||
{
|
||||
struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
|
||||
struct nfsd_net *nn;
|
||||
struct svc_cacherep *rp, *found;
|
||||
__wsum csum;
|
||||
struct nfsd_drc_bucket *b;
|
||||
|
@ -468,7 +489,7 @@ int nfsd_cache_lookup(struct svc_rqst *rqstp)
|
|||
|
||||
rqstp->rq_cacherep = NULL;
|
||||
if (type == RC_NOCACHE) {
|
||||
nfsd_stats_rc_nocache_inc(nn);
|
||||
nfsd_stats_rc_nocache_inc();
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
@ -478,6 +499,7 @@ int nfsd_cache_lookup(struct svc_rqst *rqstp)
|
|||
* Since the common case is a cache miss followed by an insert,
|
||||
* preallocate an entry.
|
||||
*/
|
||||
nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
|
||||
rp = nfsd_cacherep_alloc(rqstp, csum, nn);
|
||||
if (!rp)
|
||||
goto out;
|
||||
|
@ -495,7 +517,7 @@ int nfsd_cache_lookup(struct svc_rqst *rqstp)
|
|||
freed = nfsd_cacherep_dispose(&dispose);
|
||||
trace_nfsd_drc_gc(nn, freed);
|
||||
|
||||
nfsd_stats_rc_misses_inc(nn);
|
||||
nfsd_stats_rc_misses_inc();
|
||||
atomic_inc(&nn->num_drc_entries);
|
||||
nfsd_stats_drc_mem_usage_add(nn, sizeof(*rp));
|
||||
goto out;
|
||||
|
@ -503,7 +525,7 @@ int nfsd_cache_lookup(struct svc_rqst *rqstp)
|
|||
found_entry:
|
||||
/* We found a matching entry which is either in progress or done. */
|
||||
nfsd_reply_cache_free_locked(NULL, rp, nn);
|
||||
nfsd_stats_rc_hits_inc(nn);
|
||||
nfsd_stats_rc_hits_inc();
|
||||
rtn = RC_DROPIT;
|
||||
rp = found;
|
||||
|
||||
|
@ -653,11 +675,11 @@ int nfsd_reply_cache_stats_show(struct seq_file *m, void *v)
|
|||
seq_printf(m, "mem usage: %lld\n",
|
||||
percpu_counter_sum_positive(&nn->counter[NFSD_STATS_DRC_MEM_USAGE]));
|
||||
seq_printf(m, "cache hits: %lld\n",
|
||||
percpu_counter_sum_positive(&nn->counter[NFSD_STATS_RC_HITS]));
|
||||
percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_RC_HITS]));
|
||||
seq_printf(m, "cache misses: %lld\n",
|
||||
percpu_counter_sum_positive(&nn->counter[NFSD_STATS_RC_MISSES]));
|
||||
percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_RC_MISSES]));
|
||||
seq_printf(m, "not cached: %lld\n",
|
||||
percpu_counter_sum_positive(&nn->counter[NFSD_STATS_RC_NOCACHE]));
|
||||
percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_RC_NOCACHE]));
|
||||
seq_printf(m, "payload misses: %lld\n",
|
||||
percpu_counter_sum_positive(&nn->counter[NFSD_STATS_PAYLOAD_MISSES]));
|
||||
seq_printf(m, "longest chain len: %u\n", nn->longest_chain);
|
||||
|
|
|
@ -1458,7 +1458,7 @@ static __net_init int nfsd_init_net(struct net *net)
|
|||
retval = nfsd_idmap_init(net);
|
||||
if (retval)
|
||||
goto out_idmap_error;
|
||||
retval = nfsd_stat_counters_init(nn);
|
||||
retval = nfsd_net_reply_cache_init(nn);
|
||||
if (retval)
|
||||
goto out_repcache_error;
|
||||
nn->nfsd_versions = NULL;
|
||||
|
@ -1483,7 +1483,7 @@ static __net_exit void nfsd_exit_net(struct net *net)
|
|||
struct nfsd_net *nn = net_generic(net, nfsd_net_id);
|
||||
|
||||
nfsd_proc_stat_shutdown(net);
|
||||
nfsd_stat_counters_destroy(nn);
|
||||
nfsd_net_reply_cache_destroy(nn);
|
||||
nfsd_idmap_shutdown(net);
|
||||
nfsd_export_shutdown(net);
|
||||
nfsd_netns_free_versions(nn);
|
||||
|
@ -1506,9 +1506,12 @@ static int __init init_nfsd(void)
|
|||
retval = nfsd4_init_pnfs();
|
||||
if (retval)
|
||||
goto out_free_slabs;
|
||||
retval = nfsd_drc_slab_create();
|
||||
retval = nfsd_stat_counters_init(); /* Statistics */
|
||||
if (retval)
|
||||
goto out_free_pnfs;
|
||||
retval = nfsd_drc_slab_create();
|
||||
if (retval)
|
||||
goto out_free_stat;
|
||||
nfsd_lockd_init(); /* lockd->nfsd callbacks */
|
||||
retval = create_proc_exports_entry();
|
||||
if (retval)
|
||||
|
@ -1538,6 +1541,8 @@ out_free_exports:
|
|||
out_free_lockd:
|
||||
nfsd_lockd_shutdown();
|
||||
nfsd_drc_slab_free();
|
||||
out_free_stat:
|
||||
nfsd_stat_counters_destroy();
|
||||
out_free_pnfs:
|
||||
nfsd4_exit_pnfs();
|
||||
out_free_slabs:
|
||||
|
@ -1554,6 +1559,7 @@ static void __exit exit_nfsd(void)
|
|||
nfsd_drc_slab_free();
|
||||
remove_proc_entry("fs/nfs/exports", NULL);
|
||||
remove_proc_entry("fs/nfs", NULL);
|
||||
nfsd_stat_counters_destroy();
|
||||
nfsd_lockd_shutdown();
|
||||
nfsd4_free_slabs();
|
||||
nfsd4_exit_pnfs();
|
||||
|
|
|
@ -349,7 +349,6 @@ out:
|
|||
__be32
|
||||
fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, umode_t type, int access)
|
||||
{
|
||||
struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
|
||||
struct svc_export *exp = NULL;
|
||||
struct dentry *dentry;
|
||||
__be32 error;
|
||||
|
@ -423,7 +422,7 @@ skip_pseudoflavor_check:
|
|||
}
|
||||
out:
|
||||
if (error == nfserr_stale)
|
||||
nfsd_stats_fh_stale_inc(nn, exp);
|
||||
nfsd_stats_fh_stale_inc(exp);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
|
|
@ -34,17 +34,15 @@ struct svc_stat nfsd_svcstats = {
|
|||
|
||||
static int nfsd_show(struct seq_file *seq, void *v)
|
||||
{
|
||||
struct net *net = PDE_DATA(file_inode(seq->file));
|
||||
struct nfsd_net *nn = net_generic(net, nfsd_net_id);
|
||||
int i;
|
||||
|
||||
seq_printf(seq, "rc %lld %lld %lld\nfh %lld 0 0 0 0\nio %lld %lld\n",
|
||||
percpu_counter_sum_positive(&nn->counter[NFSD_STATS_RC_HITS]),
|
||||
percpu_counter_sum_positive(&nn->counter[NFSD_STATS_RC_MISSES]),
|
||||
percpu_counter_sum_positive(&nn->counter[NFSD_STATS_RC_NOCACHE]),
|
||||
percpu_counter_sum_positive(&nn->counter[NFSD_STATS_FH_STALE]),
|
||||
percpu_counter_sum_positive(&nn->counter[NFSD_STATS_IO_READ]),
|
||||
percpu_counter_sum_positive(&nn->counter[NFSD_STATS_IO_WRITE]));
|
||||
percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_RC_HITS]),
|
||||
percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_RC_MISSES]),
|
||||
percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_RC_NOCACHE]),
|
||||
percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_FH_STALE]),
|
||||
percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_IO_READ]),
|
||||
percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_IO_WRITE]));
|
||||
|
||||
/* thread usage: */
|
||||
seq_printf(seq, "th %u 0", atomic_read(&nfsdstats.th_cnt));
|
||||
|
@ -65,7 +63,7 @@ static int nfsd_show(struct seq_file *seq, void *v)
|
|||
seq_printf(seq,"proc4ops %u", LAST_NFS4_OP + 1);
|
||||
for (i = 0; i <= LAST_NFS4_OP; i++) {
|
||||
seq_printf(seq, " %lld",
|
||||
percpu_counter_sum_positive(&nn->counter[NFSD_STATS_NFS4_OP(i)]));
|
||||
percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_NFS4_OP(i)]));
|
||||
}
|
||||
|
||||
seq_putc(seq, '\n');
|
||||
|
@ -108,14 +106,14 @@ void nfsd_percpu_counters_destroy(struct percpu_counter counters[], int num)
|
|||
percpu_counter_destroy(&counters[i]);
|
||||
}
|
||||
|
||||
int nfsd_stat_counters_init(struct nfsd_net *nn)
|
||||
int nfsd_stat_counters_init(void)
|
||||
{
|
||||
return nfsd_percpu_counters_init(nn->counter, NFSD_STATS_COUNTERS_NUM);
|
||||
return nfsd_percpu_counters_init(nfsdstats.counter, NFSD_STATS_COUNTERS_NUM);
|
||||
}
|
||||
|
||||
void nfsd_stat_counters_destroy(struct nfsd_net *nn)
|
||||
void nfsd_stat_counters_destroy(void)
|
||||
{
|
||||
nfsd_percpu_counters_destroy(nn->counter, NFSD_STATS_COUNTERS_NUM);
|
||||
nfsd_percpu_counters_destroy(nfsdstats.counter, NFSD_STATS_COUNTERS_NUM);
|
||||
}
|
||||
|
||||
void nfsd_proc_stat_init(struct net *net)
|
||||
|
|
|
@ -10,7 +10,25 @@
|
|||
#include <uapi/linux/nfsd/stats.h>
|
||||
#include <linux/percpu_counter.h>
|
||||
|
||||
|
||||
enum {
|
||||
NFSD_STATS_RC_HITS, /* repcache hits */
|
||||
NFSD_STATS_RC_MISSES, /* repcache misses */
|
||||
NFSD_STATS_RC_NOCACHE, /* uncached reqs */
|
||||
NFSD_STATS_FH_STALE, /* FH stale error */
|
||||
NFSD_STATS_IO_READ, /* bytes returned to read requests */
|
||||
NFSD_STATS_IO_WRITE, /* bytes passed in write requests */
|
||||
#ifdef CONFIG_NFSD_V4
|
||||
NFSD_STATS_FIRST_NFS4_OP, /* count of individual nfsv4 operations */
|
||||
NFSD_STATS_LAST_NFS4_OP = NFSD_STATS_FIRST_NFS4_OP + LAST_NFS4_OP,
|
||||
#define NFSD_STATS_NFS4_OP(op) (NFSD_STATS_FIRST_NFS4_OP + (op))
|
||||
#endif
|
||||
NFSD_STATS_COUNTERS_NUM
|
||||
};
|
||||
|
||||
struct nfsd_stats {
|
||||
struct percpu_counter counter[NFSD_STATS_COUNTERS_NUM];
|
||||
|
||||
atomic_t th_cnt; /* number of available threads */
|
||||
};
|
||||
|
||||
|
@ -21,46 +39,43 @@ extern struct svc_stat nfsd_svcstats;
|
|||
int nfsd_percpu_counters_init(struct percpu_counter *counters, int num);
|
||||
void nfsd_percpu_counters_reset(struct percpu_counter *counters, int num);
|
||||
void nfsd_percpu_counters_destroy(struct percpu_counter *counters, int num);
|
||||
int nfsd_stat_counters_init(struct nfsd_net *nn);
|
||||
void nfsd_stat_counters_destroy(struct nfsd_net *nn);
|
||||
int nfsd_stat_counters_init(void);
|
||||
void nfsd_stat_counters_destroy(void);
|
||||
void nfsd_proc_stat_init(struct net *net);
|
||||
void nfsd_proc_stat_shutdown(struct net *net);
|
||||
|
||||
static inline void nfsd_stats_rc_hits_inc(struct nfsd_net *nn)
|
||||
static inline void nfsd_stats_rc_hits_inc(void)
|
||||
{
|
||||
percpu_counter_inc(&nn->counter[NFSD_STATS_RC_HITS]);
|
||||
percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_RC_HITS]);
|
||||
}
|
||||
|
||||
static inline void nfsd_stats_rc_misses_inc(struct nfsd_net *nn)
|
||||
static inline void nfsd_stats_rc_misses_inc(void)
|
||||
{
|
||||
percpu_counter_inc(&nn->counter[NFSD_STATS_RC_MISSES]);
|
||||
percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_RC_MISSES]);
|
||||
}
|
||||
|
||||
static inline void nfsd_stats_rc_nocache_inc(struct nfsd_net *nn)
|
||||
static inline void nfsd_stats_rc_nocache_inc(void)
|
||||
{
|
||||
percpu_counter_inc(&nn->counter[NFSD_STATS_RC_NOCACHE]);
|
||||
percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_RC_NOCACHE]);
|
||||
}
|
||||
|
||||
static inline void nfsd_stats_fh_stale_inc(struct nfsd_net *nn,
|
||||
struct svc_export *exp)
|
||||
static inline void nfsd_stats_fh_stale_inc(struct svc_export *exp)
|
||||
{
|
||||
percpu_counter_inc(&nn->counter[NFSD_STATS_FH_STALE]);
|
||||
percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_FH_STALE]);
|
||||
if (exp && exp->ex_stats)
|
||||
percpu_counter_inc(&exp->ex_stats->counter[EXP_STATS_FH_STALE]);
|
||||
}
|
||||
|
||||
static inline void nfsd_stats_io_read_add(struct nfsd_net *nn,
|
||||
struct svc_export *exp, s64 amount)
|
||||
static inline void nfsd_stats_io_read_add(struct svc_export *exp, s64 amount)
|
||||
{
|
||||
percpu_counter_add(&nn->counter[NFSD_STATS_IO_READ], amount);
|
||||
percpu_counter_add(&nfsdstats.counter[NFSD_STATS_IO_READ], amount);
|
||||
if (exp && exp->ex_stats)
|
||||
percpu_counter_add(&exp->ex_stats->counter[EXP_STATS_IO_READ], amount);
|
||||
}
|
||||
|
||||
static inline void nfsd_stats_io_write_add(struct nfsd_net *nn,
|
||||
struct svc_export *exp, s64 amount)
|
||||
static inline void nfsd_stats_io_write_add(struct svc_export *exp, s64 amount)
|
||||
{
|
||||
percpu_counter_add(&nn->counter[NFSD_STATS_IO_WRITE], amount);
|
||||
percpu_counter_add(&nfsdstats.counter[NFSD_STATS_IO_WRITE], amount);
|
||||
if (exp && exp->ex_stats)
|
||||
percpu_counter_add(&exp->ex_stats->counter[EXP_STATS_IO_WRITE], amount);
|
||||
}
|
||||
|
|
|
@ -1005,9 +1005,7 @@ static __be32 nfsd_finish_read(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
|||
unsigned long *count, u32 *eof, ssize_t host_err)
|
||||
{
|
||||
if (host_err >= 0) {
|
||||
struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
|
||||
|
||||
nfsd_stats_io_read_add(nn, fhp->fh_export, host_err);
|
||||
nfsd_stats_io_read_add(fhp->fh_export, host_err);
|
||||
*eof = nfsd_eof_on_read(file, offset, host_err, *count);
|
||||
*count = host_err;
|
||||
fsnotify_access(file);
|
||||
|
@ -1150,7 +1148,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct nfsd_file *nf,
|
|||
goto out_nfserr;
|
||||
}
|
||||
*cnt = host_err;
|
||||
nfsd_stats_io_write_add(nn, exp, *cnt);
|
||||
nfsd_stats_io_write_add(exp, *cnt);
|
||||
fsnotify_modify(file);
|
||||
host_err = filemap_check_wb_err(file->f_mapping, since);
|
||||
if (host_err < 0)
|
||||
|
|
Loading…
Reference in a new issue