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>
void ucma_ib_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)
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);
#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);
#else
-#define ucma_ib_init()
#define ucma_ib_cleanup()
#define ucma_ib_resolve(x, y)
#endif