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 <jacek.kalwas@intel.com> Change-Id: Idbb36d51ad4ef7ef81051463f56efc87ef00c966 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/462054 Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com> Reviewed-by: Changpeng Liu <changpeng.liu@intel.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
parent
0d4a5f7e69
commit
e95e4028c1
@ -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.traddr, sizeof(port->trid.traddr), "%s", trid->traddr);
|
||||||
snprintf(port->trid.trsvcid, sizeof(port->trid.trsvcid), "%s", trid->trsvcid);
|
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) {
|
switch (port->trid.adrfam) {
|
||||||
case SPDK_NVMF_ADRFAM_IPV4:
|
case SPDK_NVMF_ADRFAM_IPV4:
|
||||||
family = AF_INET;
|
family = AF_INET;
|
||||||
@ -2461,7 +2441,6 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2475,10 +2454,31 @@ 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);
|
||||||
|
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);
|
rc = rdma_bind_addr(port->id, res->ai_addr);
|
||||||
freeaddrinfo(res);
|
freeaddrinfo(res);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user