From e0c445648a38fb72cc426ac0c16c33f5183cda08 Mon Sep 17 00:00:00 2001 From: Serguei Smirnov Date: Wed, 16 Sep 2020 09:46:48 -0700 Subject: [PATCH] LU-12233 lnet: deadlock on LNet shutdown Release ln_api_mutex during LNet shutdown while waiting for zombie LNI to allow other threads to read the LNet state updated by the shutdown and fall through, avoiding the deadlock Signed-off-by: Serguei Smirnov Change-Id: Iaba11624d5b79bd0acb4add39f6153c55770440a Reviewed-on: https://review.whamcloud.com/39933 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Chris Horn Reviewed-by: Amir Shehata Reviewed-by: Oleg Drokin --- lnet/lnet/api-ni.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lnet/lnet/api-ni.c b/lnet/lnet/api-ni.c index a7b3f8c..dff911d 100644 --- a/lnet/lnet/api-ni.c +++ b/lnet/lnet/api-ni.c @@ -2114,7 +2114,13 @@ lnet_clear_zombies_nis_locked(struct lnet_net *net) } if (!list_empty(&ni->ni_netlist)) { + /* Unlock mutex while waiting to allow other + * threads to read the LNet state and fall through + * to avoid deadlock + */ lnet_net_unlock(LNET_LOCK_EX); + mutex_unlock(&the_lnet.ln_api_mutex); + ++i; if ((i & (-i)) == i) { CDEBUG(D_WARNING, @@ -2122,6 +2128,8 @@ lnet_clear_zombies_nis_locked(struct lnet_net *net) libcfs_nid2str(ni->ni_nid)); } schedule_timeout_uninterruptible(cfs_time_seconds(1)); + + mutex_lock(&the_lnet.ln_api_mutex); lnet_net_lock(LNET_LOCK_EX); continue; } -- 1.8.3.1