From 7cd56fb3ed7d004774c381fa372b9a57c0a5ca5a Mon Sep 17 00:00:00 2001 From: Jacek Kalwas Date: Fri, 27 Dec 2019 10:00:09 +0100 Subject: [PATCH] nvmf: align tcp and rdma listen calls Make common code as part of successful return. In rdma check if already listening first. Signed-off-by: Jacek Kalwas Change-Id: Ib0c87ac11db7daff00dc4042c9e0ab20eb7ffd0f Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/478721 Tested-by: SPDK CI Jenkins Community-CI: Broadcom SPDK FC-NVMe CI Community-CI: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto --- lib/nvmf/rdma.c | 37 ++++++++++++++++++------------------- lib/nvmf/tcp.c | 18 ++++++------------ 2 files changed, 24 insertions(+), 31 deletions(-) diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index 8781a9091..62b44db43 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -2627,16 +2627,26 @@ spdk_nvmf_rdma_listen(struct spdk_nvmf_transport *transport, { struct spdk_nvmf_rdma_transport *rtransport; struct spdk_nvmf_rdma_device *device; - struct spdk_nvmf_rdma_port *port_tmp, *port; + struct spdk_nvmf_rdma_port *port; struct addrinfo *res; struct addrinfo hints; int family; int rc; rtransport = SPDK_CONTAINEROF(transport, struct spdk_nvmf_rdma_transport, transport); + assert(rtransport->event_channel != NULL); + + pthread_mutex_lock(&rtransport->lock); + TAILQ_FOREACH(port, &rtransport->ports, link) { + if (spdk_nvme_transport_id_compare(&port->trid, trid) == 0) { + goto success; + } + } port = calloc(1, sizeof(*port)); if (!port) { + SPDK_ERRLOG("Port allocation failed\n"); + pthread_mutex_unlock(&rtransport->lock); return -ENOMEM; } @@ -2658,6 +2668,7 @@ 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; } @@ -2671,22 +2682,10 @@ 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"); @@ -2739,14 +2738,14 @@ spdk_nvmf_rdma_listen(struct spdk_nvmf_transport *transport, return -EINVAL; } - SPDK_INFOLOG(SPDK_LOG_RDMA, "*** NVMf Target Listening on %s port %d ***\n", - port->trid.traddr, ntohs(rdma_get_src_port(port->id))); - - port->ref = 1; + SPDK_NOTICELOG("*** NVMe/RDMA Target Listening on %s port %s ***\n", + trid->traddr, trid->trsvcid); TAILQ_INSERT_TAIL(&rtransport->ports, port, link); - pthread_mutex_unlock(&rtransport->lock); +success: + port->ref++; + pthread_mutex_unlock(&rtransport->lock); return 0; } diff --git a/lib/nvmf/tcp.c b/lib/nvmf/tcp.c index 0bbf525fc..69de02007 100644 --- a/lib/nvmf/tcp.c +++ b/lib/nvmf/tcp.c @@ -663,26 +663,18 @@ spdk_nvmf_tcp_listen(struct spdk_nvmf_transport *transport, } pthread_mutex_lock(&ttransport->lock); - port = _spdk_nvmf_tcp_find_port(ttransport, trid); if (port) { - SPDK_DEBUGLOG(SPDK_LOG_NVMF_TCP, "Already listening on %s port %s\n", - trid->traddr, trid->trsvcid); - port->ref++; - pthread_mutex_unlock(&ttransport->lock); - return 0; + goto success; } port = calloc(1, sizeof(*port)); if (!port) { SPDK_ERRLOG("Port allocation failed\n"); - free(port); pthread_mutex_unlock(&ttransport->lock); return -ENOMEM; } - port->ref = 1; - if (_spdk_nvmf_tcp_canon_listen_trid(&port->trid, trid) != 0) { SPDK_ERRLOG("Invalid traddr %s / trsvcid %s\n", trid->traddr, trid->trsvcid); @@ -718,12 +710,14 @@ spdk_nvmf_tcp_listen(struct spdk_nvmf_transport *transport, return -EINVAL; } - SPDK_NOTICELOG("*** NVMe/TCP Target Listening on %s port %d ***\n", - trid->traddr, trsvcid_int); + SPDK_NOTICELOG("*** NVMe/TCP Target Listening on %s port %s ***\n", + trid->traddr, trid->trsvcid); TAILQ_INSERT_TAIL(&ttransport->ports, port, link); - pthread_mutex_unlock(&ttransport->lock); +success: + port->ref++; + pthread_mutex_unlock(&ttransport->lock); return 0; }