Whamcloud - gitweb
LU-12678 socklnd: change ksnd_nthreads to atomic_t 21/39121/3
authorMr NeilBrown <neilb@suse.de>
Sun, 7 Jun 2020 23:24:36 +0000 (19:24 -0400)
committerOleg Drokin <green@whamcloud.com>
Fri, 10 Jul 2020 16:53:01 +0000 (16:53 +0000)
This variable is treated like an atomic_t, but a global spinlock is
used to protect updates - and also unnecessarily to protect reads.

Change to atomic_t and avoid using the spinlock.

Signed-off-by: Mr NeilBrown <neilb@suse.de>
Change-Id: Id94d280875a9e115dc077253c49e97a725dc91e1
Reviewed-on: https://review.whamcloud.com/39121
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Chris Horn <chris.horn@hpe.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lnet/klnds/socklnd/socklnd.c
lnet/klnds/socklnd/socklnd.h
lnet/klnds/socklnd/socklnd_cb.c

index 1389d4f..19777ae 100644 (file)
@@ -2264,9 +2264,9 @@ ksocknal_base_shutdown(void)
                }
 
                wait_var_event_warning(&ksocknal_data.ksnd_nthreads,
-                                      ksocknal_data.ksnd_nthreads == 0,
+                                      atomic_read(&ksocknal_data.ksnd_nthreads) == 0,
                                       "waiting for %d threads to terminate\n",
-                                      ksocknal_data.ksnd_nthreads);
+                                      atomic_read(&ksocknal_data.ksnd_nthreads));
 
                ksocknal_free_buffers();
 
index c539d1b..c22a0eb 100644 (file)
@@ -182,7 +182,7 @@ struct ksock_nal_data {
        /* hash table of all my known peers */
        DECLARE_HASHTABLE(ksnd_peers, SOCKNAL_PEER_HASH_BITS);
 
-       int                     ksnd_nthreads;  /* # live threads */
+       atomic_t                ksnd_nthreads;  /* # live threads */
        int                     ksnd_shuttingdown; /* tell threads to exit */
        /* schedulers information */
        struct ksock_sched      **ksnd_schedulers;
index 2cb93a7..815a8a2 100644 (file)
@@ -1059,19 +1059,15 @@ ksocknal_thread_start(int (*fn)(void *arg), void *arg, char *name)
        if (IS_ERR(task))
                return PTR_ERR(task);
 
-       write_lock_bh(&ksocknal_data.ksnd_global_lock);
-       ksocknal_data.ksnd_nthreads++;
-       write_unlock_bh(&ksocknal_data.ksnd_global_lock);
+       atomic_inc(&ksocknal_data.ksnd_nthreads);
        return 0;
 }
 
 void
 ksocknal_thread_fini (void)
 {
-       write_lock_bh(&ksocknal_data.ksnd_global_lock);
-       if (--ksocknal_data.ksnd_nthreads == 0)
+       if (atomic_dec_and_test(&ksocknal_data.ksnd_nthreads))
                wake_up_var(&ksocknal_data.ksnd_nthreads);
-       write_unlock_bh(&ksocknal_data.ksnd_global_lock);
 }
 
 int