From e95e4028c12172fccd86ecba262b80776d21fde2 Mon Sep 17 00:00:00 2001 From: Jacek Kalwas Date: Tue, 16 Jul 2019 22:37:44 +0200 Subject: [PATCH] nvmf/rdma: exclude getaddrinfo from lock No need to have it under lock. Additionally in case of failure there was a lack of rdma_destroy_id(). This is addresed within this change as well. Signed-off-by: Jacek Kalwas Change-Id: Idbb36d51ad4ef7ef81051463f56efc87ef00c966 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/462054 Reviewed-by: Darek Stojaczyk Reviewed-by: Changpeng Liu Tested-by: SPDK CI Jenkins --- lib/nvmf/rdma.c | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index 74e71a4f2..4f759e117 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -2431,26 +2431,6 @@ spdk_nvmf_rdma_listen(struct spdk_nvmf_transport *transport, snprintf(port->trid.traddr, sizeof(port->trid.traddr), "%s", trid->traddr); snprintf(port->trid.trsvcid, sizeof(port->trid.trsvcid), "%s", trid->trsvcid); - pthread_mutex_lock(&rtransport->lock); - assert(rtransport->event_channel != NULL); - TAILQ_FOREACH(port_tmp, &rtransport->ports, link) { - if (spdk_nvme_transport_id_compare(&port_tmp->trid, &port->trid) == 0) { - port_tmp->ref++; - free(port); - /* Already listening at this address */ - pthread_mutex_unlock(&rtransport->lock); - return 0; - } - } - - rc = rdma_create_id(rtransport->event_channel, &port->id, port, RDMA_PS_TCP); - if (rc < 0) { - SPDK_ERRLOG("rdma_create_id() failed\n"); - free(port); - pthread_mutex_unlock(&rtransport->lock); - return rc; - } - switch (port->trid.adrfam) { case SPDK_NVMF_ADRFAM_IPV4: family = AF_INET; @@ -2461,7 +2441,6 @@ spdk_nvmf_rdma_listen(struct spdk_nvmf_transport *transport, default: SPDK_ERRLOG("Unhandled ADRFAM %d\n", port->trid.adrfam); free(port); - pthread_mutex_unlock(&rtransport->lock); return -EINVAL; } @@ -2475,10 +2454,31 @@ spdk_nvmf_rdma_listen(struct spdk_nvmf_transport *transport, if (rc) { SPDK_ERRLOG("getaddrinfo failed: %s (%d)\n", gai_strerror(rc), rc); free(port); - pthread_mutex_unlock(&rtransport->lock); return -EINVAL; } + pthread_mutex_lock(&rtransport->lock); + assert(rtransport->event_channel != NULL); + TAILQ_FOREACH(port_tmp, &rtransport->ports, link) { + if (spdk_nvme_transport_id_compare(&port_tmp->trid, &port->trid) == 0) { + port_tmp->ref++; + freeaddrinfo(res); + free(port); + /* Already listening at this address */ + pthread_mutex_unlock(&rtransport->lock); + return 0; + } + } + + rc = rdma_create_id(rtransport->event_channel, &port->id, port, RDMA_PS_TCP); + if (rc < 0) { + SPDK_ERRLOG("rdma_create_id() failed\n"); + freeaddrinfo(res); + free(port); + pthread_mutex_unlock(&rtransport->lock); + return rc; + } + rc = rdma_bind_addr(port->id, res->ai_addr); freeaddrinfo(res);