From a987bd16c23ecbf4239327d9df4e23d289d1b874 Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Wed, 19 Oct 2016 10:19:34 -0700 Subject: [PATCH] nvme: convert adminq to a qpair pointer Rather than embedding adminq directly in the spdk_nvme_ctrlr structure, change it to a pointer to a spdk_nvme_qpair. This is necessary to allow the transport to extend the qpair structure. Change-Id: I041685d5037088cf56d046fe99bf204edcfc57b1 Signed-off-by: Daniel Verkamp --- lib/nvme/nvme_ctrlr.c | 54 +++++++++++-------- lib/nvme/nvme_internal.h | 2 +- lib/nvme/nvme_ns.c | 2 +- lib/nvme/nvme_pcie.c | 10 ++-- .../nvme/unit/nvme_ctrlr_c/nvme_ctrlr_ut.c | 36 +++++++++++++ 5 files changed, 74 insertions(+), 30 deletions(-) diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index 11cc26f3e..2951ce7de 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -237,7 +237,7 @@ static int nvme_ctrlr_set_intel_support_log_pages(struct spdk_nvme_ctrlr *ctrlr) nvme_completion_poll_cb, &status); while (status.done == false) { - spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0); + spdk_nvme_qpair_process_completions(ctrlr->adminq, 0); } if (spdk_nvme_cpl_is_error(&status.cpl)) { spdk_free(log_page_directory); @@ -310,7 +310,12 @@ nvme_ctrlr_set_supported_features(struct spdk_nvme_ctrlr *ctrlr) static int nvme_ctrlr_construct_admin_qpair(struct spdk_nvme_ctrlr *ctrlr) { - return nvme_qpair_construct(&ctrlr->adminq, + ctrlr->adminq = spdk_zmalloc(sizeof(struct spdk_nvme_qpair), 64, NULL); + if (ctrlr->adminq == NULL) { + return -ENOMEM; + } + + return nvme_qpair_construct(ctrlr->adminq, 0, /* qpair ID */ NVME_ADMIN_ENTRIES, ctrlr); @@ -322,7 +327,7 @@ nvme_ctrlr_fail(struct spdk_nvme_ctrlr *ctrlr) struct spdk_nvme_qpair *qpair; ctrlr->is_failed = true; - nvme_qpair_fail(&ctrlr->adminq); + nvme_qpair_fail(ctrlr->adminq); TAILQ_FOREACH(qpair, &ctrlr->active_io_qpairs, tailq) { nvme_qpair_fail(qpair); } @@ -393,20 +398,20 @@ nvme_ctrlr_enable(struct spdk_nvme_ctrlr *ctrlr) return -EINVAL; } - if (nvme_ctrlr_set_asq(ctrlr, ctrlr->adminq.cmd_bus_addr)) { + if (nvme_ctrlr_set_asq(ctrlr, ctrlr->adminq->cmd_bus_addr)) { SPDK_TRACELOG(SPDK_TRACE_NVME, "set_asq() failed\n"); return -EIO; } - if (nvme_ctrlr_set_acq(ctrlr, ctrlr->adminq.cpl_bus_addr)) { + if (nvme_ctrlr_set_acq(ctrlr, ctrlr->adminq->cpl_bus_addr)) { SPDK_TRACELOG(SPDK_TRACE_NVME, "set_acq() failed\n"); return -EIO; } aqa.raw = 0; /* acqs and asqs are 0-based. */ - aqa.bits.acqs = ctrlr->adminq.num_entries - 1; - aqa.bits.asqs = ctrlr->adminq.num_entries - 1; + aqa.bits.acqs = ctrlr->adminq->num_entries - 1; + aqa.bits.asqs = ctrlr->adminq->num_entries - 1; if (nvme_ctrlr_set_aqa(ctrlr, &aqa)) { SPDK_TRACELOG(SPDK_TRACE_NVME, "set_aqa() failed\n"); @@ -484,7 +489,7 @@ spdk_nvme_ctrlr_reset(struct spdk_nvme_ctrlr *ctrlr) SPDK_NOTICELOG("resetting controller\n"); /* Disable all queues before disabling the controller hardware. */ - nvme_qpair_disable(&ctrlr->adminq); + nvme_qpair_disable(ctrlr->adminq); TAILQ_FOREACH(qpair, &ctrlr->active_io_qpairs, tailq) { nvme_qpair_disable(qpair); } @@ -532,7 +537,7 @@ nvme_ctrlr_identify(struct spdk_nvme_ctrlr *ctrlr) } while (status.done == false) { - spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0); + spdk_nvme_qpair_process_completions(ctrlr->adminq, 0); } if (spdk_nvme_cpl_is_error(&status.cpl)) { SPDK_ERRLOG("nvme_identify_controller failed!\n"); @@ -578,7 +583,7 @@ nvme_ctrlr_set_num_qpairs(struct spdk_nvme_ctrlr *ctrlr) } while (status.done == false) { - spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0); + spdk_nvme_qpair_process_completions(ctrlr->adminq, 0); } if (spdk_nvme_cpl_is_error(&status.cpl)) { SPDK_ERRLOG("nvme_set_num_queues failed!\n"); @@ -747,7 +752,7 @@ nvme_ctrlr_configure_aer(struct spdk_nvme_ctrlr *ctrlr) } while (status.done == false) { - spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0); + spdk_nvme_qpair_process_completions(ctrlr->adminq, 0); } if (spdk_nvme_cpl_is_error(&status.cpl)) { SPDK_ERRLOG("nvme_ctrlr_cmd_set_async_event_config failed!\n"); @@ -890,9 +895,9 @@ nvme_ctrlr_process_init(struct spdk_nvme_ctrlr *ctrlr) int nvme_ctrlr_start(struct spdk_nvme_ctrlr *ctrlr) { - ctrlr->transport->qpair_reset(&ctrlr->adminq); + ctrlr->transport->qpair_reset(ctrlr->adminq); - nvme_qpair_enable(&ctrlr->adminq); + nvme_qpair_enable(ctrlr->adminq); if (nvme_ctrlr_identify(ctrlr) != 0) { return -1; @@ -985,7 +990,10 @@ nvme_ctrlr_destruct(struct spdk_nvme_ctrlr *ctrlr) spdk_bit_array_free(&ctrlr->free_io_qids); - nvme_qpair_destroy(&ctrlr->adminq); + if (ctrlr->adminq) { + nvme_qpair_destroy(ctrlr->adminq); + spdk_free(ctrlr->adminq); + } pthread_mutex_destroy(&ctrlr->ctrlr_lock); @@ -996,7 +1004,7 @@ int nvme_ctrlr_submit_admin_request(struct spdk_nvme_ctrlr *ctrlr, struct nvme_request *req) { - return nvme_qpair_submit_request(&ctrlr->adminq, req); + return nvme_qpair_submit_request(ctrlr->adminq, req); } int32_t @@ -1005,7 +1013,7 @@ spdk_nvme_ctrlr_process_admin_completions(struct spdk_nvme_ctrlr *ctrlr) int32_t num_completions; pthread_mutex_lock(&ctrlr->ctrlr_lock); - num_completions = spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0); + num_completions = spdk_nvme_qpair_process_completions(ctrlr->adminq, 0); pthread_mutex_unlock(&ctrlr->ctrlr_lock); return num_completions; @@ -1092,7 +1100,7 @@ spdk_nvme_ctrlr_attach_ns(struct spdk_nvme_ctrlr *ctrlr, uint32_t nsid, return res; while (status.done == false) { pthread_mutex_lock(&ctrlr->ctrlr_lock); - spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0); + spdk_nvme_qpair_process_completions(ctrlr->adminq, 0); pthread_mutex_unlock(&ctrlr->ctrlr_lock); } if (spdk_nvme_cpl_is_error(&status.cpl)) { @@ -1117,7 +1125,7 @@ spdk_nvme_ctrlr_detach_ns(struct spdk_nvme_ctrlr *ctrlr, uint32_t nsid, return res; while (status.done == false) { pthread_mutex_lock(&ctrlr->ctrlr_lock); - spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0); + spdk_nvme_qpair_process_completions(ctrlr->adminq, 0); pthread_mutex_unlock(&ctrlr->ctrlr_lock); } if (spdk_nvme_cpl_is_error(&status.cpl)) { @@ -1140,7 +1148,7 @@ spdk_nvme_ctrlr_create_ns(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_ns_dat return 0; while (status.done == false) { pthread_mutex_lock(&ctrlr->ctrlr_lock); - spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0); + spdk_nvme_qpair_process_completions(ctrlr->adminq, 0); pthread_mutex_unlock(&ctrlr->ctrlr_lock); } if (spdk_nvme_cpl_is_error(&status.cpl)) { @@ -1169,7 +1177,7 @@ spdk_nvme_ctrlr_delete_ns(struct spdk_nvme_ctrlr *ctrlr, uint32_t nsid) return res; while (status.done == false) { pthread_mutex_lock(&ctrlr->ctrlr_lock); - spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0); + spdk_nvme_qpair_process_completions(ctrlr->adminq, 0); pthread_mutex_unlock(&ctrlr->ctrlr_lock); } if (spdk_nvme_cpl_is_error(&status.cpl)) { @@ -1194,7 +1202,7 @@ spdk_nvme_ctrlr_format(struct spdk_nvme_ctrlr *ctrlr, uint32_t nsid, return res; while (status.done == false) { pthread_mutex_lock(&ctrlr->ctrlr_lock); - spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0); + spdk_nvme_qpair_process_completions(ctrlr->adminq, 0); pthread_mutex_unlock(&ctrlr->ctrlr_lock); } if (spdk_nvme_cpl_is_error(&status.cpl)) { @@ -1239,7 +1247,7 @@ spdk_nvme_ctrlr_update_firmware(struct spdk_nvme_ctrlr *ctrlr, void *payload, ui while (status.done == false) { pthread_mutex_lock(&ctrlr->ctrlr_lock); - spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0); + spdk_nvme_qpair_process_completions(ctrlr->adminq, 0); pthread_mutex_unlock(&ctrlr->ctrlr_lock); } if (spdk_nvme_cpl_is_error(&status.cpl)) { @@ -1265,7 +1273,7 @@ spdk_nvme_ctrlr_update_firmware(struct spdk_nvme_ctrlr *ctrlr, void *payload, ui while (status.done == false) { pthread_mutex_lock(&ctrlr->ctrlr_lock); - spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0); + spdk_nvme_qpair_process_completions(ctrlr->adminq, 0); pthread_mutex_unlock(&ctrlr->ctrlr_lock); } if (spdk_nvme_cpl_is_error(&status.cpl)) { diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index fc1d08760..fab0df352 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -465,7 +465,7 @@ struct spdk_nvme_ctrlr { pthread_mutex_t ctrlr_lock; - struct spdk_nvme_qpair adminq; + struct spdk_nvme_qpair *adminq; /** * Identify Controller data. diff --git a/lib/nvme/nvme_ns.c b/lib/nvme/nvme_ns.c index 2078618eb..d4b1cb0a9 100644 --- a/lib/nvme/nvme_ns.c +++ b/lib/nvme/nvme_ns.c @@ -56,7 +56,7 @@ int nvme_ns_identify_update(struct spdk_nvme_ns *ns) while (status.done == false) { pthread_mutex_lock(&ns->ctrlr->ctrlr_lock); - spdk_nvme_qpair_process_completions(&ns->ctrlr->adminq, 0); + spdk_nvme_qpair_process_completions(ns->ctrlr->adminq, 0); pthread_mutex_unlock(&ns->ctrlr->ctrlr_lock); } if (spdk_nvme_cpl_is_error(&status.cpl)) { diff --git a/lib/nvme/nvme_pcie.c b/lib/nvme/nvme_pcie.c index 87f5840d6..9b157120e 100644 --- a/lib/nvme/nvme_pcie.c +++ b/lib/nvme/nvme_pcie.c @@ -798,7 +798,7 @@ _nvme_pcie_ctrlr_create_io_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme } while (status.done == false) { - spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0); + spdk_nvme_qpair_process_completions(ctrlr->adminq, 0); } if (spdk_nvme_cpl_is_error(&status.cpl)) { SPDK_ERRLOG("nvme_create_io_cq failed!\n"); @@ -812,7 +812,7 @@ _nvme_pcie_ctrlr_create_io_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme } while (status.done == false) { - spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0); + spdk_nvme_qpair_process_completions(ctrlr->adminq, 0); } if (spdk_nvme_cpl_is_error(&status.cpl)) { SPDK_ERRLOG("nvme_create_io_sq failed!\n"); @@ -823,7 +823,7 @@ _nvme_pcie_ctrlr_create_io_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme return -1; } while (status.done == false) { - spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0); + spdk_nvme_qpair_process_completions(ctrlr->adminq, 0); } return -1; } @@ -904,7 +904,7 @@ nvme_pcie_ctrlr_delete_io_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_ return rc; } while (status.done == false) { - spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0); + spdk_nvme_qpair_process_completions(ctrlr->adminq, 0); } if (spdk_nvme_cpl_is_error(&status.cpl)) { return -1; @@ -916,7 +916,7 @@ nvme_pcie_ctrlr_delete_io_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_ return rc; } while (status.done == false) { - spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0); + spdk_nvme_qpair_process_completions(ctrlr->adminq, 0); } if (spdk_nvme_cpl_is_error(&status.cpl)) { return -1; diff --git a/test/lib/nvme/unit/nvme_ctrlr_c/nvme_ctrlr_ut.c b/test/lib/nvme/unit/nvme_ctrlr_c/nvme_ctrlr_ut.c index 698514b91..b6f4c5b73 100644 --- a/test/lib/nvme/unit/nvme_ctrlr_c/nvme_ctrlr_ut.c +++ b/test/lib/nvme/unit/nvme_ctrlr_c/nvme_ctrlr_ut.c @@ -490,6 +490,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_rr(void) CU_ASSERT(g_ut_nvme_regs.cc.bits.ams == SPDK_NVME_CC_AMS_RR); CU_ASSERT(ctrlr.opts.arb_mechanism == SPDK_NVME_CC_AMS_RR); + g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE; + nvme_ctrlr_destruct(&ctrlr); + /* * Reset to initial state */ @@ -508,6 +511,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_rr(void) CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_ENABLE_WAIT_FOR_READY_1); CU_ASSERT(g_ut_nvme_regs.cc.bits.en == 0); + g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE; + nvme_ctrlr_destruct(&ctrlr); + /* * Reset to initial state */ @@ -526,6 +532,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_rr(void) CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_ENABLE_WAIT_FOR_READY_1); CU_ASSERT(g_ut_nvme_regs.cc.bits.en == 0); + g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE; + nvme_ctrlr_destruct(&ctrlr); + /* * Reset to initial state */ @@ -544,6 +553,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_rr(void) CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_ENABLE_WAIT_FOR_READY_1); CU_ASSERT(g_ut_nvme_regs.cc.bits.en == 0); + g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE; + nvme_ctrlr_destruct(&ctrlr); + /* * Reset to initial state */ @@ -609,6 +621,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_wrr(void) CU_ASSERT(g_ut_nvme_regs.cc.bits.ams == SPDK_NVME_CC_AMS_RR); CU_ASSERT(ctrlr.opts.arb_mechanism == SPDK_NVME_CC_AMS_RR); + g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE; + nvme_ctrlr_destruct(&ctrlr); + /* * Reset to initial state */ @@ -629,6 +644,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_wrr(void) CU_ASSERT(g_ut_nvme_regs.cc.bits.ams == SPDK_NVME_CC_AMS_WRR); CU_ASSERT(ctrlr.opts.arb_mechanism == SPDK_NVME_CC_AMS_WRR); + g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE; + nvme_ctrlr_destruct(&ctrlr); + /* * Reset to initial state */ @@ -647,6 +665,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_wrr(void) CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_ENABLE_WAIT_FOR_READY_1); CU_ASSERT(g_ut_nvme_regs.cc.bits.en == 0); + g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE; + nvme_ctrlr_destruct(&ctrlr); + /* * Reset to initial state */ @@ -665,6 +686,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_wrr(void) CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_ENABLE_WAIT_FOR_READY_1); CU_ASSERT(g_ut_nvme_regs.cc.bits.en == 0); + g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE; + nvme_ctrlr_destruct(&ctrlr); + /* * Reset to initial state */ @@ -729,6 +753,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_vs(void) CU_ASSERT(g_ut_nvme_regs.cc.bits.ams == SPDK_NVME_CC_AMS_RR); CU_ASSERT(ctrlr.opts.arb_mechanism == SPDK_NVME_CC_AMS_RR); + g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE; + nvme_ctrlr_destruct(&ctrlr); + /* * Reset to initial state */ @@ -747,6 +774,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_vs(void) CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_ENABLE_WAIT_FOR_READY_1); CU_ASSERT(g_ut_nvme_regs.cc.bits.en == 0); + g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE; + nvme_ctrlr_destruct(&ctrlr); + /* * Reset to initial state */ @@ -767,6 +797,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_vs(void) CU_ASSERT(g_ut_nvme_regs.cc.bits.ams == SPDK_NVME_CC_AMS_VS); CU_ASSERT(ctrlr.opts.arb_mechanism == SPDK_NVME_CC_AMS_VS); + g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE; + nvme_ctrlr_destruct(&ctrlr); + /* * Reset to initial state */ @@ -785,6 +818,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_vs(void) CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_ENABLE_WAIT_FOR_READY_1); CU_ASSERT(g_ut_nvme_regs.cc.bits.en == 0); + g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE; + nvme_ctrlr_destruct(&ctrlr); + /* * Reset to initial state */