#include <sys/poll.h>
#include <signal.h>
+extern struct rdma_event_channel *g_cm_events;
+
/* local prototypes */
static struct dapl_cm_id * dapli_req_recv(struct dapl_cm_id *conn,
struct rdma_cm_event *event);
dapl_os_lock_init(&conn->lock);
/* create CM_ID, bind to local device, create QP */
- if (rdma_create_id(&conn->cm_id, (void*)conn)) {
+ if (rdma_create_id(g_cm_events, &conn->cm_id, (void*)conn)) {
dapl_os_free(conn, sizeof(*conn));
return(dapl_convert_errno(errno,"setup_listener"));
}
dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_event()\n");
/* process one CM event, fairness */
- if(!rdma_get_cm_event(&event)) {
+ if(!rdma_get_cm_event(g_cm_events, &event)) {
struct dapl_cm_id *conn;
/* set proper conn from cm_id context*/
int g_dapl_loopback_connection = 0;
int g_ib_pipe[2];
+struct rdma_event_channel *g_cm_events = NULL;
ib_thread_state_t g_ib_thread_state = 0;
DAPL_OS_THREAD g_ib_thread;
DAPL_OS_LOCK g_hca_lock;
{
dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " dapl_ib_release: \n");
dapli_ib_thread_destroy();
+ rdma_destroy_event_channel(g_cm_events);
return 0;
}
dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
" open_hca: %s - %p\n", hca_name, hca_ptr);
+ /* Setup the global cm event channel */
+ dapl_os_lock(&g_hca_lock);
+ if (g_cm_events == NULL) {
+ g_cm_events = rdma_create_event_channel();
+ if (g_cm_events == NULL)
+ return DAT_INTERNAL_ERROR;
+ }
+ dapl_os_unlock(&g_hca_lock);
+
if (dapli_ib_thread_init())
return DAT_INTERNAL_ERROR;
-
/* HCA name will be hostname or IP address */
if (getipaddr((char*)hca_name,
sizeof(DAT_SOCK_ADDR6)))
return DAT_INVALID_ADDRESS;
-
/* cm_id will bind local device/GID based on IP address */
- if (rdma_create_id(&cm_id, (void*)hca_ptr))
+ if (rdma_create_id(g_cm_events, &cm_id, (void*)hca_ptr))
return DAT_INTERNAL_ERROR;
ret = rdma_bind_addr(cm_id,
(struct sockaddr *)&hca_ptr->hca_address);
- if (ret) {
+ if ((ret) || (cm_id->verbs == NULL)) {
rdma_destroy_id(cm_id);
dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
" open_hca: ERR bind (%d) %s \n",
}
/* uCMA events non-blocking */
- opts = fcntl(rdma_get_fd(), F_GETFL); /* uCMA */
- if (opts < 0 || fcntl(rdma_get_fd(),
+ opts = fcntl(g_cm_events->fd, F_GETFL); /* uCMA */
+ if (opts < 0 || fcntl(g_cm_events->fd,
F_SETFL, opts | O_NONBLOCK) < 0) {
dapl_dbg_log (DAPL_DBG_TYPE_ERR,
" dapl_ib_init: ERR with uCMA FD\n" );
dapl_dbg_log (DAPL_DBG_TYPE_UTIL,
" ib_thread(%d,0x%x): ENTER: pipe %d ucma %d\n",
- getpid(), g_ib_thread, g_ib_pipe[0], rdma_get_fd());
+ getpid(), g_ib_thread, g_ib_pipe[0], g_cm_events->fd);
/* Poll across pipe, CM, AT never changes */
dapl_os_lock( &g_hca_lock );
ufds[0].fd = g_ib_pipe[0]; /* pipe */
ufds[0].events = POLLIN;
- ufds[1].fd = rdma_get_fd(); /* uCMA */
+ ufds[1].fd = g_cm_events->fd; /* uCMA */
ufds[1].events = POLLIN;
while (g_ib_thread_state == IB_THREAD_RUN) {