From: Mr NeilBrown Date: Sun, 7 Jun 2020 23:24:36 +0000 (-0400) Subject: LU-12678 socklnd: change ksnd_nthreads to atomic_t X-Git-Tag: 2.13.55~24 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F21%2F39121%2F3;p=fs%2Flustre-release.git LU-12678 socklnd: change ksnd_nthreads to atomic_t 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 Change-Id: Id94d280875a9e115dc077253c49e97a725dc91e1 Reviewed-on: https://review.whamcloud.com/39121 Tested-by: jenkins Tested-by: Maloo Reviewed-by: James Simmons Reviewed-by: Chris Horn Reviewed-by: Oleg Drokin --- diff --git a/lnet/klnds/socklnd/socklnd.c b/lnet/klnds/socklnd/socklnd.c index 1389d4f..19777ae 100644 --- a/lnet/klnds/socklnd/socklnd.c +++ b/lnet/klnds/socklnd/socklnd.c @@ -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(); diff --git a/lnet/klnds/socklnd/socklnd.h b/lnet/klnds/socklnd/socklnd.h index c539d1b..c22a0eb 100644 --- a/lnet/klnds/socklnd/socklnd.h +++ b/lnet/klnds/socklnd/socklnd.h @@ -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; diff --git a/lnet/klnds/socklnd/socklnd_cb.c b/lnet/klnds/socklnd/socklnd_cb.c index 2cb93a7..815a8a2 100644 --- a/lnet/klnds/socklnd/socklnd_cb.c +++ b/lnet/klnds/socklnd/socklnd_cb.c @@ -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