From ba16e463493b301a532ed3163ebae6d4d317b6f5 Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Mon, 28 Nov 2016 16:26:04 -0700 Subject: [PATCH] nvme: pass opts and probe_info to nvme_attach() Let the transport access the controller options during ctrlr_construct(). Change-Id: I83590c111e75c843685dd9315f0f08416168356d Signed-off-by: Daniel Verkamp --- lib/nvme/nvme.c | 12 ++++++------ lib/nvme/nvme_internal.h | 8 ++++++-- lib/nvme/nvme_pcie.c | 4 ++++ lib/nvme/nvme_rdma.c | 17 ++++++++--------- lib/nvme/nvme_transport.c | 4 +++- test/lib/nvme/unit/nvme_c/nvme_ut.c | 2 ++ test/lib/nvme/unit/nvme_ctrlr_c/nvme_ctrlr_ut.c | 2 ++ .../nvme/unit/nvme_ns_cmd_c/nvme_ns_cmd_ut.c | 2 ++ 8 files changed, 33 insertions(+), 18 deletions(-) diff --git a/lib/nvme/nvme.c b/lib/nvme/nvme.c index 57b7d2c14..f96b73c88 100644 --- a/lib/nvme/nvme.c +++ b/lib/nvme/nvme.c @@ -47,11 +47,14 @@ struct nvme_driver *g_spdk_nvme_driver = &_g_nvme_driver; int32_t spdk_nvme_retry_count; struct spdk_nvme_ctrlr * -nvme_attach(enum spdk_nvme_transport transport, void *devhandle) +nvme_attach(enum spdk_nvme_transport transport, + const struct spdk_nvme_ctrlr_opts *opts, + const struct spdk_nvme_probe_info *probe_info, + void *devhandle) { struct spdk_nvme_ctrlr *ctrlr; - ctrlr = nvme_transport_ctrlr_construct(transport, devhandle); + ctrlr = nvme_transport_ctrlr_construct(transport, opts, probe_info, devhandle); return ctrlr; } @@ -238,15 +241,12 @@ nvme_probe_one(enum spdk_nvme_transport transport, spdk_nvme_probe_cb probe_cb, spdk_nvme_ctrlr_opts_set_defaults(&opts); if (probe_cb(cb_ctx, probe_info, &opts)) { - ctrlr = nvme_attach(transport, devhandle); + ctrlr = nvme_attach(transport, &opts, probe_info, devhandle); if (ctrlr == NULL) { SPDK_ERRLOG("nvme_attach() failed\n"); return -1; } - ctrlr->opts = opts; - ctrlr->probe_info = *probe_info; - TAILQ_INSERT_TAIL(&g_spdk_nvme_driver->init_ctrlrs, ctrlr, tailq); } diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index 6e22357b1..d59e7fefc 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -536,11 +536,15 @@ int nvme_mutex_init_recursive_shared(pthread_mutex_t *mtx); bool nvme_completion_is_retry(const struct spdk_nvme_cpl *cpl); void nvme_qpair_print_command(struct spdk_nvme_qpair *qpair, struct spdk_nvme_cmd *cmd); void nvme_qpair_print_completion(struct spdk_nvme_qpair *qpair, struct spdk_nvme_cpl *cpl); -struct spdk_nvme_ctrlr *nvme_attach(enum spdk_nvme_transport transport, void *devhandle); +struct spdk_nvme_ctrlr *nvme_attach(enum spdk_nvme_transport transport, + const struct spdk_nvme_ctrlr_opts *opts, + const struct spdk_nvme_probe_info *probe_info, + void *devhandle); /* Transport specific functions */ #define DECLARE_TRANSPORT(name) \ - struct spdk_nvme_ctrlr *nvme_ ## name ## _ctrlr_construct(enum spdk_nvme_transport transport, void *devhandle); \ + struct spdk_nvme_ctrlr *nvme_ ## name ## _ctrlr_construct(enum spdk_nvme_transport transport, const struct spdk_nvme_ctrlr_opts *opts, \ + const struct spdk_nvme_probe_info *probe_info, void *devhandle); \ int nvme_ ## name ## _ctrlr_destruct(struct spdk_nvme_ctrlr *ctrlr); \ int nvme_ ## name ## _ctrlr_scan(enum spdk_nvme_transport transport, spdk_nvme_probe_cb probe_cb, void *cb_ctx, void *devhandle); \ int nvme_ ## name ## _ctrlr_enable(struct spdk_nvme_ctrlr *ctrlr); \ diff --git a/lib/nvme/nvme_pcie.c b/lib/nvme/nvme_pcie.c index 874a33d4a..ae0ea68e9 100644 --- a/lib/nvme/nvme_pcie.c +++ b/lib/nvme/nvme_pcie.c @@ -554,6 +554,8 @@ nvme_pcie_ctrlr_scan(enum spdk_nvme_transport transport, } struct spdk_nvme_ctrlr *nvme_pcie_ctrlr_construct(enum spdk_nvme_transport transport, + const struct spdk_nvme_ctrlr_opts *opts, + const struct spdk_nvme_probe_info *probe_info, void *devhandle) { struct spdk_pci_device *pci_dev = devhandle; @@ -571,6 +573,8 @@ struct spdk_nvme_ctrlr *nvme_pcie_ctrlr_construct(enum spdk_nvme_transport trans pctrlr->is_remapped = false; pctrlr->ctrlr.transport = SPDK_NVME_TRANSPORT_PCIE; pctrlr->devhandle = devhandle; + pctrlr->ctrlr.opts = *opts; + pctrlr->ctrlr.probe_info = *probe_info; rc = nvme_pcie_ctrlr_allocate_bars(pctrlr); if (rc != 0) { diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index 669a559a9..377f2b58c 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -1077,6 +1077,7 @@ nvme_rdma_ctrlr_scan(enum spdk_nvme_transport transport, { struct spdk_nvme_discover_info *discover_info = devhandle; struct spdk_nvme_probe_info probe_info; + struct spdk_nvme_ctrlr_opts discovery_opts; struct spdk_nvme_ctrlr *discovery_ctrlr; struct spdk_nvmf_discovery_log_page *log_page; union spdk_nvme_cc_register cc; @@ -1084,13 +1085,15 @@ nvme_rdma_ctrlr_scan(enum spdk_nvme_transport transport, int rc; uint32_t i; + spdk_nvme_ctrlr_opts_set_defaults(&discovery_opts); + probe_info.trtype = (uint8_t)transport; snprintf(probe_info.nqn, sizeof(probe_info.nqn), "%s", discover_info->nqn); snprintf(probe_info.traddr, sizeof(probe_info.traddr), "%s", discover_info->traddr); snprintf(probe_info.trsvcid, sizeof(probe_info.trsvcid), "%s", discover_info->trsvcid); memset(buffer, 0x0, 4096); - discovery_ctrlr = nvme_attach(transport, &probe_info); + discovery_ctrlr = nvme_attach(transport, &discovery_opts, &probe_info, NULL); if (discovery_ctrlr == NULL) { return -1; } @@ -1155,7 +1158,7 @@ nvme_rdma_ctrlr_scan(enum spdk_nvme_transport transport, SPDK_TRACELOG(SPDK_TRACE_DEBUG, "nqn=%s, trtype=%u, traddr=%s, trsvcid=%s\n", probe_info.nqn, probe_info.trtype, probe_info.traddr, probe_info.trsvcid); /* Todo: need to differentiate the NVMe over fabrics to avoid duplicated connection */ - nvme_probe_one(entry->trtype, probe_cb, cb_ctx, &probe_info, &probe_info); + nvme_probe_one(entry->trtype, probe_cb, cb_ctx, &probe_info, NULL); } nvme_ctrlr_destruct(discovery_ctrlr); @@ -1163,19 +1166,14 @@ nvme_rdma_ctrlr_scan(enum spdk_nvme_transport transport, } struct spdk_nvme_ctrlr *nvme_rdma_ctrlr_construct(enum spdk_nvme_transport transport, + const struct spdk_nvme_ctrlr_opts *opts, + const struct spdk_nvme_probe_info *probe_info, void *devhandle) { struct nvme_rdma_ctrlr *rctrlr; - struct spdk_nvme_probe_info *probe_info; union spdk_nvme_cap_register cap; int rc; - if (!devhandle) { - SPDK_ERRLOG("devhandle is NULL\n"); - return NULL; - } - - probe_info = devhandle; rctrlr = calloc(1, sizeof(struct nvme_rdma_ctrlr)); if (rctrlr == NULL) { SPDK_ERRLOG("could not allocate ctrlr\n"); @@ -1183,6 +1181,7 @@ struct spdk_nvme_ctrlr *nvme_rdma_ctrlr_construct(enum spdk_nvme_transport trans } rctrlr->ctrlr.transport = SPDK_NVME_TRANSPORT_RDMA; + rctrlr->ctrlr.opts = *opts; rctrlr->ctrlr.probe_info = *probe_info; rc = nvme_ctrlr_construct(&rctrlr->ctrlr); diff --git a/lib/nvme/nvme_transport.c b/lib/nvme/nvme_transport.c index 4574375d8..6ae5cb7b8 100644 --- a/lib/nvme/nvme_transport.c +++ b/lib/nvme/nvme_transport.c @@ -85,9 +85,11 @@ spdk_nvme_transport_available(enum spdk_nvmf_trtype trtype) } struct spdk_nvme_ctrlr *nvme_transport_ctrlr_construct(enum spdk_nvme_transport transport, + const struct spdk_nvme_ctrlr_opts *opts, + const struct spdk_nvme_probe_info *probe_info, void *devhandle) { - NVME_TRANSPORT_CALL(transport, ctrlr_construct, (transport, devhandle)); + NVME_TRANSPORT_CALL(transport, ctrlr_construct, (transport, opts, probe_info, devhandle)); } int diff --git a/test/lib/nvme/unit/nvme_c/nvme_ut.c b/test/lib/nvme/unit/nvme_c/nvme_ut.c index ed1654733..6958e1aa7 100644 --- a/test/lib/nvme/unit/nvme_c/nvme_ut.c +++ b/test/lib/nvme/unit/nvme_c/nvme_ut.c @@ -64,6 +64,8 @@ spdk_nvme_transport_available(enum spdk_nvmf_trtype trtype) } struct spdk_nvme_ctrlr *nvme_transport_ctrlr_construct(enum spdk_nvme_transport transport, + const struct spdk_nvme_ctrlr_opts *opts, + const struct spdk_nvme_probe_info *probe_info, void *devhandle) { return NULL; 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 b9a829b71..039cb71b9 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 @@ -62,6 +62,8 @@ struct spdk_nvme_registers g_ut_nvme_regs = {}; __thread int nvme_thread_ioq_index = -1; struct spdk_nvme_ctrlr *nvme_transport_ctrlr_construct(enum spdk_nvme_transport transport, + const struct spdk_nvme_ctrlr_opts *opts, + const struct spdk_nvme_probe_info *probe_info, void *devhandle) { return NULL; diff --git a/test/lib/nvme/unit/nvme_ns_cmd_c/nvme_ns_cmd_ut.c b/test/lib/nvme/unit/nvme_ns_cmd_c/nvme_ns_cmd_ut.c index e505e8945..abcacd5b3 100644 --- a/test/lib/nvme/unit/nvme_ns_cmd_c/nvme_ns_cmd_ut.c +++ b/test/lib/nvme/unit/nvme_ns_cmd_c/nvme_ns_cmd_ut.c @@ -63,6 +63,8 @@ spdk_nvme_transport_available(enum spdk_nvmf_trtype trtype) } struct spdk_nvme_ctrlr *nvme_transport_ctrlr_construct(enum spdk_nvme_transport transport, + const struct spdk_nvme_ctrlr_opts *opts, + const struct spdk_nvme_probe_info *probe_info, void *devhandle) { return NULL;