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);
struct spdk_nvmf_transport_ops {
/**
* Transport name
*/
char name[SPDK_NVMF_TRSTRING_MAX_LEN];
/**
* Transport type
*/
@ -970,25 +975,25 @@ enum spdk_nvmf_subtype spdk_nvmf_subsystem_get_type(struct spdk_nvmf_subsystem *
/**
* 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)
*
* \return bool. true if successful, false if transport type
* not found.
*/
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);
/**
* 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)
*
* \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);
/**

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 = {
.name = "FC",
.type = (enum spdk_nvme_transport_type) SPDK_NVMF_TRTYPE_FC,
.opts_init = nvmf_fc_opts_init,
.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
* 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
* NVMe-oF.
*/
@ -1702,7 +1702,7 @@ spdk_rpc_nvmf_create_transport(struct spdk_jsonrpc_request *request,
return;
}
transport = spdk_nvmf_transport_create(trtype, &ctx->opts);
transport = spdk_nvmf_transport_create(ctx->trtype, &ctx->opts);
if (!transport) {
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 = {
.name = "RDMA",
.type = SPDK_NVME_TRANSPORT_RDMA,
.opts_init = spdk_nvmf_rdma_opts_init,
.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 = {
.name = "TCP",
.type = SPDK_NVME_TRANSPORT_TCP,
.opts_init = spdk_nvmf_tcp_opts_init,
.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
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;
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];
}
}
@ -80,32 +80,29 @@ spdk_nvmf_get_transport_type(struct spdk_nvmf_transport *transport)
}
struct spdk_nvmf_transport *
spdk_nvmf_transport_create(enum spdk_nvme_transport_type type,
struct spdk_nvmf_transport_opts *opts)
spdk_nvmf_transport_create(const char *transport_name, struct spdk_nvmf_transport_opts *opts)
{
const struct spdk_nvmf_transport_ops *ops = NULL;
struct spdk_nvmf_transport *transport;
char spdk_mempool_name[MAX_MEMPOOL_NAME_LENGTH];
int chars_written;
ops = spdk_nvmf_get_transport_ops(type);
ops = spdk_nvmf_get_transport_ops(transport_name);
if (!ops) {
SPDK_ERRLOG("Transport type '%s' unavailable.\n",
spdk_nvme_transport_id_trtype_str(type));
SPDK_ERRLOG("Transport type '%s' unavailable.\n", transport_name);
return NULL;
}
transport = ops->create(opts);
if (!transport) {
SPDK_ERRLOG("Unable to create new transport of type %s\n",
spdk_nvme_transport_id_trtype_str(type));
SPDK_ERRLOG("Unable to create new transport of type %s\n", transport_name);
return NULL;
}
transport->ops = ops;
transport->opts = *opts;
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) {
SPDK_ERRLOG("Unable to generate transport data buffer pool name.\n");
ops->destroy(transport);
@ -318,15 +315,14 @@ spdk_nvmf_transport_qpair_get_listen_trid(struct spdk_nvmf_qpair *qpair,
}
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)
{
const struct spdk_nvmf_transport_ops *ops;
ops = spdk_nvmf_get_transport_ops(type);
ops = spdk_nvmf_get_transport_ops(transport_name);
if (!ops) {
SPDK_ERRLOG("Transport type %s unavailable.\n",
spdk_nvme_transport_id_trtype_str(type));
SPDK_ERRLOG("Transport type %s unavailable.\n", transport_name);
return false;
}

View File

@ -592,7 +592,7 @@ spdk_nvmf_parse_transport(struct spdk_nvmf_parse_transport_ctx *ctx)
return;
}
if (!spdk_nvmf_transport_opts_init(trtype, &opts)) {
if (!spdk_nvmf_transport_opts_init(type, &opts)) {
ctx->cb_fn(-1);
free(ctx);
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);
opts.dif_insert_or_strip = bval;
transport = spdk_nvmf_transport_create(trtype, &opts);
transport = spdk_nvmf_transport_create(type, &opts);
if (transport) {
spdk_nvmf_tgt_add_transport(g_spdk_nvmf_tgt, transport, spdk_nvmf_tgt_add_transport_done, ctx);
} else {

View File

@ -95,10 +95,10 @@ spdk_nvmf_transport_listener_discover(struct spdk_nvmf_transport *transport,
static struct spdk_nvmf_transport g_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)
{
if (type == SPDK_NVME_TRANSPORT_RDMA) {
if (strcasecmp(transport_name, spdk_nvme_transport_id_trtype_str(SPDK_NVME_TRANSPORT_RDMA))) {
return &g_transport;
}

View File

@ -282,8 +282,7 @@ create_transport_test(void)
ops->opts_init(&opts);
g_lld_init_called = false;
g_nvmf_tprt = spdk_nvmf_transport_create((enum spdk_nvme_transport_type) SPDK_NVMF_TRTYPE_FC,
&opts);
g_nvmf_tprt = spdk_nvmf_transport_create("FC", &opts);
SPDK_CU_ASSERT_FATAL(g_nvmf_tprt != NULL);
CU_ASSERT(g_lld_init_called == true);
@ -307,16 +306,14 @@ create_transport_test(void)
/* create transport with bad args/options */
#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
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;
CU_ASSERT(spdk_nvmf_transport_create((enum spdk_nvme_transport_type) SPDK_NVMF_TRTYPE_FC,
&opts) == NULL);
CU_ASSERT(spdk_nvmf_transport_create("FC", &opts) == NULL);
opts.max_io_size = 999;
opts.io_unit_size = 1024;
CU_ASSERT(spdk_nvmf_transport_create((enum spdk_nvme_transport_type) SPDK_NVMF_TRTYPE_FC,
&opts) == NULL);
CU_ASSERT(spdk_nvmf_transport_create("FC", &opts) == NULL);
}
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 = {};
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)
{
if (type == SPDK_NVME_TRANSPORT_RDMA) {
if (strcasecmp(transport_name, spdk_nvme_transport_id_trtype_str(SPDK_NVME_TRANSPORT_RDMA))) {
return &g_transport;
}