From 4af9f06c73536a6ef715c01815e16e5a8d180aba Mon Sep 17 00:00:00 2001 From: Ben Walker Date: Wed, 30 Nov 2016 14:57:00 -0700 Subject: [PATCH] nvme: Rename discover_info to transport_id This is a small step toward making discovery more like scanning a local PCI bus. Change-Id: Ie7149ad060f2eeb56939b1241187bdf09681f2aa Signed-off-by: Ben Walker --- examples/nvme/identify/identify.c | 22 +++---- examples/nvme/perf/perf.c | 12 ++-- include/spdk/nvme.h | 61 +++++++++++++------ lib/nvme/nvme.c | 19 +++--- lib/nvme/nvme_internal.h | 14 ----- lib/nvme/nvme_rdma.c | 8 +-- lib/nvme/nvme_transport.c | 13 ++-- test/lib/nvme/unit/nvme_c/nvme_ut.c | 2 +- .../nvme/unit/nvme_ns_cmd_c/nvme_ns_cmd_ut.c | 2 +- 9 files changed, 81 insertions(+), 72 deletions(-) diff --git a/examples/nvme/identify/identify.c b/examples/nvme/identify/identify.c index 733807034..b036165fd 100644 --- a/examples/nvme/identify/identify.c +++ b/examples/nvme/identify/identify.c @@ -69,7 +69,7 @@ static struct spdk_nvme_intel_marketing_description_page intel_md_page; static bool g_hex_dump = false; -static struct spdk_nvme_discover_info info; +static struct spdk_nvme_transport_id trid; static void hex_dump(const void *data, size_t size) @@ -874,7 +874,7 @@ parse_args(int argc, char **argv) { int op, rc; - info.subnqn = SPDK_NVMF_DISCOVERY_NQN; + trid.subnqn = SPDK_NVMF_DISCOVERY_NQN; while ((op = getopt(argc, argv, "a:n:s:t:xH")) != -1) { switch (op) { @@ -896,13 +896,13 @@ parse_args(int argc, char **argv) #endif break; case 'a': - info.traddr = optarg; + trid.traddr = optarg; break; case 's': - info.trsvcid = optarg; + trid.trsvcid = optarg; break; case 'n': - info.subnqn = optarg; + trid.subnqn = optarg; break; case 'H': default: @@ -911,21 +911,21 @@ parse_args(int argc, char **argv) } } - if (!info.traddr || !info.trsvcid || !info.subnqn) { + if (!trid.traddr || !trid.trsvcid || !trid.subnqn) { return 0; } - if ((strlen(info.traddr) > 255)) { + if ((strlen(trid.traddr) > 255)) { printf("The string len of traddr should <= 255\n"); return 0; } - if (strlen(info.subnqn) >= SPDK_NVMF_NQN_MAX_LEN) { + if (strlen(trid.subnqn) >= SPDK_NVMF_NQN_MAX_LEN) { printf("NQN must be less than %d bytes long\n", SPDK_NVMF_NQN_MAX_LEN); return 0; } - info.trtype = SPDK_NVMF_TRTYPE_RDMA; + trid.trtype = SPDK_NVME_TRANSPORT_RDMA; optind = 1; return 0; @@ -972,8 +972,8 @@ int main(int argc, char **argv) } rc = 0; - if (info.trtype == SPDK_NVMF_TRTYPE_RDMA) { - if (spdk_nvme_discover(&info, NULL, probe_cb, attach_cb, NULL) != 0) { + if (trid.trtype == SPDK_NVME_TRANSPORT_RDMA) { + if (spdk_nvme_discover(&trid, NULL, probe_cb, attach_cb, NULL) != 0) { fprintf(stderr, "spdk_nvme_probe() failed\n"); } } diff --git a/examples/nvme/perf/perf.c b/examples/nvme/perf/perf.c index 319340b39..426fb4d29 100644 --- a/examples/nvme/perf/perf.c +++ b/examples/nvme/perf/perf.c @@ -1009,7 +1009,7 @@ attach_cb(void *cb_ctx, const struct spdk_nvme_probe_info *probe_info, static int register_controllers(void) { - struct spdk_nvme_discover_info info; + struct spdk_nvme_transport_id trid; char *p, *p1; int n; @@ -1021,7 +1021,7 @@ register_controllers(void) /* The format of g_nvmf_discover_info should be: TRTYPE:TRADDR:TRVCSID */ if (g_nvmf_discover_info) { - info.subnqn = SPDK_NVMF_DISCOVERY_NQN; + trid.subnqn = SPDK_NVMF_DISCOVERY_NQN; p = (char *)g_nvmf_discover_info; p1 = strchr(p, ':'); @@ -1041,7 +1041,7 @@ register_controllers(void) fprintf(stderr, "wrong transport type \n"); return 0; } - info.trtype = SPDK_NVMF_TRTYPE_RDMA; + trid.trtype = SPDK_NVME_TRANSPORT_RDMA; p = (char *)p1 + 1; p1 = strchr(p, ':'); @@ -1056,11 +1056,11 @@ register_controllers(void) return 0; } p[n] = '\0'; - info.traddr = p; + trid.traddr = p; p = (char *)p1 + 1; - info.trsvcid = p; - if (spdk_nvme_discover(&info, NULL, probe_cb, attach_cb, NULL) != 0) { + trid.trsvcid = p; + if (spdk_nvme_discover(&trid, NULL, probe_cb, attach_cb, NULL) != 0) { fprintf(stderr, "spdk_nvme_discover() failed\n"); } } diff --git a/include/spdk/nvme.h b/include/spdk/nvme.h index 3b15c01da..33c22d09a 100644 --- a/include/spdk/nvme.h +++ b/include/spdk/nvme.h @@ -110,32 +110,56 @@ struct spdk_nvme_ctrlr_opts { }; /** - * NVMe over Fabrics discovery parameters. + * NVMe library transports * - * This structure must be provided when connecting to remote NVMe controllers via NVMe over Fabrics. + * NOTE: These are mapped directly to the NVMe over Fabrics TRTYPE values, except for PCIe, + * which is a special case since NVMe over Fabrics does not define a TRTYPE for local PCIe. + * + * Currently, this uses 256 for PCIe which is intentionally outside of the 8-bit range of TRTYPE. + * If the NVMe-oF specification ever defines a PCIe TRTYPE, this should be updated. */ -struct spdk_nvme_discover_info { +enum spdk_nvme_transport_type { + /** + * PCIe Transport (locally attached devices) + */ + SPDK_NVME_TRANSPORT_PCIE = 256, + + /** + * RDMA Transport (RoCE, iWARP, etc.) + */ + SPDK_NVME_TRANSPORT_RDMA = SPDK_NVMF_TRTYPE_RDMA, +}; + +/** + * NVMe transport identifier. + * + * This identifies a unique endpoint on an NVMe fabric. + */ +struct spdk_nvme_transport_id { /** * NVMe over Fabrics transport type. */ - enum spdk_nvmf_trtype trtype; + enum spdk_nvme_transport_type trtype; /** - * Subsystem NQN of the NVMe over Fabrics discovery service. - */ - const char *subnqn; - - /** - * Transport address of the NVMe over Fabrics discovery service. For transports which use IP - * addressing (e.g. RDMA), this should be an IP-based address. + * Transport address of the NVMe-oF endpoint. For transports which use IP + * addressing (e.g. RDMA), this should be an IP address. For PCIe, this + * can either be NULL (the whole bus) or a PCI address in the format + * DDDD:BB:DD.FF */ const char *traddr; /** - * Specifiy the transport service identifier. For transports which use IP addressing - * (e.g. RDMA), this field shoud be the port number. + * Transport service id of the NVMe-oF endpoint. For transports which use + * IP addressing (e.g. RDMA), this field shoud be the port number. For PCIe, + * this is always NULL. */ const char *trsvcid; + + /** + * Subsystem NQN of the NVMe over Fabrics endpoint. May be NULL. + */ + const char *subnqn; }; /** @@ -190,7 +214,7 @@ struct spdk_nvme_probe_info { * * \return true if trtype is supported or false if it is not supported. */ -bool spdk_nvme_transport_available(enum spdk_nvmf_trtype trtype); +bool spdk_nvme_transport_available(enum spdk_nvme_transport_type trtype); /** * Callback for spdk_nvme_probe() enumeration. @@ -229,10 +253,10 @@ typedef void (*spdk_nvme_attach_cb)(void *cb_ctx, const struct spdk_nvme_probe_i typedef void (*spdk_nvme_remove_cb)(void *cb_ctx, struct spdk_nvme_ctrlr *ctrlr); /** - * \brief discover the remote Controller via NVMe over fabrics protocol + * \brief Perform a device discovery using the discovery service specified by trid. * + * \param trid The address of the discovery service on which to perform the discovery. * \param cb_ctx Opaque value which will be passed back in cb_ctx parameter of the callbacks. - * \param info which specifies the info used to discover the NVMe over fabrics target. * \param probe_cb will be called once per NVMe device found in the system. * \param attach_cb will be called for devices for which probe_cb returned true once that NVMe * controller has been attached to the userspace driver. @@ -241,8 +265,9 @@ typedef void (*spdk_nvme_remove_cb)(void *cb_ctx, struct spdk_nvme_ctrlr *ctrlr) * desired. * */ -int spdk_nvme_discover(const struct spdk_nvme_discover_info *info, - void *cb_ctx, spdk_nvme_probe_cb probe_cb, +int spdk_nvme_discover(const struct spdk_nvme_transport_id *trid, + void *cb_ctx, + spdk_nvme_probe_cb probe_cb, spdk_nvme_attach_cb attach_cb, spdk_nvme_remove_cb remove_cb); diff --git a/lib/nvme/nvme.c b/lib/nvme/nvme.c index 274531b1e..0ad5d7bd7 100644 --- a/lib/nvme/nvme.c +++ b/lib/nvme/nvme.c @@ -410,7 +410,7 @@ nvme_attach_one(void *cb_ctx, spdk_nvme_probe_cb probe_cb, spdk_nvme_attach_cb a } static int -_spdk_nvme_probe(const struct spdk_nvme_discover_info *info, void *cb_ctx, +_spdk_nvme_probe(const struct spdk_nvme_transport_id *trid, void *cb_ctx, spdk_nvme_probe_cb probe_cb, spdk_nvme_attach_cb attach_cb, spdk_nvme_remove_cb remove_cb) { @@ -432,19 +432,19 @@ _spdk_nvme_probe(const struct spdk_nvme_discover_info *info, void *cb_ctx, } } - if (!info) { + if (!trid) { trtype = SPDK_NVME_TRANSPORT_PCIE; } else { - if (!spdk_nvme_transport_available(info->trtype)) { - SPDK_ERRLOG("NVMe over Fabrics trtype %u not available\n", info->trtype); + if (!spdk_nvme_transport_available(trid->trtype)) { + SPDK_ERRLOG("NVMe over Fabrics trtype %u not available\n", trid->trtype); nvme_robust_mutex_unlock(&g_spdk_nvme_driver->lock); return -1; } - trtype = (uint8_t)info->trtype; + trtype = (uint8_t)trid->trtype; } - nvme_transport_ctrlr_scan(trtype, probe_cb, cb_ctx, (void *)info, NULL); + nvme_transport_ctrlr_scan(trtype, probe_cb, cb_ctx, (void *)trid, NULL); if (!spdk_process_is_primary()) { TAILQ_FOREACH(ctrlr, &g_spdk_nvme_driver->attached_ctrlrs, tailq) { @@ -474,16 +474,17 @@ _spdk_nvme_probe(const struct spdk_nvme_discover_info *info, void *cb_ctx, return rc; } -int spdk_nvme_discover(const struct spdk_nvme_discover_info *info, void *cb_ctx, +int spdk_nvme_discover(const struct spdk_nvme_transport_id *trid, + void *cb_ctx, spdk_nvme_probe_cb probe_cb, spdk_nvme_attach_cb attach_cb, spdk_nvme_remove_cb remove_cb) { - if (!info || !info->traddr || !info->trsvcid || !info->subnqn) { + if (!trid || !trid->traddr || !trid->trsvcid || !trid->subnqn) { return -1; } - return _spdk_nvme_probe(info, cb_ctx, probe_cb, attach_cb, remove_cb); + return _spdk_nvme_probe(trid, cb_ctx, probe_cb, attach_cb, remove_cb); } static int diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index 3174e3b82..33c849f2d 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -222,20 +222,6 @@ struct nvme_request { void *user_buffer; }; -/* - * NVMe library transports - * - * NOTE: These are mapped directly to the NVMe over Fabrics TRTYPE values, except for PCIe, - * which is a special case since NVMe over Fabrics does not define a TRTYPE for local PCIe. - * - * Currently, this uses 0 for PCIe since it is reserved by NVMe-oF. If 0 is ever assigned as a - * valid TRTYPE, this would need to be changed. - */ -enum spdk_nvme_transport_type { - SPDK_NVME_TRANSPORT_PCIE = 0, - SPDK_NVME_TRANSPORT_RDMA = SPDK_NVMF_TRTYPE_RDMA, -}; - struct nvme_completion_poll_status { struct spdk_nvme_cpl cpl; bool done; diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index 1e87c3a71..0f8668732 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -1048,7 +1048,7 @@ nvme_rdma_ctrlr_scan(enum spdk_nvme_transport_type trtype, spdk_nvme_probe_cb probe_cb, void *cb_ctx, void *devhandle, void *pci_address) { - struct spdk_nvme_discover_info *discover_info = devhandle; + struct spdk_nvme_transport_id *trid = devhandle; struct spdk_nvme_probe_info probe_info; struct spdk_nvme_ctrlr_opts discovery_opts; struct spdk_nvme_ctrlr *discovery_ctrlr; @@ -1063,9 +1063,9 @@ nvme_rdma_ctrlr_scan(enum spdk_nvme_transport_type trtype, discovery_opts.keep_alive_timeout_ms = 0; probe_info.trtype = (uint8_t)trtype; - snprintf(probe_info.subnqn, sizeof(probe_info.subnqn), "%s", discover_info->subnqn); - snprintf(probe_info.traddr, sizeof(probe_info.traddr), "%s", discover_info->traddr); - snprintf(probe_info.trsvcid, sizeof(probe_info.trsvcid), "%s", discover_info->trsvcid); + snprintf(probe_info.subnqn, sizeof(probe_info.subnqn), "%s", trid->subnqn); + snprintf(probe_info.traddr, sizeof(probe_info.traddr), "%s", trid->traddr); + snprintf(probe_info.trsvcid, sizeof(probe_info.trsvcid), "%s", trid->trsvcid); memset(buffer, 0x0, 4096); discovery_ctrlr = nvme_attach(trtype, &discovery_opts, &probe_info, NULL); diff --git a/lib/nvme/nvme_transport.c b/lib/nvme/nvme_transport.c index e47bfb21a..416434233 100644 --- a/lib/nvme/nvme_transport.c +++ b/lib/nvme/nvme_transport.c @@ -68,17 +68,14 @@ nvme_transport_unknown(enum spdk_nvme_transport_type trtype) } while (0) bool -spdk_nvme_transport_available(enum spdk_nvmf_trtype trtype) +spdk_nvme_transport_available(enum spdk_nvme_transport_type trtype) { switch (trtype) { - case SPDK_NVMF_TRTYPE_RDMA: + case SPDK_NVME_TRANSPORT_PCIE: + return true; + + case SPDK_NVME_TRANSPORT_RDMA: return TRANSPORT_RDMA_AVAILABLE; - - case SPDK_NVMF_TRTYPE_FC: - return false; - - case SPDK_NVMF_TRTYPE_INTRA_HOST: - return false; } return false; diff --git a/test/lib/nvme/unit/nvme_c/nvme_ut.c b/test/lib/nvme/unit/nvme_c/nvme_ut.c index e2d22300c..c679fb4dc 100644 --- a/test/lib/nvme/unit/nvme_c/nvme_ut.c +++ b/test/lib/nvme/unit/nvme_c/nvme_ut.c @@ -56,7 +56,7 @@ spdk_pci_device_get_id(struct spdk_pci_device *pci_dev) } bool -spdk_nvme_transport_available(enum spdk_nvmf_trtype trtype) +spdk_nvme_transport_available(enum spdk_nvme_transport_type trtype) { return true; } 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 49d993e01..5ac6e65fd 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 @@ -70,7 +70,7 @@ static int nvme_request_next_sge(void *cb_arg, void **address, uint32_t *length) } bool -spdk_nvme_transport_available(enum spdk_nvmf_trtype trtype) +spdk_nvme_transport_available(enum spdk_nvme_transport_type trtype) { return true; }