nvmf: Init transport before adding listeners

Change-Id: I1fbaca75c6b95127ff2b6ac7c0ea0f0a918b9405
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Ben Walker 2016-10-19 10:03:45 -07:00 committed by Daniel Verkamp
parent 6a78645bae
commit cfafcc3edd
5 changed files with 36 additions and 25 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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');

View File

@ -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) {

View File

@ -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 */