From 17eebfccb70e05877518c4f1e485ca29f5510464 Mon Sep 17 00:00:00 2001 From: Sean Hefty Date: Fri, 25 May 2012 10:48:47 -0700 Subject: [PATCH] librdmacm: Delay ACM connection until resolving an address Avoid creating a connection to the ACM service when it's not needed. For example, if the user of the librdmacm is a server application, it will not use ACM services. Signed-off-by: Sean Hefty --- src/acm.c | 18 ++++++++++++++---- src/addrinfo.c | 2 +- src/cma.c | 4 +--- src/cma.h | 10 ++++------ 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/acm.c b/src/acm.c index 9c659195..d59efcf8 100755 --- a/src/acm.c +++ b/src/acm.c @@ -86,15 +86,20 @@ static void ucma_set_server_port(void) } } -void ucma_ib_init(void) +void ucma_acm_init(void) { struct sockaddr_in addr; + static int init; int ret; + if (init) + return; + + pthread_mutex_lock(&acm_lock); ucma_set_server_port(); sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock < 0) - return; + goto err1; memset(&addr, 0, sizeof addr); addr.sin_family = AF_INET; @@ -102,13 +107,18 @@ void ucma_ib_init(void) addr.sin_port = htons(server_port); ret = connect(sock, (struct sockaddr *) &addr, sizeof(addr)); if (ret) - goto err; + goto err2; + init = 1; + pthread_mutex_unlock(&acm_lock); return; -err: +err2: close(sock); sock = -1; +err1: + init = 1; + pthread_mutex_unlock(&acm_lock); } void ucma_ib_cleanup(void) diff --git a/src/addrinfo.c b/src/addrinfo.c index 2da35f01..573fb42c 100755 --- a/src/addrinfo.c +++ b/src/addrinfo.c @@ -231,7 +231,7 @@ int rdma_getaddrinfo(char *node, char *service, } if (!(rai->ai_flags & RAI_PASSIVE)) - ucma_ib_resolve(&rai, hints); + ucma_acm_resolve(&rai, hints); *res = rai; return 0; diff --git a/src/cma.c b/src/cma.c index 753612c5..c0cd407d 100755 --- a/src/cma.c +++ b/src/cma.c @@ -128,7 +128,7 @@ int af_ib_support; static void ucma_cleanup(void) { - ucma_ib_cleanup(); + ucma_acm_cleanup(); if (cma_dev_cnt) { while (cma_dev_cnt--) { @@ -274,8 +274,6 @@ int ucma_init(void) ib += (cma_dev->verbs->device->transport_type == IBV_TRANSPORT_IB); } - if (ib) - ucma_ib_init(); cma_dev_cnt = dev_cnt; ucma_set_af_ib_support(); pthread_mutex_unlock(&mut); diff --git a/src/cma.h b/src/cma.h index 2f5215c1..c673bda7 100644 --- a/src/cma.h +++ b/src/cma.h @@ -119,13 +119,11 @@ extern int af_ib_support; #define RAI_ROUTEONLY 0x01000000 #ifdef USE_IB_ACM -void ucma_ib_init(); -void ucma_ib_cleanup(); -void ucma_ib_resolve(struct rdma_addrinfo **rai, struct rdma_addrinfo *hints); +void ucma_acm_cleanup(); +void ucma_acm_resolve(struct rdma_addrinfo **rai, struct rdma_addrinfo *hints); #else -#define ucma_ib_init() -#define ucma_ib_cleanup() -#define ucma_ib_resolve(x, y) +#define ucma_acm_cleanup() +#define ucma_acm_resolve(x, y) #endif /* Define path record definition if using older version of libibverbs */ -- 2.45.2