From cfafcc3eddef23b6a7c7f10ab8df66017ccd55dd Mon Sep 17 00:00:00 2001 From: Ben Walker Date: Wed, 19 Oct 2016 10:03:45 -0700 Subject: [PATCH] nvmf: Init transport before adding listeners Change-Id: I1fbaca75c6b95127ff2b6ac7c0ea0f0a918b9405 Signed-off-by: Ben Walker --- app/nvmf_tgt/nvmf_tgt.c | 8 +------- include/spdk/nvmf.h | 2 -- lib/nvmf/nvmf.c | 14 ++++++++++++++ lib/nvmf/rdma.c | 34 ++++++++++++++++++---------------- lib/nvmf/transport.h | 3 +++ 5 files changed, 36 insertions(+), 25 deletions(-) diff --git a/app/nvmf_tgt/nvmf_tgt.c b/app/nvmf_tgt/nvmf_tgt.c index 49358839a..503f1f649 100644 --- a/app/nvmf_tgt/nvmf_tgt.c +++ b/app/nvmf_tgt/nvmf_tgt.c @@ -118,7 +118,7 @@ shutdown_subsystems(void) static void acceptor_poller_unregistered_event(struct spdk_event *event) { - spdk_nvmf_transport_fini(); + nvmf_tgt_fini(); shutdown_subsystems(); } @@ -327,12 +327,6 @@ spdk_nvmf_startup(spdk_event_t event) goto initialize_error; } - rc = spdk_nvmf_transport_init(); - if (rc <= 0) { - SPDK_ERRLOG("Transport initialization failed\n"); - goto initialize_error; - } - spdk_poller_register(&g_acceptor_poller, acceptor_poll, NULL, g_spdk_nvmf_tgt_conf.acceptor_lcore, NULL, g_spdk_nvmf_tgt_conf.acceptor_poll_rate); diff --git a/include/spdk/nvmf.h b/include/spdk/nvmf.h index d67bf96cb..e48c49c34 100644 --- a/include/spdk/nvmf.h +++ b/include/spdk/nvmf.h @@ -192,8 +192,6 @@ spdk_nvmf_subsystem_add_ns(struct spdk_nvmf_subsystem *subsystem, struct spdk_bd int spdk_nvmf_subsystem_set_sn(struct spdk_nvmf_subsystem *subsystem, const char *sn); -int spdk_nvmf_transport_init(void); -int spdk_nvmf_transport_fini(void); const struct spdk_nvmf_transport *spdk_nvmf_transport_get(const char *name); const char *spdk_nvmf_transport_get_name(const struct spdk_nvmf_transport *transport); diff --git a/lib/nvmf/nvmf.c b/lib/nvmf/nvmf.c index 705c2b098..f7d3f8e9b 100644 --- a/lib/nvmf/nvmf.c +++ b/lib/nvmf/nvmf.c @@ -51,6 +51,8 @@ int nvmf_tgt_init(uint16_t max_queue_depth, uint16_t max_queues_per_sess, uint32_t in_capsule_data_size, uint32_t max_io_size) { + int rc; + g_nvmf_tgt.max_queues_per_session = max_queues_per_sess; g_nvmf_tgt.max_queue_depth = max_queue_depth; g_nvmf_tgt.in_capsule_data_size = in_capsule_data_size; @@ -61,9 +63,21 @@ nvmf_tgt_init(uint16_t max_queue_depth, uint16_t max_queues_per_sess, SPDK_TRACELOG(SPDK_TRACE_NVMF, "Max In Capsule Data: %d bytes\n", in_capsule_data_size); SPDK_TRACELOG(SPDK_TRACE_NVMF, "Max I/O Size: %d bytes\n", max_io_size); + rc = spdk_nvmf_transport_init(); + if (rc <= 0) { + SPDK_ERRLOG("Transport initialization failed\n"); + return -1; + } + return 0; } +int +nvmf_tgt_fini(void) +{ + return spdk_nvmf_transport_fini(); +} + SPDK_TRACE_REGISTER_FN(nvmf_trace) { spdk_trace_register_object(OBJECT_NVMF_IO, 'r'); diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index 84452e26b..f7f496fff 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -1038,14 +1038,30 @@ static int spdk_nvmf_rdma_init(uint16_t max_queue_depth, uint32_t max_io_size, uint32_t in_capsule_data_size) { + int rc; + SPDK_NOTICELOG("*** RDMA Transport Init ***\n"); pthread_mutex_lock(&g_rdma.lock); g_rdma.max_queue_depth = max_queue_depth; g_rdma.max_io_size = max_io_size; g_rdma.in_capsule_data_size = in_capsule_data_size; - pthread_mutex_unlock(&g_rdma.lock); + g_rdma.event_channel = rdma_create_event_channel(); + if (g_rdma.event_channel == NULL) { + SPDK_ERRLOG("rdma_create_event_channel() failed\n"); + pthread_mutex_unlock(&g_rdma.lock); + return -1; + } + + rc = fcntl(g_rdma.event_channel->fd, F_SETFL, O_NONBLOCK); + if (rc < 0) { + SPDK_ERRLOG("fcntl to set fd to non-blocking failed\n"); + pthread_mutex_unlock(&g_rdma.lock); + return -1; + } + + pthread_mutex_unlock(&g_rdma.lock); return 0; } @@ -1287,6 +1303,7 @@ spdk_nvmf_rdma_listen(struct spdk_nvmf_listen_addr *listen_addr) int rc; pthread_mutex_lock(&g_rdma.lock); + assert(g_rdma.event_channel != NULL); TAILQ_FOREACH(addr, &g_rdma.listen_addrs, link) { if ((!strcasecmp(addr->traddr, listen_addr->traddr)) && (!strcasecmp(addr->trsvcid, listen_addr->trsvcid))) { @@ -1295,21 +1312,6 @@ spdk_nvmf_rdma_listen(struct spdk_nvmf_listen_addr *listen_addr) return 0; } } - if (g_rdma.event_channel == NULL) { - g_rdma.event_channel = rdma_create_event_channel(); - if (g_rdma.event_channel == NULL) { - SPDK_ERRLOG("rdma_create_event_channel() failed\n"); - pthread_mutex_unlock(&g_rdma.lock); - return -1; - } - - rc = fcntl(g_rdma.event_channel->fd, F_SETFL, O_NONBLOCK); - if (rc < 0) { - SPDK_ERRLOG("fcntl to set fd to non-blocking failed\n"); - pthread_mutex_unlock(&g_rdma.lock); - return -1; - } - } addr = calloc(1, sizeof(*addr)); if (!addr) { diff --git a/lib/nvmf/transport.h b/lib/nvmf/transport.h index 48c0650c9..094646b47 100644 --- a/lib/nvmf/transport.h +++ b/lib/nvmf/transport.h @@ -107,6 +107,9 @@ struct spdk_nvmf_transport { int (*conn_poll)(struct spdk_nvmf_conn *conn); }; +int spdk_nvmf_transport_init(void); +int spdk_nvmf_transport_fini(void); + extern const struct spdk_nvmf_transport spdk_nvmf_transport_rdma; #endif /* SPDK_NVMF_TRANSPORT_H */