diff --git a/lib/nvme/nvme.c b/lib/nvme/nvme.c index c82792886..0f4706b0b 100644 --- a/lib/nvme/nvme.c +++ b/lib/nvme/nvme.c @@ -69,7 +69,7 @@ spdk_nvme_detach(struct spdk_nvme_ctrlr *ctrlr) nvme_ctrlr_proc_put_ref(ctrlr); if (nvme_ctrlr_get_ref_count(ctrlr) == 0) { - nvme_io_msg_ctrlr_stop(ctrlr, NULL, true); + nvme_io_msg_ctrlr_detach(ctrlr); if (nvme_ctrlr_shared(ctrlr)) { TAILQ_REMOVE(&g_spdk_nvme_driver->shared_attached_ctrlrs, ctrlr, tailq); } else { diff --git a/lib/nvme/nvme_cuse.c b/lib/nvme/nvme_cuse.c index 18d36bb25..5c808202f 100644 --- a/lib/nvme/nvme_cuse.c +++ b/lib/nvme/nvme_cuse.c @@ -778,14 +778,14 @@ spdk_nvme_cuse_register(struct spdk_nvme_ctrlr *ctrlr, const char *dev_path) return -EINVAL; } - rc = nvme_io_msg_ctrlr_start(ctrlr, &cuse_nvme_io_msg_producer); + rc = nvme_io_msg_ctrlr_register(ctrlr, &cuse_nvme_io_msg_producer); if (rc) { return rc; } rc = nvme_cuse_start(ctrlr, dev_path); if (rc) { - nvme_io_msg_ctrlr_stop(ctrlr, &cuse_nvme_io_msg_producer, false); + nvme_io_msg_ctrlr_unregister(ctrlr, &cuse_nvme_io_msg_producer); } return rc; @@ -796,7 +796,7 @@ spdk_nvme_cuse_unregister(struct spdk_nvme_ctrlr *ctrlr) { nvme_cuse_stop(ctrlr); - nvme_io_msg_ctrlr_stop(ctrlr, &cuse_nvme_io_msg_producer, false); + nvme_io_msg_ctrlr_unregister(ctrlr, &cuse_nvme_io_msg_producer); } char * diff --git a/lib/nvme/nvme_io_msg.c b/lib/nvme/nvme_io_msg.c index c224da979..41a1aee62 100644 --- a/lib/nvme/nvme_io_msg.c +++ b/lib/nvme/nvme_io_msg.c @@ -107,7 +107,8 @@ spdk_nvme_io_msg_process(struct spdk_nvme_ctrlr *ctrlr) } int -nvme_io_msg_ctrlr_start(struct spdk_nvme_ctrlr *ctrlr, struct nvme_io_msg_producer *io_msg_producer) +nvme_io_msg_ctrlr_register(struct spdk_nvme_ctrlr *ctrlr, + struct nvme_io_msg_producer *io_msg_producer) { if (io_msg_producer == NULL) { SPDK_ERRLOG("io_msg_producer cannot be NULL\n"); @@ -144,26 +145,12 @@ nvme_io_msg_ctrlr_start(struct spdk_nvme_ctrlr *ctrlr, struct nvme_io_msg_produc } void -nvme_io_msg_ctrlr_stop(struct spdk_nvme_ctrlr *ctrlr, struct nvme_io_msg_producer *io_msg_producer, - bool shutdown) +nvme_io_msg_ctrlr_detach(struct spdk_nvme_ctrlr *ctrlr) { - if (STAILQ_EMPTY(&ctrlr->io_producers) && shutdown) { - /* Shutdown path with no producers registered = io msg ctrlr not started */ - return; + if (ctrlr->external_io_msgs) { + spdk_ring_free(ctrlr->external_io_msgs); } - if (io_msg_producer != NULL) { - STAILQ_REMOVE(&ctrlr->io_producers, io_msg_producer, nvme_io_msg_producer, link); - } - - if (!STAILQ_EMPTY(&ctrlr->io_producers) && !shutdown) { - /* There are still some registered producers */ - return; - } - - assert(ctrlr->external_io_msgs); - spdk_ring_free(ctrlr->external_io_msgs); - if (ctrlr->external_io_msgs_qpair) { spdk_nvme_ctrlr_free_io_qpair(ctrlr->external_io_msgs_qpair); ctrlr->external_io_msgs_qpair = NULL; @@ -171,3 +158,16 @@ nvme_io_msg_ctrlr_stop(struct spdk_nvme_ctrlr *ctrlr, struct nvme_io_msg_produce pthread_mutex_destroy(&ctrlr->external_io_msgs_lock); } + +void +nvme_io_msg_ctrlr_unregister(struct spdk_nvme_ctrlr *ctrlr, + struct nvme_io_msg_producer *io_msg_producer) +{ + if (io_msg_producer != NULL) { + STAILQ_REMOVE(&ctrlr->io_producers, io_msg_producer, nvme_io_msg_producer, link); + } + + if (STAILQ_EMPTY(&ctrlr->io_producers)) { + nvme_io_msg_ctrlr_detach(ctrlr); + } +} diff --git a/lib/nvme/nvme_io_msg.h b/lib/nvme/nvme_io_msg.h index 69bf17fe5..60e8c54d0 100644 --- a/lib/nvme/nvme_io_msg.h +++ b/lib/nvme/nvme_io_msg.h @@ -78,9 +78,10 @@ int nvme_io_msg_send(struct spdk_nvme_ctrlr *ctrlr, uint32_t nsid, spdk_nvme_io_ */ int spdk_nvme_io_msg_process(struct spdk_nvme_ctrlr *ctrlr); -int nvme_io_msg_ctrlr_start(struct spdk_nvme_ctrlr *ctrlr, - struct nvme_io_msg_producer *io_msg_producer); -void nvme_io_msg_ctrlr_stop(struct spdk_nvme_ctrlr *ctrlr, - struct nvme_io_msg_producer *io_msg_producer, bool shutdown); +int nvme_io_msg_ctrlr_register(struct spdk_nvme_ctrlr *ctrlr, + struct nvme_io_msg_producer *io_msg_producer); +void nvme_io_msg_ctrlr_unregister(struct spdk_nvme_ctrlr *ctrlr, + struct nvme_io_msg_producer *io_msg_producer); +void nvme_io_msg_ctrlr_detach(struct spdk_nvme_ctrlr *ctrlr); #endif /* SPDK_NVME_IO_MSG_H_ */ diff --git a/test/unit/lib/nvme/nvme.c/nvme_ut.c b/test/unit/lib/nvme/nvme.c/nvme_ut.c index 0bb854c0d..ef31a3580 100644 --- a/test/unit/lib/nvme/nvme.c/nvme_ut.c +++ b/test/unit/lib/nvme/nvme.c/nvme_ut.c @@ -60,8 +60,7 @@ DEFINE_STUB(nvme_transport_ctrlr_construct, struct spdk_nvme_ctrlr *, (const struct spdk_nvme_transport_id *trid, const struct spdk_nvme_ctrlr_opts *opts, void *devhandle), NULL); -DEFINE_STUB_V(nvme_io_msg_ctrlr_stop, (struct spdk_nvme_ctrlr *ctrlr, - struct nvme_io_msg_producer *io_msg_producer, bool shutdown)); +DEFINE_STUB_V(nvme_io_msg_ctrlr_detach, (struct spdk_nvme_ctrlr *ctrlr)); static bool ut_destruct_called = false; void