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 <jacek.kalwas@intel.com>
Change-Id: Ib0c87ac11db7daff00dc4042c9e0ab20eb7ffd0f
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/478721
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com>
Community-CI: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
Jacek Kalwas 2019-12-27 10:00:09 +01:00 committed by Tomasz Zawadzki
parent 29e5c544c0
commit 7cd56fb3ed
2 changed files with 24 additions and 31 deletions

View File

@ -2627,16 +2627,26 @@ spdk_nvmf_rdma_listen(struct spdk_nvmf_transport *transport,
{ {
struct spdk_nvmf_rdma_transport *rtransport; struct spdk_nvmf_rdma_transport *rtransport;
struct spdk_nvmf_rdma_device *device; 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 *res;
struct addrinfo hints; struct addrinfo hints;
int family; int family;
int rc; int rc;
rtransport = SPDK_CONTAINEROF(transport, struct spdk_nvmf_rdma_transport, transport); 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)); port = calloc(1, sizeof(*port));
if (!port) { if (!port) {
SPDK_ERRLOG("Port allocation failed\n");
pthread_mutex_unlock(&rtransport->lock);
return -ENOMEM; return -ENOMEM;
} }
@ -2658,6 +2668,7 @@ spdk_nvmf_rdma_listen(struct spdk_nvmf_transport *transport,
default: default:
SPDK_ERRLOG("Unhandled ADRFAM %d\n", port->trid.adrfam); SPDK_ERRLOG("Unhandled ADRFAM %d\n", port->trid.adrfam);
free(port); free(port);
pthread_mutex_unlock(&rtransport->lock);
return -EINVAL; return -EINVAL;
} }
@ -2671,22 +2682,10 @@ spdk_nvmf_rdma_listen(struct spdk_nvmf_transport *transport,
if (rc) { if (rc) {
SPDK_ERRLOG("getaddrinfo failed: %s (%d)\n", gai_strerror(rc), rc); SPDK_ERRLOG("getaddrinfo failed: %s (%d)\n", gai_strerror(rc), rc);
free(port); free(port);
pthread_mutex_unlock(&rtransport->lock);
return -EINVAL; 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); rc = rdma_create_id(rtransport->event_channel, &port->id, port, RDMA_PS_TCP);
if (rc < 0) { if (rc < 0) {
SPDK_ERRLOG("rdma_create_id() failed\n"); SPDK_ERRLOG("rdma_create_id() failed\n");
@ -2739,14 +2738,14 @@ spdk_nvmf_rdma_listen(struct spdk_nvmf_transport *transport,
return -EINVAL; return -EINVAL;
} }
SPDK_INFOLOG(SPDK_LOG_RDMA, "*** NVMf Target Listening on %s port %d ***\n", SPDK_NOTICELOG("*** NVMe/RDMA Target Listening on %s port %s ***\n",
port->trid.traddr, ntohs(rdma_get_src_port(port->id))); trid->traddr, trid->trsvcid);
port->ref = 1;
TAILQ_INSERT_TAIL(&rtransport->ports, port, link); TAILQ_INSERT_TAIL(&rtransport->ports, port, link);
pthread_mutex_unlock(&rtransport->lock);
success:
port->ref++;
pthread_mutex_unlock(&rtransport->lock);
return 0; return 0;
} }

View File

@ -663,26 +663,18 @@ spdk_nvmf_tcp_listen(struct spdk_nvmf_transport *transport,
} }
pthread_mutex_lock(&ttransport->lock); pthread_mutex_lock(&ttransport->lock);
port = _spdk_nvmf_tcp_find_port(ttransport, trid); port = _spdk_nvmf_tcp_find_port(ttransport, trid);
if (port) { if (port) {
SPDK_DEBUGLOG(SPDK_LOG_NVMF_TCP, "Already listening on %s port %s\n", goto success;
trid->traddr, trid->trsvcid);
port->ref++;
pthread_mutex_unlock(&ttransport->lock);
return 0;
} }
port = calloc(1, sizeof(*port)); port = calloc(1, sizeof(*port));
if (!port) { if (!port) {
SPDK_ERRLOG("Port allocation failed\n"); SPDK_ERRLOG("Port allocation failed\n");
free(port);
pthread_mutex_unlock(&ttransport->lock); pthread_mutex_unlock(&ttransport->lock);
return -ENOMEM; return -ENOMEM;
} }
port->ref = 1;
if (_spdk_nvmf_tcp_canon_listen_trid(&port->trid, trid) != 0) { if (_spdk_nvmf_tcp_canon_listen_trid(&port->trid, trid) != 0) {
SPDK_ERRLOG("Invalid traddr %s / trsvcid %s\n", SPDK_ERRLOG("Invalid traddr %s / trsvcid %s\n",
trid->traddr, trid->trsvcid); trid->traddr, trid->trsvcid);
@ -718,12 +710,14 @@ spdk_nvmf_tcp_listen(struct spdk_nvmf_transport *transport,
return -EINVAL; return -EINVAL;
} }
SPDK_NOTICELOG("*** NVMe/TCP Target Listening on %s port %d ***\n", SPDK_NOTICELOG("*** NVMe/TCP Target Listening on %s port %s ***\n",
trid->traddr, trsvcid_int); trid->traddr, trid->trsvcid);
TAILQ_INSERT_TAIL(&ttransport->ports, port, link); TAILQ_INSERT_TAIL(&ttransport->ports, port, link);
pthread_mutex_unlock(&ttransport->lock);
success:
port->ref++;
pthread_mutex_unlock(&ttransport->lock);
return 0; return 0;
} }