]> git.baikalelectronics.ru Git - kernel.git/commitdiff
nfsd: make nfsd_stats.th_cnt atomic_t
authorNeilBrown <neilb@suse.de>
Mon, 29 Nov 2021 04:51:25 +0000 (15:51 +1100)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 13 Dec 2021 18:42:51 +0000 (13:42 -0500)
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>
fs/nfsd/nfssvc.c
fs/nfsd/stats.c
fs/nfsd/stats.h

index 5f605e7e809152f478dec5a98e8a9a2aefc5892f..fc5899502a8377ed53beae9c8ca1958d31b33b25 100644 (file)
@@ -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()
index 1d3b881e73821c4882f0c7825e5ea3fef8c76da1..a8c5a02a84f044a3f856ef6673ab1f02baae2524 100644 (file)
@@ -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++)
index 51ecda852e23bc01db26a0686b99b5012ea7265a..9b43dc3d999139c765d41d935953ae6ac42d39d3 100644 (file)
@@ -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;