lib/nvmf: opts_init and transport_create use string now.

This will help enable pluggable NVMe-oF transports.

Signed-off-by: Seth Howell <seth.howell@intel.com>
Change-Id: I1947cc2e6e4ff078609f8bdbbdfefc5b110674c2
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/478753
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Anil Veerabhadrappa <anil.veerabhadrappa@broadcom.com>
This commit is contained in:
Seth Howell 2019-12-23 16:27:35 -07:00 committed by Tomasz Zawadzki
parent d4ea320bb5
commit 5b3e6cd137
10 changed files with 35 additions and 34 deletions

View File

@ -123,6 +123,11 @@ struct spdk_nvmf_transport_poll_group_stat {
typedef void (*new_qpair_fn)(struct spdk_nvmf_qpair *qpair, void *cb_arg); typedef void (*new_qpair_fn)(struct spdk_nvmf_qpair *qpair, void *cb_arg);
struct spdk_nvmf_transport_ops { struct spdk_nvmf_transport_ops {
/**
* Transport name
*/
char name[SPDK_NVMF_TRSTRING_MAX_LEN];
/** /**
* Transport type * Transport type
*/ */
@ -970,25 +975,25 @@ enum spdk_nvmf_subtype spdk_nvmf_subsystem_get_type(struct spdk_nvmf_subsystem *
/** /**
* Initialize transport options * Initialize transport options
* *
* \param type The transport type to create * \param transport_name The transport type to create
* \param opts The transport options (e.g. max_io_size) * \param opts The transport options (e.g. max_io_size)
* *
* \return bool. true if successful, false if transport type * \return bool. true if successful, false if transport type
* not found. * not found.
*/ */
bool bool
spdk_nvmf_transport_opts_init(enum spdk_nvme_transport_type type, spdk_nvmf_transport_opts_init(const char *transport_name,
struct spdk_nvmf_transport_opts *opts); struct spdk_nvmf_transport_opts *opts);
/** /**
* Create a protocol transport * Create a protocol transport
* *
* \param type The transport type to create * \param transport_name The transport type to create
* \param opts The transport options (e.g. max_io_size) * \param opts The transport options (e.g. max_io_size)
* *
* \return new transport or NULL if create fails * \return new transport or NULL if create fails
*/ */
struct spdk_nvmf_transport *spdk_nvmf_transport_create(enum spdk_nvme_transport_type type, struct spdk_nvmf_transport *spdk_nvmf_transport_create(const char *transport_name,
struct spdk_nvmf_transport_opts *opts); struct spdk_nvmf_transport_opts *opts);
/** /**

View File

@ -2140,6 +2140,7 @@ nvmf_fc_qpair_get_listen_trid(struct spdk_nvmf_qpair *qpair,
} }
const struct spdk_nvmf_transport_ops spdk_nvmf_transport_fc = { const struct spdk_nvmf_transport_ops spdk_nvmf_transport_fc = {
.name = "FC",
.type = (enum spdk_nvme_transport_type) SPDK_NVMF_TRTYPE_FC, .type = (enum spdk_nvme_transport_type) SPDK_NVMF_TRTYPE_FC,
.opts_init = nvmf_fc_opts_init, .opts_init = nvmf_fc_opts_init,
.create = nvmf_fc_create, .create = nvmf_fc_create,

View File

@ -1674,7 +1674,7 @@ spdk_rpc_nvmf_create_transport(struct spdk_jsonrpc_request *request,
/* Initialize all the transport options (based on transport type) and decode the /* Initialize all the transport options (based on transport type) and decode the
* parameters again to update any options passed in rpc create transport call. * parameters again to update any options passed in rpc create transport call.
*/ */
if (!spdk_nvmf_transport_opts_init(trtype, &ctx->opts)) { if (!spdk_nvmf_transport_opts_init(ctx->trtype, &ctx->opts)) {
/* This can happen if user specifies PCIE transport type which isn't valid for /* This can happen if user specifies PCIE transport type which isn't valid for
* NVMe-oF. * NVMe-oF.
*/ */
@ -1702,7 +1702,7 @@ spdk_rpc_nvmf_create_transport(struct spdk_jsonrpc_request *request,
return; return;
} }
transport = spdk_nvmf_transport_create(trtype, &ctx->opts); transport = spdk_nvmf_transport_create(ctx->trtype, &ctx->opts);
if (!transport) { if (!transport) {
SPDK_ERRLOG("Transport type '%s' create failed\n", ctx->trtype); SPDK_ERRLOG("Transport type '%s' create failed\n", ctx->trtype);

View File

@ -4080,6 +4080,7 @@ spdk_nvmf_rdma_poll_group_free_stat(struct spdk_nvmf_transport_poll_group_stat *
} }
const struct spdk_nvmf_transport_ops spdk_nvmf_transport_rdma = { const struct spdk_nvmf_transport_ops spdk_nvmf_transport_rdma = {
.name = "RDMA",
.type = SPDK_NVME_TRANSPORT_RDMA, .type = SPDK_NVME_TRANSPORT_RDMA,
.opts_init = spdk_nvmf_rdma_opts_init, .opts_init = spdk_nvmf_rdma_opts_init,
.create = spdk_nvmf_rdma_create, .create = spdk_nvmf_rdma_create,

View File

@ -2743,6 +2743,7 @@ spdk_nvmf_tcp_opts_init(struct spdk_nvmf_transport_opts *opts)
} }
const struct spdk_nvmf_transport_ops spdk_nvmf_transport_tcp = { const struct spdk_nvmf_transport_ops spdk_nvmf_transport_tcp = {
.name = "TCP",
.type = SPDK_NVME_TRANSPORT_TCP, .type = SPDK_NVME_TRANSPORT_TCP,
.opts_init = spdk_nvmf_tcp_opts_init, .opts_init = spdk_nvmf_tcp_opts_init,
.create = spdk_nvmf_tcp_create, .create = spdk_nvmf_tcp_create,

View File

@ -56,11 +56,11 @@ static const struct spdk_nvmf_transport_ops *const g_transport_ops[] = {
#define MAX_MEMPOOL_NAME_LENGTH 40 #define MAX_MEMPOOL_NAME_LENGTH 40
static inline const struct spdk_nvmf_transport_ops * static inline const struct spdk_nvmf_transport_ops *
spdk_nvmf_get_transport_ops(enum spdk_nvme_transport_type type) spdk_nvmf_get_transport_ops(const char *transport_name)
{ {
size_t i; size_t i;
for (i = 0; i != NUM_TRANSPORTS; i++) { for (i = 0; i != NUM_TRANSPORTS; i++) {
if (g_transport_ops[i]->type == type) { if (strcasecmp(transport_name, g_transport_ops[i]->name) == 0) {
return g_transport_ops[i]; return g_transport_ops[i];
} }
} }
@ -80,32 +80,29 @@ spdk_nvmf_get_transport_type(struct spdk_nvmf_transport *transport)
} }
struct spdk_nvmf_transport * struct spdk_nvmf_transport *
spdk_nvmf_transport_create(enum spdk_nvme_transport_type type, spdk_nvmf_transport_create(const char *transport_name, struct spdk_nvmf_transport_opts *opts)
struct spdk_nvmf_transport_opts *opts)
{ {
const struct spdk_nvmf_transport_ops *ops = NULL; const struct spdk_nvmf_transport_ops *ops = NULL;
struct spdk_nvmf_transport *transport; struct spdk_nvmf_transport *transport;
char spdk_mempool_name[MAX_MEMPOOL_NAME_LENGTH]; char spdk_mempool_name[MAX_MEMPOOL_NAME_LENGTH];
int chars_written; int chars_written;
ops = spdk_nvmf_get_transport_ops(type); ops = spdk_nvmf_get_transport_ops(transport_name);
if (!ops) { if (!ops) {
SPDK_ERRLOG("Transport type '%s' unavailable.\n", SPDK_ERRLOG("Transport type '%s' unavailable.\n", transport_name);
spdk_nvme_transport_id_trtype_str(type));
return NULL; return NULL;
} }
transport = ops->create(opts); transport = ops->create(opts);
if (!transport) { if (!transport) {
SPDK_ERRLOG("Unable to create new transport of type %s\n", SPDK_ERRLOG("Unable to create new transport of type %s\n", transport_name);
spdk_nvme_transport_id_trtype_str(type));
return NULL; return NULL;
} }
transport->ops = ops; transport->ops = ops;
transport->opts = *opts; transport->opts = *opts;
chars_written = snprintf(spdk_mempool_name, MAX_MEMPOOL_NAME_LENGTH, "%s_%s_%s", "spdk_nvmf", chars_written = snprintf(spdk_mempool_name, MAX_MEMPOOL_NAME_LENGTH, "%s_%s_%s", "spdk_nvmf",
spdk_nvme_transport_id_trtype_str(type), "data"); transport_name, "data");
if (chars_written < 0) { if (chars_written < 0) {
SPDK_ERRLOG("Unable to generate transport data buffer pool name.\n"); SPDK_ERRLOG("Unable to generate transport data buffer pool name.\n");
ops->destroy(transport); ops->destroy(transport);
@ -318,15 +315,14 @@ spdk_nvmf_transport_qpair_get_listen_trid(struct spdk_nvmf_qpair *qpair,
} }
bool bool
spdk_nvmf_transport_opts_init(enum spdk_nvme_transport_type type, spdk_nvmf_transport_opts_init(const char *transport_name,
struct spdk_nvmf_transport_opts *opts) struct spdk_nvmf_transport_opts *opts)
{ {
const struct spdk_nvmf_transport_ops *ops; const struct spdk_nvmf_transport_ops *ops;
ops = spdk_nvmf_get_transport_ops(type); ops = spdk_nvmf_get_transport_ops(transport_name);
if (!ops) { if (!ops) {
SPDK_ERRLOG("Transport type %s unavailable.\n", SPDK_ERRLOG("Transport type %s unavailable.\n", transport_name);
spdk_nvme_transport_id_trtype_str(type));
return false; return false;
} }

View File

@ -592,7 +592,7 @@ spdk_nvmf_parse_transport(struct spdk_nvmf_parse_transport_ctx *ctx)
return; return;
} }
if (!spdk_nvmf_transport_opts_init(trtype, &opts)) { if (!spdk_nvmf_transport_opts_init(type, &opts)) {
ctx->cb_fn(-1); ctx->cb_fn(-1);
free(ctx); free(ctx);
return; return;
@ -653,7 +653,7 @@ spdk_nvmf_parse_transport(struct spdk_nvmf_parse_transport_ctx *ctx)
bval = spdk_conf_section_get_boolval(ctx->sp, "DifInsertOrStrip", false); bval = spdk_conf_section_get_boolval(ctx->sp, "DifInsertOrStrip", false);
opts.dif_insert_or_strip = bval; opts.dif_insert_or_strip = bval;
transport = spdk_nvmf_transport_create(trtype, &opts); transport = spdk_nvmf_transport_create(type, &opts);
if (transport) { if (transport) {
spdk_nvmf_tgt_add_transport(g_spdk_nvmf_tgt, transport, spdk_nvmf_tgt_add_transport_done, ctx); spdk_nvmf_tgt_add_transport(g_spdk_nvmf_tgt, transport, spdk_nvmf_tgt_add_transport_done, ctx);
} else { } else {

View File

@ -95,10 +95,10 @@ spdk_nvmf_transport_listener_discover(struct spdk_nvmf_transport *transport,
static struct spdk_nvmf_transport g_transport = {}; static struct spdk_nvmf_transport g_transport = {};
struct spdk_nvmf_transport * struct spdk_nvmf_transport *
spdk_nvmf_transport_create(enum spdk_nvme_transport_type type, spdk_nvmf_transport_create(const char *transport_name,
struct spdk_nvmf_transport_opts *tprt_opts) struct spdk_nvmf_transport_opts *tprt_opts)
{ {
if (type == SPDK_NVME_TRANSPORT_RDMA) { if (strcasecmp(transport_name, spdk_nvme_transport_id_trtype_str(SPDK_NVME_TRANSPORT_RDMA))) {
return &g_transport; return &g_transport;
} }

View File

@ -282,8 +282,7 @@ create_transport_test(void)
ops->opts_init(&opts); ops->opts_init(&opts);
g_lld_init_called = false; g_lld_init_called = false;
g_nvmf_tprt = spdk_nvmf_transport_create((enum spdk_nvme_transport_type) SPDK_NVMF_TRTYPE_FC, g_nvmf_tprt = spdk_nvmf_transport_create("FC", &opts);
&opts);
SPDK_CU_ASSERT_FATAL(g_nvmf_tprt != NULL); SPDK_CU_ASSERT_FATAL(g_nvmf_tprt != NULL);
CU_ASSERT(g_lld_init_called == true); CU_ASSERT(g_lld_init_called == true);
@ -307,16 +306,14 @@ create_transport_test(void)
/* create transport with bad args/options */ /* create transport with bad args/options */
#ifndef SPDK_CONFIG_RDMA #ifndef SPDK_CONFIG_RDMA
CU_ASSERT(spdk_nvmf_transport_create(SPDK_NVMF_TRTYPE_RDMA, &opts) == NULL); CU_ASSERT(spdk_nvmf_transport_create("RDMA", &opts) == NULL);
#endif #endif
CU_ASSERT(spdk_nvmf_transport_create(998, &opts) == NULL); CU_ASSERT(spdk_nvmf_transport_create("Bogus Transport", &opts) == NULL);
opts.max_io_size = 1024 ^ 3; opts.max_io_size = 1024 ^ 3;
CU_ASSERT(spdk_nvmf_transport_create((enum spdk_nvme_transport_type) SPDK_NVMF_TRTYPE_FC, CU_ASSERT(spdk_nvmf_transport_create("FC", &opts) == NULL);
&opts) == NULL);
opts.max_io_size = 999; opts.max_io_size = 999;
opts.io_unit_size = 1024; opts.io_unit_size = 1024;
CU_ASSERT(spdk_nvmf_transport_create((enum spdk_nvme_transport_type) SPDK_NVMF_TRTYPE_FC, CU_ASSERT(spdk_nvmf_transport_create("FC", &opts) == NULL);
&opts) == NULL);
} }
static void static void

View File

@ -82,10 +82,10 @@ spdk_nvmf_transport_listener_discover(struct spdk_nvmf_transport *transport,
static struct spdk_nvmf_transport g_transport = {}; static struct spdk_nvmf_transport g_transport = {};
struct spdk_nvmf_transport * struct spdk_nvmf_transport *
spdk_nvmf_transport_create(enum spdk_nvme_transport_type type, spdk_nvmf_transport_create(const char *transport_name,
struct spdk_nvmf_transport_opts *tprt_opts) struct spdk_nvmf_transport_opts *tprt_opts)
{ {
if (type == SPDK_NVME_TRANSPORT_RDMA) { if (strcasecmp(transport_name, spdk_nvme_transport_id_trtype_str(SPDK_NVME_TRANSPORT_RDMA))) {
return &g_transport; return &g_transport;
} }