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: NeilBrown <neilb@suse.de> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
ec52361df9
commit
9b6c8c9beb
@ -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)
|
|||||||
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)
|
|||||||
/* 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)
|
|||||||
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 {
|
|||||||
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user