]> git.openfabrics.org - ~shefty/librdmacm.git/commitdiff
librdmacm: Delay ACM connection until resolving an address
authorSean Hefty <sean.hefty@intel.com>
Fri, 25 May 2012 17:48:47 +0000 (10:48 -0700)
committerSean Hefty <sean.hefty@intel.com>
Fri, 25 May 2012 19:29:29 +0000 (12:29 -0700)
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 <sean.hefty@intel.com>
src/acm.c
src/addrinfo.c
src/cma.c
src/cma.h

index 9c6591958bcd1b3eda9b8e092e58cdb9a1d325ba..d59efcf80d0a8f4bf87924e61285e02d43285768 100755 (executable)
--- 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)
index 2da35f0126389feac23077d03277074f5767b6bb..573fb42c1443ab935629b55c6eab7323024dd3d2 100755 (executable)
@@ -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;
index 753612c566a4293252f273bfe32cd1925de6ebca..c0cd407dcfce2387593e60985ba50566c60ba68e 100755 (executable)
--- 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);
index 2f5215c10298646a3a55514492d42ca7f3cdee5f..c673bda7a8c215c124163c0da91dbeca2a902142 100644 (file)
--- 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 */