From 80c4ee0a5e183cbe84d0d5dabd1c75fe99845d1d Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Thu, 26 Nov 2020 15:34:00 +0900 Subject: [PATCH] bdev/nvme: Use SPDK message at bdev_nvme_library_fini() not to unlock during TAILQ_FOREACH() Even if we use TAILQ_FOREACH_SAFE(), it is not safe to lock and unlock while linked list is parsed. To fix such erroneous implementation, use SPDK message. Signed-off-by: Shuhei Matsumoto Change-Id: I79a126560ccd847149d4d06bb3d2111e43060ff7 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/5321 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Aleksey Marchuk Reviewed-by: Changpeng Liu --- module/bdev/nvme/bdev_nvme.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index c91b1f65b..25bd22c74 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -1595,8 +1595,10 @@ attach_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid, } static void -_nvme_bdev_ctrlr_destruct(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr) +_nvme_bdev_ctrlr_destruct(void *ctx) { + struct nvme_bdev_ctrlr *nvme_bdev_ctrlr = ctx; + nvme_ctrlr_depopulate_namespaces(nvme_bdev_ctrlr); pthread_mutex_lock(&g_bdev_nvme_mutex); @@ -2105,11 +2107,8 @@ bdev_nvme_library_fini(void) } nvme_bdev_ctrlr->destruct = true; - pthread_mutex_unlock(&g_bdev_nvme_mutex); - - _nvme_bdev_ctrlr_destruct(nvme_bdev_ctrlr); - - pthread_mutex_lock(&g_bdev_nvme_mutex); + spdk_thread_send_msg(nvme_bdev_ctrlr->thread, _nvme_bdev_ctrlr_destruct, + nvme_bdev_ctrlr); } g_bdev_nvme_module_finish = true;