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

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
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -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
 * 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
 * properly initialised 'struct svc_serv' with ->sv_nrthreads > 0 (unless
@@ -955,8 +955,8 @@ nfsd(void *vrqstp)
	allow_signal(SIGINT);
	allow_signal(SIGQUIT);

	nfsdstats.th_cnt++;
	mutex_unlock(&nfsd_mutex);
	atomic_inc(&nfsdstats.th_cnt);

	set_freezable();

@@ -983,8 +983,8 @@ nfsd(void *vrqstp)
	/* Clear signals before calling svc_exit_thread() */
	flush_signals(current);

	atomic_dec(&nfsdstats.th_cnt);
	mutex_lock(&nfsd_mutex);
	nfsdstats.th_cnt --;

out:
	/* Take an extra ref so that the svc_put in svc_exit_thread()
+1 −1
Original line number Diff line number Diff line
@@ -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]));

	/* 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 */
	for (i = 0; i < 10; i++)
+1 −3
Original line number Diff line number Diff line
@@ -29,11 +29,9 @@ enum {
struct nfsd_stats {
	struct percpu_counter	counter[NFSD_STATS_COUNTERS_NUM];

	/* Protected by nfsd_mutex */
	unsigned int	th_cnt;		/* number of available threads */
	atomic_t	th_cnt;		/* number of available threads */
};


extern struct nfsd_stats	nfsdstats;

extern struct svc_stat		nfsd_svcstats;