Commit 9b6c8c9b authored by NeilBrown's avatar NeilBrown Committed by Chuck Lever

nfsd: make nfsd_stats.th_cnt atomic_t

This allows us to move the updates for th_cnt out of the mutex.
This is a step towards reducing mutex coverage in nfsd().
Signed-off-by: default avatarNeilBrown <neilb@suse.de>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent ec52361d
...@@ -57,7 +57,7 @@ static __be32 nfsd_init_request(struct svc_rqst *, ...@@ -57,7 +57,7 @@ static __be32 nfsd_init_request(struct svc_rqst *,
/* /*
* nfsd_mutex protects nn->nfsd_serv -- both the pointer itself and the members * nfsd_mutex protects nn->nfsd_serv -- both the pointer itself and the members
* of the svc_serv struct. In particular, ->sv_nrthreads but also to some * of the svc_serv struct. In particular, ->sv_nrthreads but also to some
* extent ->sv_temp_socks and ->sv_permsocks. It also protects nfsdstats.th_cnt * extent ->sv_temp_socks and ->sv_permsocks.
* *
* If (out side the lock) nn->nfsd_serv is non-NULL, then it must point to a * If (out side the lock) nn->nfsd_serv is non-NULL, then it must point to a
* properly initialised 'struct svc_serv' with ->sv_nrthreads > 0 (unless * properly initialised 'struct svc_serv' with ->sv_nrthreads > 0 (unless
...@@ -955,8 +955,8 @@ nfsd(void *vrqstp) ...@@ -955,8 +955,8 @@ nfsd(void *vrqstp)
allow_signal(SIGINT); allow_signal(SIGINT);
allow_signal(SIGQUIT); allow_signal(SIGQUIT);
nfsdstats.th_cnt++;
mutex_unlock(&nfsd_mutex); mutex_unlock(&nfsd_mutex);
atomic_inc(&nfsdstats.th_cnt);
set_freezable(); set_freezable();
...@@ -983,8 +983,8 @@ nfsd(void *vrqstp) ...@@ -983,8 +983,8 @@ nfsd(void *vrqstp)
/* Clear signals before calling svc_exit_thread() */ /* Clear signals before calling svc_exit_thread() */
flush_signals(current); flush_signals(current);
atomic_dec(&nfsdstats.th_cnt);
mutex_lock(&nfsd_mutex); mutex_lock(&nfsd_mutex);
nfsdstats.th_cnt --;
out: out:
/* Take an extra ref so that the svc_put in svc_exit_thread() /* Take an extra ref so that the svc_put in svc_exit_thread()
......
...@@ -45,7 +45,7 @@ static int nfsd_proc_show(struct seq_file *seq, void *v) ...@@ -45,7 +45,7 @@ static int nfsd_proc_show(struct seq_file *seq, void *v)
percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_IO_WRITE])); percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_IO_WRITE]));
/* thread usage: */ /* thread usage: */
seq_printf(seq, "th %u 0", nfsdstats.th_cnt); seq_printf(seq, "th %u 0", atomic_read(&nfsdstats.th_cnt));
/* deprecated thread usage histogram stats */ /* deprecated thread usage histogram stats */
for (i = 0; i < 10; i++) for (i = 0; i < 10; i++)
......
...@@ -29,11 +29,9 @@ enum { ...@@ -29,11 +29,9 @@ enum {
struct nfsd_stats { struct nfsd_stats {
struct percpu_counter counter[NFSD_STATS_COUNTERS_NUM]; struct percpu_counter counter[NFSD_STATS_COUNTERS_NUM];
/* Protected by nfsd_mutex */ atomic_t th_cnt; /* number of available threads */
unsigned int th_cnt; /* number of available threads */
}; };
extern struct nfsd_stats nfsdstats; extern struct nfsd_stats nfsdstats;
extern struct svc_stat nfsd_svcstats; extern struct svc_stat nfsd_svcstats;
......
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