SUNRPC: discard sp_lock
authorNeilBrown <neilb@suse.de>
Mon, 11 Sep 2023 14:40:15 +0000 (10:40 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 16 Oct 2023 16:44:08 +0000 (12:44 -0400)
sp_lock is now only used to protect sp_all_threads.  This isn't needed
as sp_all_threads is only manipulated through svc_set_num_threads(),
which is already serialized.  Read-acccess only requires rcu_read_lock().
So no more locking is needed.

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

index 9d0fcd6148ae9b3eab6a9c294f1d94ab97c2a2e6..8ce1392c1a357af4ab1b314d934c4779f8c5ec22 100644 (file)
@@ -34,7 +34,6 @@
  */
 struct svc_pool {
        unsigned int            sp_id;          /* pool id; also node id on NUMA */
-       spinlock_t              sp_lock;        /* protects all fields */
        struct lwq              sp_xprts;       /* pending transports */
        atomic_t                sp_nrthreads;   /* # of threads in pool */
        struct list_head        sp_all_threads; /* all server threads */
index 0928d3f918b0bbcf1dfd41e16062203e45ed2116..efe7a58ccbdca175654dc7eca08899216b02d3a0 100644 (file)
@@ -511,7 +511,6 @@ __svc_create(struct svc_program *prog, unsigned int bufsize, int npools,
                lwq_init(&pool->sp_xprts);
                INIT_LIST_HEAD(&pool->sp_all_threads);
                init_llist_head(&pool->sp_idle_threads);
-               spin_lock_init(&pool->sp_lock);
 
                percpu_counter_init(&pool->sp_messages_arrived, 0, GFP_KERNEL);
                percpu_counter_init(&pool->sp_sockets_queued, 0, GFP_KERNEL);
@@ -682,9 +681,12 @@ svc_prepare_thread(struct svc_serv *serv, struct svc_pool *pool, int node)
        spin_unlock_bh(&serv->sv_lock);
 
        atomic_inc(&pool->sp_nrthreads);
-       spin_lock_bh(&pool->sp_lock);
+
+       /* Protected by whatever lock the service uses when calling
+        * svc_set_num_threads()
+        */
        list_add_rcu(&rqstp->rq_all, &pool->sp_all_threads);
-       spin_unlock_bh(&pool->sp_lock);
+
        return rqstp;
 }
 
@@ -922,9 +924,7 @@ svc_exit_thread(struct svc_rqst *rqstp)
        struct svc_serv *serv = rqstp->rq_server;
        struct svc_pool *pool = rqstp->rq_pool;
 
-       spin_lock_bh(&pool->sp_lock);
        list_del_rcu(&rqstp->rq_all);
-       spin_unlock_bh(&pool->sp_lock);
 
        atomic_dec(&pool->sp_nrthreads);