diff --git a/lib/nvme/nvme.c b/lib/nvme/nvme.c index dcbe85d29..80fffc7ed 100644 --- a/lib/nvme/nvme.c +++ b/lib/nvme/nvme.c @@ -38,6 +38,7 @@ struct nvme_driver _g_nvme_driver = { .init_ctrlrs = TAILQ_HEAD_INITIALIZER(_g_nvme_driver.init_ctrlrs), .attached_ctrlrs = TAILQ_HEAD_INITIALIZER(_g_nvme_driver.attached_ctrlrs), .request_mempool = NULL, + .initialized = false, }; struct nvme_driver *g_spdk_nvme_driver = &_g_nvme_driver; @@ -277,6 +278,12 @@ spdk_nvme_probe(void *cb_ctx, spdk_nvme_probe_cb probe_cb, spdk_nvme_attach_cb a struct nvme_enum_ctx enum_ctx; struct spdk_nvme_ctrlr *ctrlr, *ctrlr_tmp; + if (!spdk_process_is_primary()) { + while (g_spdk_nvme_driver->initialized == false) { + usleep(200 * 1000); + } + } + pthread_mutex_lock(&g_spdk_nvme_driver->lock); if (g_spdk_nvme_driver->request_mempool == NULL) { @@ -349,6 +356,8 @@ spdk_nvme_probe(void *cb_ctx, spdk_nvme_probe_cb probe_cb, spdk_nvme_attach_cb a } } + g_spdk_nvme_driver->initialized = true; + pthread_mutex_unlock(&g_spdk_nvme_driver->lock); return rc; } diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index 63eff79e9..16cb3f478 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -402,10 +402,11 @@ struct spdk_nvme_ctrlr { }; struct nvme_driver { - pthread_mutex_t lock; + pthread_mutex_t lock; TAILQ_HEAD(, spdk_nvme_ctrlr) init_ctrlrs; TAILQ_HEAD(, spdk_nvme_ctrlr) attached_ctrlrs; - struct spdk_mempool *request_mempool; + struct spdk_mempool *request_mempool; + bool initialized; }; extern struct nvme_driver *g_spdk_nvme_driver;