From c89858ba3b765328615d28749abab5d043d23af7 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 | 24 ++++++++++++++---------- src/addrinfo.c | 2 +- src/cma.c | 4 +--- src/cma.h | 10 ++++------ 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/acm.c b/src/acm.c index 9c659195..e9733c68 100755 --- a/src/acm.c +++ b/src/acm.c @@ -86,29 +86,33 @@ 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 out; memset(&addr, 0, sizeof addr); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); addr.sin_port = htons(server_port); ret = connect(sock, (struct sockaddr *) &addr, sizeof(addr)); - if (ret) - goto err; - - return; - -err: - close(sock); - sock = -1; + if (ret) { + close(sock); + sock = -1; + } +out: + 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