From 02385a64b93f403c2df8c85572bc913052feec2f Mon Sep 17 00:00:00 2001 From: Konrad Sztyber Date: Thu, 5 Mar 2020 11:45:00 +0100 Subject: [PATCH] bdev/nvme: asynchronous module_finish Now that a namespace can be depulated asynchronously now, the NVMe bdev module should also be finalized asynchronously, after all namespaces and controllers are deallocated. Change-Id: Ic082fec8e31e9bd5ee1c698cd8dfca9f248776d3 Signed-off-by: Konrad Sztyber Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1198 Tested-by: SPDK CI Jenkins Reviewed-by: Shuhei Matsumoto Reviewed-by: Aleksey Marchuk --- module/bdev/nvme/bdev_nvme.c | 9 +++++++++ module/bdev/nvme/common.c | 10 ++++++++++ module/bdev/nvme/common.h | 1 + test/unit/lib/bdev/bdev_ocssd.c/bdev_ocssd_ut.c | 1 + 4 files changed, 21 insertions(+) diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index c2195bd89..1dda4dd27 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -212,6 +212,7 @@ bdev_nvme_get_ctx_size(void) static struct spdk_bdev_module nvme_if = { .name = "nvme", + .async_fini = true, .module_init = bdev_nvme_library_init, .module_fini = bdev_nvme_library_fini, .config_text = bdev_nvme_get_spdk_running_config, @@ -1949,6 +1950,14 @@ bdev_nvme_library_fini(void) pthread_mutex_lock(&g_bdev_nvme_mutex); } } + + g_bdev_nvme_module_finish = true; + if (TAILQ_EMPTY(&g_nvme_bdev_ctrlrs)) { + pthread_mutex_unlock(&g_bdev_nvme_mutex); + spdk_bdev_module_finish_done(); + return; + } + pthread_mutex_unlock(&g_bdev_nvme_mutex); } diff --git a/module/bdev/nvme/common.c b/module/bdev/nvme/common.c index c8aaa8ad9..fce521213 100644 --- a/module/bdev/nvme/common.c +++ b/module/bdev/nvme/common.c @@ -37,6 +37,7 @@ struct nvme_bdev_ctrlrs g_nvme_bdev_ctrlrs = TAILQ_HEAD_INITIALIZER(g_nvme_bdev_ctrlrs); pthread_mutex_t g_bdev_nvme_mutex = PTHREAD_MUTEX_INITIALIZER; +bool g_bdev_nvme_module_finish; struct nvme_bdev_ctrlr * nvme_bdev_ctrlr_get(const struct spdk_nvme_transport_id *trid) @@ -128,6 +129,15 @@ nvme_bdev_unregister_cb(void *io_device) } free(nvme_bdev_ctrlr->namespaces); free(nvme_bdev_ctrlr); + + pthread_mutex_lock(&g_bdev_nvme_mutex); + if (g_bdev_nvme_module_finish && TAILQ_EMPTY(&g_nvme_bdev_ctrlrs)) { + pthread_mutex_unlock(&g_bdev_nvme_mutex); + spdk_bdev_module_finish_done(); + return; + } + + pthread_mutex_unlock(&g_bdev_nvme_mutex); } void diff --git a/module/bdev/nvme/common.h b/module/bdev/nvme/common.h index 741631bcb..96cd6d0fc 100644 --- a/module/bdev/nvme/common.h +++ b/module/bdev/nvme/common.h @@ -41,6 +41,7 @@ TAILQ_HEAD(nvme_bdev_ctrlrs, nvme_bdev_ctrlr); extern struct nvme_bdev_ctrlrs g_nvme_bdev_ctrlrs; extern pthread_mutex_t g_bdev_nvme_mutex; +extern bool g_bdev_nvme_module_finish; #define NVME_MAX_CONTROLLERS 1024 diff --git a/test/unit/lib/bdev/bdev_ocssd.c/bdev_ocssd_ut.c b/test/unit/lib/bdev/bdev_ocssd.c/bdev_ocssd_ut.c index f60d52e27..2c8e72fa9 100644 --- a/test/unit/lib/bdev/bdev_ocssd.c/bdev_ocssd_ut.c +++ b/test/unit/lib/bdev/bdev_ocssd.c/bdev_ocssd_ut.c @@ -60,6 +60,7 @@ DEFINE_STUB(spdk_bdev_push_media_events, int, (struct spdk_bdev *bdev, size_t num_events), 0); DEFINE_STUB_V(spdk_bdev_notify_media_management, (struct spdk_bdev *bdev)); DEFINE_STUB_V(nvme_ctrlr_depopulate_namespace_done, (struct nvme_bdev_ctrlr *ctrlr)); +DEFINE_STUB_V(spdk_bdev_module_finish_done, (void)); struct nvme_request { spdk_nvme_cmd_cb cb_fn;