From: James L. <jle...@us...> - 2005-10-03 14:48:02
|
Update of /cvsroot/dapl/dapl/openib In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19852/dapl/openib Modified Files: dapl_ib_cm.c dapl_ib_cq.c dapl_ib_qp.c dapl_ib_util.c dapl_ib_util.h Log Message: Support CQ_WAIT_OBJECT with channels and sync with latest verbs. Signed-off by: Arlin Davis <ar...@ic...> Signed-off by: James Lentini <jle...@ne...> Index: dapl_ib_cm.c =================================================================== RCS file: /cvsroot/dapl/dapl/openib/dapl_ib_cm.c,v retrieving revision 1.7 retrieving revision 1.8 diff -C10 -d -r1.7 -r1.8 *** dapl_ib_cm.c 20 Sep 2005 16:31:46 -0000 1.7 --- dapl_ib_cm.c 3 Oct 2005 14:47:51 -0000 1.8 *************** *** 289,309 **** int status; if (conn->ep->qp_handle == IB_INVALID_HANDLE) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, " dapli_rep_recv: invalid qp " "handle\n"); goto disc; } /* move QP state to RTR and RTS */ - /* TODO: could use a ib_cm_init_qp_attr() call here */ dapl_dbg_log(DAPL_DBG_TYPE_CM, " rep_recv: RTR_RTS: id %d rqp %x rlid %x rSID %d\n", conn->cm_id,event->param.rep_rcvd.remote_qpn, ntohs(conn->req.primary_path->dlid),conn->service_id); if ( dapls_modify_qp_state( conn->ep->qp_handle, IBV_QPS_RTR, conn ) != DAT_SUCCESS ) goto disc; if ( dapls_modify_qp_state( conn->ep->qp_handle, --- 289,308 ---- *************** *** 618,639 **** dapl_os_memcpy(&conn->r_addr, r_addr, sizeof(DAT_SOCK_ADDR6)); status = ib_at_route_by_ip( ((struct sockaddr_in *)&conn->r_addr)->sin_addr.s_addr, ((struct sockaddr_in *)&conn->hca->hca_address)->sin_addr.s_addr, 0, 0, &conn->dapl_rt, &conn->dapl_comp, &conn->dapl_comp.req_id); dapl_dbg_log(DAPL_DBG_TYPE_CM, " connect: at_route requested(ret=%d,id=%d): SRC %x DST %x\n", status, conn->dapl_comp.req_id, ! ((struct sockaddr_in *)&conn->hca->hca_address)->sin_addr.s_addr, ! ((struct sockaddr_in *)&conn->r_addr)->sin_addr.s_addr); if (status < 0) { dat_status = dapl_convert_errno(errno,"ib_at_route_by_ip"); dapli_destroy_cm_id(conn); return dat_status; } if (status > 0) dapli_rt_comp_handler(conn->dapl_comp.req_id, conn, status); --- 617,638 ---- dapl_os_memcpy(&conn->r_addr, r_addr, sizeof(DAT_SOCK_ADDR6)); status = ib_at_route_by_ip( ((struct sockaddr_in *)&conn->r_addr)->sin_addr.s_addr, ((struct sockaddr_in *)&conn->hca->hca_address)->sin_addr.s_addr, 0, 0, &conn->dapl_rt, &conn->dapl_comp, &conn->dapl_comp.req_id); dapl_dbg_log(DAPL_DBG_TYPE_CM, " connect: at_route requested(ret=%d,id=%d): SRC %x DST %x\n", status, conn->dapl_comp.req_id, ! ntohl(((struct sockaddr_in *)&conn->hca->hca_address)->sin_addr.s_addr), ! ntohl(((struct sockaddr_in *)&conn->r_addr)->sin_addr.s_addr)); if (status < 0) { dat_status = dapl_convert_errno(errno,"ib_at_route_by_ip"); dapli_destroy_cm_id(conn); return dat_status; } if (status > 0) dapli_rt_comp_handler(conn->dapl_comp.req_id, conn, status); Index: dapl_ib_cq.c =================================================================== RCS file: /cvsroot/dapl/dapl/openib/dapl_ib_cq.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C10 -d -r1.5 -r1.6 *** dapl_ib_cq.c 20 Sep 2005 16:31:46 -0000 1.5 --- dapl_ib_cq.c 3 Oct 2005 14:47:51 -0000 1.6 *************** *** 51,101 **** * **************************************************************************/ #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_lmr_util.h" #include "dapl_evd_util.h" #include "dapl_ring_buffer_util.h" #include <sys/poll.h> void dapli_cq_event_cb(struct _ib_hca_transport *hca) { ! int i; dapl_dbg_log(DAPL_DBG_TYPE_UTIL," dapli_cq_event_cb(%p)\n", hca); ! /* check all comp events on this device */ ! for(i=0;i<hca->ib_ctx->num_comp;i++) { ! struct dapl_evd *evd_ptr = NULL; ! struct ibv_cq *ibv_cq = NULL; ! struct pollfd cq_fd = { ! .fd = hca->ib_ctx->cq_fd[i], ! .events = POLLIN, ! .revents = 0 ! }; ! if ((poll(&cq_fd, 1, 0) == 1) && ! (!ibv_get_cq_event(hca->ib_ctx, i, ! &ibv_cq, (void*)&evd_ptr))) { ! if (DAPL_BAD_HANDLE(evd_ptr, DAPL_MAGIC_EVD)) { ! ibv_ack_cq_events(ibv_cq, 1); ! continue; ! } ! /* process DTO event via callback */ ! dapl_evd_dto_callback ( hca->ib_ctx, ! evd_ptr->ib_cq_handle, ! (void*)evd_ptr ); ! ibv_ack_cq_events(ibv_cq, 1); ! } ! } } /* * Map all verbs DTO completion codes to the DAT equivelent. * * Not returned by verbs: DAT_DTO_ERR_PARTIAL_PACKET */ static struct ib_status_map { int ib_status; --- 51,100 ---- * **************************************************************************/ #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_lmr_util.h" #include "dapl_evd_util.h" #include "dapl_ring_buffer_util.h" #include <sys/poll.h> + /* One CQ event channel per HCA */ void dapli_cq_event_cb(struct _ib_hca_transport *hca) { ! /* check all comp events on this device */ ! struct dapl_evd *evd_ptr = NULL; ! struct ibv_cq *ibv_cq = NULL; ! struct pollfd cq_fd = { ! .fd = hca->ib_cq->fd, ! .events = POLLIN, ! .revents = 0 ! }; ! dapl_dbg_log(DAPL_DBG_TYPE_UTIL," dapli_cq_event_cb(%p)\n", hca); ! if ((poll(&cq_fd, 1, 0) == 1) && ! (!ibv_get_cq_event(hca->ib_cq, ! &ibv_cq, (void*)&evd_ptr))) { ! if (DAPL_BAD_HANDLE(evd_ptr, DAPL_MAGIC_EVD)) { ! ibv_ack_cq_events(ibv_cq, 1); ! return; ! } ! /* process DTO event via callback */ ! dapl_evd_dto_callback ( hca->ib_ctx, ! evd_ptr->ib_cq_handle, ! (void*)evd_ptr ); ! ibv_ack_cq_events(ibv_cq, 1); ! } } /* * Map all verbs DTO completion codes to the DAT equivelent. * * Not returned by verbs: DAT_DTO_ERR_PARTIAL_PACKET */ static struct ib_status_map { int ib_status; *************** *** 239,268 **** */ DAT_RETURN dapls_ib_cq_alloc ( IN DAPL_IA *ia_ptr, IN DAPL_EVD *evd_ptr, IN DAT_COUNT *cqlen ) { dapl_dbg_log ( DAPL_DBG_TYPE_UTIL, "dapls_ib_cq_alloc: evd %p cqlen=%d \n", evd_ptr, *cqlen ); /* Call IB verbs to create CQ */ evd_ptr->ib_cq_handle = ibv_create_cq(ia_ptr->hca_ptr->ib_hca_handle, *cqlen, ! evd_ptr); if (evd_ptr->ib_cq_handle == IB_INVALID_HANDLE) return DAT_INSUFFICIENT_RESOURCES; /* arm cq for events */ ! dapls_set_cq_notify (ia_ptr, evd_ptr); /* update with returned cq entry size */ *cqlen = evd_ptr->ib_cq_handle->cqe; dapl_dbg_log ( DAPL_DBG_TYPE_UTIL, "dapls_ib_cq_alloc: new_cq %p cqlen=%d \n", evd_ptr->ib_cq_handle, *cqlen ); return DAT_SUCCESS; } --- 238,275 ---- */ DAT_RETURN dapls_ib_cq_alloc ( IN DAPL_IA *ia_ptr, IN DAPL_EVD *evd_ptr, IN DAT_COUNT *cqlen ) { dapl_dbg_log ( DAPL_DBG_TYPE_UTIL, "dapls_ib_cq_alloc: evd %p cqlen=%d \n", evd_ptr, *cqlen ); + struct ibv_comp_channel *channel = ia_ptr->hca_ptr->ib_trans.ib_cq; + + #ifdef CQ_WAIT_OBJECT + if (evd_ptr->cq_wait_obj_handle) + channel = evd_ptr->cq_wait_obj_handle; + #endif + /* Call IB verbs to create CQ */ evd_ptr->ib_cq_handle = ibv_create_cq(ia_ptr->hca_ptr->ib_hca_handle, *cqlen, ! evd_ptr, ! channel, 0); if (evd_ptr->ib_cq_handle == IB_INVALID_HANDLE) return DAT_INSUFFICIENT_RESOURCES; /* arm cq for events */ ! dapls_set_cq_notify(ia_ptr, evd_ptr); /* update with returned cq entry size */ *cqlen = evd_ptr->ib_cq_handle->cqe; dapl_dbg_log ( DAPL_DBG_TYPE_UTIL, "dapls_ib_cq_alloc: new_cq %p cqlen=%d \n", evd_ptr->ib_cq_handle, *cqlen ); return DAT_SUCCESS; } *************** *** 286,315 **** * DAT_INVALID_PARAMETER * */ DAT_RETURN dapls_ib_cq_resize ( IN DAPL_IA *ia_ptr, IN DAPL_EVD *evd_ptr, IN DAT_COUNT *cqlen ) { ib_cq_handle_t new_cq; /* IB verbs doe not support resize. Try to re-create CQ * with new size. Can only be done if QP is not attached. * destroy EBUSY == QP still attached. */ ! /* create a new size before destroying original */ ! new_cq = ibv_create_cq( ia_ptr->hca_ptr->ib_hca_handle, ! *cqlen, ! evd_ptr); if (new_cq == IB_INVALID_HANDLE) return DAT_INSUFFICIENT_RESOURCES; /* destroy the original and replace if successful */ if (ibv_destroy_cq(evd_ptr->ib_cq_handle)) { ibv_destroy_cq(new_cq); return(dapl_convert_errno(errno,"resize_cq")); } --- 293,327 ---- * DAT_INVALID_PARAMETER * */ DAT_RETURN dapls_ib_cq_resize ( IN DAPL_IA *ia_ptr, IN DAPL_EVD *evd_ptr, IN DAT_COUNT *cqlen ) { ib_cq_handle_t new_cq; + struct ibv_comp_channel *channel = ia_ptr->hca_ptr->ib_trans.ib_cq; /* IB verbs doe not support resize. Try to re-create CQ * with new size. Can only be done if QP is not attached. * destroy EBUSY == QP still attached. */ ! #ifdef CQ_WAIT_OBJECT ! if (evd_ptr->cq_wait_obj_handle) ! channel = evd_ptr->cq_wait_obj_handle; ! #endif ! ! /* Call IB verbs to create CQ */ ! new_cq = ibv_create_cq(ia_ptr->hca_ptr->ib_hca_handle, *cqlen, ! evd_ptr, channel, 0); if (new_cq == IB_INVALID_HANDLE) return DAT_INSUFFICIENT_RESOURCES; /* destroy the original and replace if successful */ if (ibv_destroy_cq(evd_ptr->ib_cq_handle)) { ibv_destroy_cq(new_cq); return(dapl_convert_errno(errno,"resize_cq")); } *************** *** 442,577 **** #ifdef CQ_WAIT_OBJECT /* NEW common wait objects for providers with direct CQ wait objects */ DAT_RETURN dapls_ib_wait_object_create ( IN DAPL_EVD *evd_ptr, IN ib_wait_obj_handle_t *p_cq_wait_obj_handle ) { dapl_dbg_log ( DAPL_DBG_TYPE_CM, ! " cq_object_create: (%p)=%p\n", ! p_cq_wait_obj_handle, evd_ptr ); /* set cq_wait object to evd_ptr */ ! *p_cq_wait_obj_handle = evd_ptr; ! return DAT_SUCCESS; } DAT_RETURN dapls_ib_wait_object_destroy ( IN ib_wait_obj_handle_t p_cq_wait_obj_handle) { dapl_dbg_log ( DAPL_DBG_TYPE_UTIL, " cq_object_destroy: wait_obj=%p\n", p_cq_wait_obj_handle ); return DAT_SUCCESS; } DAT_RETURN dapls_ib_wait_object_wakeup ( IN ib_wait_obj_handle_t p_cq_wait_obj_handle) { dapl_dbg_log ( DAPL_DBG_TYPE_UTIL, " cq_object_wakeup: wait_obj=%p\n", p_cq_wait_obj_handle ); return DAT_SUCCESS; } DAT_RETURN dapls_ib_wait_object_wait ( IN ib_wait_obj_handle_t p_cq_wait_obj_handle, IN u_int32_t timeout) { ! DAPL_EVD *evd_ptr = p_cq_wait_obj_handle; ! ib_cq_handle_t cq = evd_ptr->ib_cq_handle; ! struct ibv_cq *ibv_cq = NULL; ! void *ibv_ctx = NULL; ! int status = 0; ! ! dapl_dbg_log ( DAPL_DBG_TYPE_CM, ! " cq_object_wait: dev %p evd %p cq %p, time %d\n", ! cq->context, evd_ptr, cq, timeout ); ! ! /* Multiple EVD's sharing one event handle for now until uverbs supports more */ ! ! /* ! * This makes it very inefficient and tricky to manage multiple CQ per device open ! * For example: 4 threads waiting on separate CQ events will all be woke when ! * a CQ event fires. So the poll wakes up and the first thread to get to the ! * the get_cq_event wins and the other 3 will block. The dapl_evd_wait code ! * above will immediately do a poll_cq after returning from CQ wait and if ! * nothing on the queue will call this wait again and go back to sleep. So ! * as long as they all wake up, a mutex is held around the get_cq_event ! * so no blocking occurs and they all return then everything should work. ! * Of course, the timeout needs adjusted on the threads that go back to sleep. ! */ ! while (cq) { ! struct pollfd cq_poll = { ! .fd = cq->context->cq_fd[0], .events = POLLIN, .revents = 0 }; - int timeout_ms = -1; - - if (timeout != DAT_TIMEOUT_INFINITE) - timeout_ms = timeout/1000; ! /* check if another thread processed the event already, pending queue > 0 */ ! dapl_os_lock( &evd_ptr->header.owner_ia->hca_ptr->ib_trans.cq_lock ); ! if (dapls_rbuf_count(&evd_ptr->pending_event_queue)) { ! dapl_os_unlock( &evd_ptr->header.owner_ia->hca_ptr->ib_trans.cq_lock ); ! break; ! } ! dapl_os_unlock( &evd_ptr->header.owner_ia->hca_ptr->ib_trans.cq_lock ); ! ! dapl_dbg_log ( DAPL_DBG_TYPE_CM," cq_object_wait: polling\n"); ! status = poll(&cq_poll, 1, timeout_ms); ! dapl_dbg_log ( DAPL_DBG_TYPE_CM," cq_object_wait: poll returned status=%d\n",status); ! ! /* ! * If poll with timeout wakes then hold mutex around a poll with no timeout ! * so subsequent get_cq_events will be guaranteed not to block ! * If the event does not belong to this EVD then put it on proper EVD pending ! * queue under the mutex. ! */ ! if (status == 1) { ! dapl_os_lock( &evd_ptr->header.owner_ia->hca_ptr->ib_trans.cq_lock ); ! status = poll(&cq_poll, 1, 0); ! if (status == 1) { ! status = ibv_get_cq_event(cq->context, ! 0, &ibv_cq, &ibv_ctx); ! /* if event is not ours, put on proper evd pending queue */ ! /* force another wakeup */ ! if ((ibv_ctx != evd_ptr ) && ! (!DAPL_BAD_HANDLE(ibv_ctx, DAPL_MAGIC_EVD))) { ! dapl_dbg_log (DAPL_DBG_TYPE_CM, ! " cq_object_wait: ibv_ctx %p != evd %p\n", ! ibv_ctx, evd_ptr); ! dapls_evd_copy_cq((struct evd_ptr*)ibv_ctx); ! dapl_os_unlock(&evd_ptr->header.owner_ia->hca_ptr->ib_trans.cq_lock ); ! continue; ! } ! } ! dapl_os_unlock( &evd_ptr->header.owner_ia->hca_ptr->ib_trans.cq_lock ); ! break; ! } else if (status == 0) { ! status = ETIMEDOUT; ! break; } ! } dapl_dbg_log (DAPL_DBG_TYPE_CM, ! " cq_object_wait: RET evd %p cq %p ibv_cq %p ibv_ctx %p %s\n", ! evd_ptr, cq,ibv_cq,ibv_ctx,strerror(errno)); return(dapl_convert_errno(status,"cq_wait_object_wait")); } #endif /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 --- 454,549 ---- #ifdef CQ_WAIT_OBJECT /* NEW common wait objects for providers with direct CQ wait objects */ DAT_RETURN dapls_ib_wait_object_create ( IN DAPL_EVD *evd_ptr, IN ib_wait_obj_handle_t *p_cq_wait_obj_handle ) { dapl_dbg_log ( DAPL_DBG_TYPE_CM, ! " cq_object_create: (%p,%p)\n", ! evd_ptr, p_cq_wait_obj_handle ); /* set cq_wait object to evd_ptr */ ! *p_cq_wait_obj_handle = ! ibv_create_comp_channel(evd_ptr->header.owner_ia->hca_ptr->ib_hca_handle); ! return DAT_SUCCESS; } DAT_RETURN dapls_ib_wait_object_destroy ( IN ib_wait_obj_handle_t p_cq_wait_obj_handle) { dapl_dbg_log ( DAPL_DBG_TYPE_UTIL, " cq_object_destroy: wait_obj=%p\n", p_cq_wait_obj_handle ); + + ibv_destroy_comp_channel(p_cq_wait_obj_handle); + return DAT_SUCCESS; } DAT_RETURN dapls_ib_wait_object_wakeup ( IN ib_wait_obj_handle_t p_cq_wait_obj_handle) { dapl_dbg_log ( DAPL_DBG_TYPE_UTIL, " cq_object_wakeup: wait_obj=%p\n", p_cq_wait_obj_handle ); + + /* no wake up mechanism */ return DAT_SUCCESS; } DAT_RETURN dapls_ib_wait_object_wait ( IN ib_wait_obj_handle_t p_cq_wait_obj_handle, IN u_int32_t timeout) { ! struct dapl_evd *evd_ptr; ! struct ibv_cq *ibv_cq = NULL; ! void *ibv_ctx = NULL; ! int status = 0; ! int timeout_ms = -1; ! struct pollfd cq_fd = { ! .fd = p_cq_wait_obj_handle->fd, .events = POLLIN, .revents = 0 }; ! dapl_dbg_log ( DAPL_DBG_TYPE_CM, ! " cq_object_wait: CQ channel %p time %d\n", ! p_cq_wait_obj_handle, timeout ); ! ! /* uDAPL timeout values in usecs */ ! if (timeout != DAT_TIMEOUT_INFINITE) ! timeout_ms = timeout/1000; ! status = poll(&cq_fd, 1, timeout_ms); ! /* returned event */ ! if (status > 0) { ! if (!ibv_get_cq_event(p_cq_wait_obj_handle, ! &ibv_cq, (void*)&evd_ptr)) { ! ibv_ack_cq_events(ibv_cq, 1); } ! status = 0; ! ! /* timeout */ ! } else if (status == 0) ! status = ETIMEDOUT; ! dapl_dbg_log (DAPL_DBG_TYPE_CM, ! " cq_object_wait: RET evd %p ibv_cq %p ibv_ctx %p %s\n", ! evd_ptr, ibv_cq,ibv_ctx,strerror(errno)); return(dapl_convert_errno(status,"cq_wait_object_wait")); } #endif /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 Index: dapl_ib_qp.c =================================================================== RCS file: /cvsroot/dapl/dapl/openib/dapl_ib_qp.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C10 -d -r1.2 -r1.3 *** dapl_ib_qp.c 20 Sep 2005 16:31:46 -0000 1.2 --- dapl_ib_qp.c 3 Oct 2005 14:47:51 -0000 1.3 *************** *** 80,106 **** attr = &ep_ptr->param.ep_attr; ib_pd_handle = ((DAPL_PZ *)ep_ptr->param.pz_handle)->pd_handle; rcv_evd = (DAPL_EVD *) ep_ptr->param.recv_evd_handle; req_evd = (DAPL_EVD *) ep_ptr->param.request_evd_handle; /* * DAT allows usage model of EP's with no EVD's but IB does not. * Create a CQ with zero entries under the covers to support and * catch any invalid posting. */ ! if ( rcv_evd != DAT_HANDLE_NULL ) rcv_cq = rcv_evd->ib_cq_handle; else if (!ia_ptr->hca_ptr->ib_trans.ib_cq_empty) rcv_cq = ia_ptr->hca_ptr->ib_trans.ib_cq_empty; else { ! rcv_cq = ibv_create_cq(ia_ptr->hca_ptr->ib_hca_handle, ! 0, NULL); if (rcv_cq == IB_INVALID_HANDLE) return(dapl_convert_errno(ENOMEM, "create_cq")); ia_ptr->hca_ptr->ib_trans.ib_cq_empty = rcv_cq; } if (req_evd != DAT_HANDLE_NULL) req_cq = req_evd->ib_cq_handle; else req_cq = ia_ptr->hca_ptr->ib_trans.ib_cq_empty; --- 80,114 ---- attr = &ep_ptr->param.ep_attr; ib_pd_handle = ((DAPL_PZ *)ep_ptr->param.pz_handle)->pd_handle; rcv_evd = (DAPL_EVD *) ep_ptr->param.recv_evd_handle; req_evd = (DAPL_EVD *) ep_ptr->param.request_evd_handle; /* * DAT allows usage model of EP's with no EVD's but IB does not. * Create a CQ with zero entries under the covers to support and * catch any invalid posting. */ ! if (rcv_evd != DAT_HANDLE_NULL) rcv_cq = rcv_evd->ib_cq_handle; else if (!ia_ptr->hca_ptr->ib_trans.ib_cq_empty) rcv_cq = ia_ptr->hca_ptr->ib_trans.ib_cq_empty; else { ! struct ibv_comp_channel *channel = ! ia_ptr->hca_ptr->ib_trans.ib_cq; ! #ifdef CQ_WAIT_OBJECT ! if (rcv_evd->cq_wait_obj_handle) ! channel = rcv_evd->cq_wait_obj_handle; ! #endif ! /* Call IB verbs to create CQ */ ! rcv_cq = ibv_create_cq(ia_ptr->hca_ptr->ib_hca_handle, ! 0, NULL, channel, 0); ! if (rcv_cq == IB_INVALID_HANDLE) return(dapl_convert_errno(ENOMEM, "create_cq")); ia_ptr->hca_ptr->ib_trans.ib_cq_empty = rcv_cq; } if (req_evd != DAT_HANDLE_NULL) req_cq = req_evd->ib_cq_handle; else req_cq = ia_ptr->hca_ptr->ib_trans.ib_cq_empty; Index: dapl_ib_util.c =================================================================== RCS file: /cvsroot/dapl/dapl/openib/dapl_ib_util.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C10 -d -r1.6 -r1.7 *** dapl_ib_util.c 20 Sep 2005 16:31:46 -0000 1.6 --- dapl_ib_util.c 3 Oct 2005 14:47:51 -0000 1.7 *************** *** 206,227 **** * DAT_SUCCESS * dapl_convert_errno * */ DAT_RETURN dapls_ib_open_hca ( IN IB_HCA_NAME hca_name, IN DAPL_HCA *hca_ptr) { struct dlist *dev_list; long opts; - int i; - dapl_dbg_log (DAPL_DBG_TYPE_UTIL, " open_hca: %s - %p\n", hca_name, hca_ptr ); /* Get list of all IB devices, find match, open */ dev_list = ibv_get_devices(); dlist_start(dev_list); dlist_for_each_data(dev_list,hca_ptr->ib_trans.ib_dev,struct ibv_device) { if (!strcmp(ibv_get_device_name(hca_ptr->ib_trans.ib_dev),hca_name)) break; } --- 206,225 ---- *************** *** 276,305 **** dapl_os_wait_object_init(&hca_ptr->ib_trans.wait_object); /* set event FD's to non-blocking */ opts = fcntl(hca_ptr->ib_hca_handle->async_fd, F_GETFL); /* uASYNC */ if (opts < 0 || fcntl(hca_ptr->ib_hca_handle->async_fd, F_SETFL, opts | O_NONBLOCK) < 0) { dapl_dbg_log (DAPL_DBG_TYPE_ERR, " open_hca: ERR with async FD\n" ); goto bail; } ! for (i=0;i<hca_ptr->ib_hca_handle->num_comp;i++) { /* uCQ */ ! opts = fcntl(hca_ptr->ib_hca_handle->cq_fd[i], F_GETFL); ! if (opts < 0 || fcntl(hca_ptr->ib_hca_handle->async_fd, ! F_SETFL, opts | O_NONBLOCK) < 0) { ! dapl_dbg_log(DAPL_DBG_TYPE_ERR, ! " open_hca: ERR with CQ FD\n"); ! goto bail; ! } ! } ! /* Get CM device handle for events, and set to non-blocking */ hca_ptr->ib_trans.ib_cm = ib_cm_get_device(hca_ptr->ib_hca_handle); opts = fcntl(hca_ptr->ib_trans.ib_cm->fd, F_GETFL); /* uCM */ if (opts < 0 || fcntl(hca_ptr->ib_trans.ib_cm->fd, F_SETFL, opts | O_NONBLOCK) < 0) { dapl_dbg_log (DAPL_DBG_TYPE_ERR, " open_hca: ERR with CM FD\n" ); goto bail; } --- 274,305 ---- dapl_os_wait_object_init(&hca_ptr->ib_trans.wait_object); /* set event FD's to non-blocking */ opts = fcntl(hca_ptr->ib_hca_handle->async_fd, F_GETFL); /* uASYNC */ if (opts < 0 || fcntl(hca_ptr->ib_hca_handle->async_fd, F_SETFL, opts | O_NONBLOCK) < 0) { dapl_dbg_log (DAPL_DBG_TYPE_ERR, " open_hca: ERR with async FD\n" ); goto bail; } ! ! /* EVD events without direct CQ channels, non-blocking */ ! hca_ptr->ib_trans.ib_cq = ! ibv_create_comp_channel(hca_ptr->ib_hca_handle); ! opts = fcntl(hca_ptr->ib_trans.ib_cq->fd, F_GETFL); /* uCQ */ ! if (opts < 0 || fcntl(hca_ptr->ib_trans.ib_cq->fd, ! F_SETFL, opts | O_NONBLOCK) < 0) { ! dapl_dbg_log (DAPL_DBG_TYPE_ERR, ! " open_hca: ERR with CQ FD\n" ); ! goto bail; ! } ! /* Get CM device handle for events, and set to non-blocking */ hca_ptr->ib_trans.ib_cm = ib_cm_get_device(hca_ptr->ib_hca_handle); opts = fcntl(hca_ptr->ib_trans.ib_cm->fd, F_GETFL); /* uCM */ if (opts < 0 || fcntl(hca_ptr->ib_trans.ib_cm->fd, F_SETFL, opts | O_NONBLOCK) < 0) { dapl_dbg_log (DAPL_DBG_TYPE_ERR, " open_hca: ERR with CM FD\n" ); goto bail; } *************** *** 318,337 **** --- 318,338 ---- dapl_dbg_log (DAPL_DBG_TYPE_UTIL, " open_hca: %s, port %d, %s %d.%d.%d.%d INLINE_MAX=%d\n", ibv_get_device_name(hca_ptr->ib_trans.ib_dev), hca_ptr->port_num, ((struct sockaddr_in *)&hca_ptr->hca_address)->sin_family == AF_INET ? "AF_INET":"AF_INET6", ((struct sockaddr_in *)&hca_ptr->hca_address)->sin_addr.s_addr >> 0 & 0xff, ((struct sockaddr_in *)&hca_ptr->hca_address)->sin_addr.s_addr >> 8 & 0xff, ((struct sockaddr_in *)&hca_ptr->hca_address)->sin_addr.s_addr >> 16 & 0xff, ((struct sockaddr_in *)&hca_ptr->hca_address)->sin_addr.s_addr >> 24 & 0xff, hca_ptr->ib_trans.max_inline_send ); + hca_ptr->ib_trans.d_hca = hca_ptr; return DAT_SUCCESS; bail: ibv_close_device(hca_ptr->ib_hca_handle); hca_ptr->ib_hca_handle = IB_INVALID_HANDLE; return DAT_INTERNAL_ERROR; } /* *************** *** 702,722 **** { dapl_dbg_log (DAPL_DBG_TYPE_WARN, "--> DsEventCb: UNKNOWN\n"); break; } } ibv_ack_async_event(&event); } } - /* work thread for uAT, uCM, CQ, and async events */ void dapli_thread(void *arg) { struct pollfd ufds[__FD_SETSIZE]; struct _ib_hca_transport *uhca[__FD_SETSIZE]={NULL}; struct _ib_hca_transport *hca; int ret,idx,fds; char rbuf[2]; dapl_dbg_log (DAPL_DBG_TYPE_UTIL, --- 703,722 ---- *************** *** 739,776 **** ufds[1].revents = 0; idx=1; /* Walk HCA list and setup async and CQ events */ if (!dapl_llist_is_empty(&g_hca_list)) hca = dapl_llist_peek_head(&g_hca_list); else hca = NULL; while(hca) { - int i; ufds[++idx].fd = hca->ib_cm->fd; /* uCM */ ufds[idx].events = POLLIN; ufds[idx].revents = 0; uhca[idx] = hca; ufds[++idx].fd = hca->ib_ctx->async_fd; /* uASYNC */ ufds[idx].events = POLLIN; ufds[idx].revents = 0; uhca[idx] = hca; ! for (i=0;i<hca->ib_ctx->num_comp;i++) { /* uCQ */ ! ufds[++idx].fd = hca->ib_ctx->cq_fd[i]; ufds[idx].events = POLLIN; ufds[idx].revents = 0; uhca[idx] = hca; } hca = dapl_llist_next_entry( ! &g_hca_list, ! (DAPL_LLIST_ENTRY*)&hca->entry); } /* unlock, and setup poll */ fds = idx+1; dapl_os_unlock(&g_hca_lock); ret = poll(ufds, fds, -1); if (ret <= 0) { dapl_dbg_log(DAPL_DBG_TYPE_WARN, " ib_thread(%d): ERR %s poll\n", getpid(),strerror(errno)); --- 739,777 ---- ufds[1].revents = 0; idx=1; /* Walk HCA list and setup async and CQ events */ if (!dapl_llist_is_empty(&g_hca_list)) hca = dapl_llist_peek_head(&g_hca_list); else hca = NULL; while(hca) { ufds[++idx].fd = hca->ib_cm->fd; /* uCM */ ufds[idx].events = POLLIN; ufds[idx].revents = 0; uhca[idx] = hca; ufds[++idx].fd = hca->ib_ctx->async_fd; /* uASYNC */ ufds[idx].events = POLLIN; ufds[idx].revents = 0; uhca[idx] = hca; ! ! if (hca->ib_cq != NULL) { ! ufds[++idx].fd = hca->ib_cq->fd; /* uCQ */ ufds[idx].events = POLLIN; ufds[idx].revents = 0; uhca[idx] = hca; } + hca = dapl_llist_next_entry( ! &g_hca_list, ! (DAPL_LLIST_ENTRY*)&hca->entry); } /* unlock, and setup poll */ fds = idx+1; dapl_os_unlock(&g_hca_lock); ret = poll(ufds, fds, -1); if (ret <= 0) { dapl_dbg_log(DAPL_DBG_TYPE_WARN, " ib_thread(%d): ERR %s poll\n", getpid(),strerror(errno)); *************** *** 808,820 **** /* AT events */ if (ufds[1].revents == POLLIN) dapli_at_event_cb(); dapl_os_lock(&g_hca_lock); } dapl_dbg_log(DAPL_DBG_TYPE_UTIL," ib_thread(%d) EXIT\n",getpid()); g_ib_destroy = 2; dapl_os_unlock(&g_hca_lock); - pthread_exit(NULL); } --- 809,820 ---- Index: dapl_ib_util.h =================================================================== RCS file: /cvsroot/dapl/dapl/openib/dapl_ib_util.h,v retrieving revision 1.5 retrieving revision 1.6 diff -C10 -d -r1.5 -r1.6 *** dapl_ib_util.h 20 Sep 2005 16:31:46 -0000 1.5 --- dapl_ib_util.h 3 Oct 2005 14:47:51 -0000 1.6 *************** *** 158,178 **** } ib_notification_type_t; /* other mappings */ typedef int ib_bool_t; typedef union ibv_gid GID; typedef char *IB_HCA_NAME; typedef uint16_t ib_hca_port_t; typedef uint32_t ib_comp_handle_t; #ifdef CQ_WAIT_OBJECT ! typedef struct dapl_evd *ib_wait_obj_handle_t; #endif /* Definitions */ #define IB_INVALID_HANDLE NULL /* inline send rdma threshold */ #define INLINE_SEND_DEFAULT 128 /* CM private data areas */ #define IB_MAX_REQ_PDATA_SIZE 92 --- 158,178 ---- } ib_notification_type_t; /* other mappings */ typedef int ib_bool_t; typedef union ibv_gid GID; typedef char *IB_HCA_NAME; typedef uint16_t ib_hca_port_t; typedef uint32_t ib_comp_handle_t; #ifdef CQ_WAIT_OBJECT ! typedef struct ibv_comp_channel *ib_wait_obj_handle_t; #endif /* Definitions */ #define IB_INVALID_HANDLE NULL /* inline send rdma threshold */ #define INLINE_SEND_DEFAULT 128 /* CM private data areas */ #define IB_MAX_REQ_PDATA_SIZE 92 *************** *** 232,254 **** --- 232,256 ---- typedef void (*ib_async_handler_t)( IN ib_hca_handle_t ib_hca_handle, IN ib_error_record_t *err_code, IN void *context); /* ib_hca_transport_t, specific to this implementation */ typedef struct _ib_hca_transport { struct ib_llist_entry entry; int destroy; + struct dapl_hca *d_hca; struct ibv_device *ib_dev; struct ibv_context *ib_ctx; struct ib_cm_device *ib_cm; + struct ibv_comp_channel *ib_cq; ib_cq_handle_t ib_cq_empty; DAPL_OS_WAIT_OBJECT wait_object; int max_inline_send; union ibv_gid gid; ib_async_handler_t async_unafiliated; void *async_un_ctx; ib_async_handler_t async_cq_error; void *async_ctx; ib_async_handler_t async_cq; void *async_cq_ctx; |