From 4b0d3c0e41201716f4a1bb2da17254695b623d7e Mon Sep 17 00:00:00 2001 From: Mr NeilBrown Date: Sun, 7 Jun 2020 19:24:36 -0400 Subject: [PATCH] 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 --- lnet/klnds/socklnd/socklnd.c | 4 ++-- lnet/klnds/socklnd/socklnd.h | 2 +- lnet/klnds/socklnd/socklnd_cb.c | 8 ++------ 3 files changed, 5 insertions(+), 9 deletions(-) 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 -- 1.8.3.1