]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
SUNRPC: use sv_lock to protect updates to sv_nrthreads.
authorNeilBrown <neilb@suse.de>
Mon, 29 Nov 2021 04:51:25 +0000 (15:51 +1100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 10 Apr 2024 14:18:56 +0000 (16:18 +0200)
[ Upstream commit 2a36395fac3b72771f87c3ee4387e3a96d85a7cc ]

Using sv_lock means we don't need to hold the service mutex over these
updates.

In particular,  svc_exit_thread() no longer requires synchronisation, so
threads can exit asynchronously.

Note that we could use an atomic_t, but as there are many more read
sites than writes, that would add unnecessary noise to the code.
Some reads are already racy, and there is no need for them to not be.

Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfssvc.c
net/sunrpc/svc.c

index 32f2c46a383236dc92d163bc3ba3d0adae5cfdfc..16884a90e1ab0e327ac207a28ad4b116848cf7df 100644 (file)
@@ -55,9 +55,8 @@ static __be32                 nfsd_init_request(struct svc_rqst *,
                                                struct svc_process_info *);
 
 /*
- * 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.
+ * nfsd_mutex protects nn->nfsd_serv -- both the pointer itself and some members
+ * of the svc_serv struct such as ->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
index 6cde8c87e573398a305c88ae3f0a794b1b4bd963..c8a0649e5cdf18d6bd72d665ba465f9887103bb3 100644 (file)
@@ -523,7 +523,7 @@ EXPORT_SYMBOL_GPL(svc_shutdown_net);
 
 /*
  * Destroy an RPC service. Should be called with appropriate locking to
- * protect the sv_nrthreads, sv_permsocks and sv_tempsocks.
+ * protect sv_permsocks and sv_tempsocks.
  */
 void
 svc_destroy(struct kref *ref)
@@ -639,7 +639,10 @@ svc_prepare_thread(struct svc_serv *serv, struct svc_pool *pool, int node)
                return ERR_PTR(-ENOMEM);
 
        svc_get(serv);
-       serv->sv_nrthreads++;
+       spin_lock_bh(&serv->sv_lock);
+       serv->sv_nrthreads += 1;
+       spin_unlock_bh(&serv->sv_lock);
+
        spin_lock_bh(&pool->sp_lock);
        pool->sp_nrthreads++;
        list_add_rcu(&rqstp->rq_all, &pool->sp_all_threads);
@@ -884,7 +887,9 @@ svc_exit_thread(struct svc_rqst *rqstp)
                list_del_rcu(&rqstp->rq_all);
        spin_unlock_bh(&pool->sp_lock);
 
+       spin_lock_bh(&serv->sv_lock);
        serv->sv_nrthreads -= 1;
+       spin_unlock_bh(&serv->sv_lock);
        svc_sock_update_bufs(serv);
 
        svc_rqst_free(rqstp);