From da98b92b924e7a6bb628c038c5bf7c30bb8f5d45 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Tue, 9 Apr 2019 15:09:43 +0900 Subject: [PATCH] lib/iscsi: Reduce critical region during target node shutdown iSCSI mutex had guarded both unregister operation and destruct operation in a single critical region in spdk_iscsi_shutdown_tgt_nodes and spdk_iscsi_shutdown_tgt_node_by_name. Subsequent patches will separate unregister operation and destruct operation, and so this patch separates critical region of unregister operation and destruct operation. Change-Id: I847915f8277c4475c034ca64fd07ccdd47659590 Signed-off-by: Shuhei Matsumoto Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/450583 Tested-by: SPDK CI Jenkins Reviewed-by: Changpeng Liu Reviewed-by: Ben Walker Reviewed-by: Jim Harris --- lib/iscsi/tgt_node.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/iscsi/tgt_node.c b/lib/iscsi/tgt_node.c index 20726ad15..064cf7827 100644 --- a/lib/iscsi/tgt_node.c +++ b/lib/iscsi/tgt_node.c @@ -635,7 +635,10 @@ iscsi_tgt_node_destruct(struct spdk_iscsi_tgt_node *target) free(target->name); free(target->alias); + + pthread_mutex_lock(&g_spdk_iscsi.mutex); iscsi_tgt_node_delete_all_pg_maps(target); + pthread_mutex_unlock(&g_spdk_iscsi.mutex); pthread_mutex_destroy(&target->mutex); free(target); @@ -1228,12 +1231,18 @@ int spdk_iscsi_parse_tgt_nodes(void) void spdk_iscsi_shutdown_tgt_nodes(void) { - struct spdk_iscsi_tgt_node *target, *tmp; + struct spdk_iscsi_tgt_node *target; pthread_mutex_lock(&g_spdk_iscsi.mutex); - TAILQ_FOREACH_SAFE(target, &g_spdk_iscsi.target_head, tailq, tmp) { + while (!TAILQ_EMPTY(&g_spdk_iscsi.target_head)) { + target = TAILQ_FIRST(&g_spdk_iscsi.target_head); TAILQ_REMOVE(&g_spdk_iscsi.target_head, target, tailq); + + pthread_mutex_unlock(&g_spdk_iscsi.mutex); + iscsi_tgt_node_destruct(target); + + pthread_mutex_lock(&g_spdk_iscsi.mutex); } pthread_mutex_unlock(&g_spdk_iscsi.mutex); } @@ -1247,9 +1256,10 @@ spdk_iscsi_shutdown_tgt_node_by_name(const char *target_name) target = spdk_iscsi_find_tgt_node(target_name); if (target != NULL) { iscsi_tgt_node_unregister(target); - iscsi_tgt_node_destruct(target); pthread_mutex_unlock(&g_spdk_iscsi.mutex); + iscsi_tgt_node_destruct(target); + return 0; } pthread_mutex_unlock(&g_spdk_iscsi.mutex);