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:
parent
d4ea320bb5
commit
5b3e6cd137
@ -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);
|
||||
|
||||
/**
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user