You can subscribe to this list here.
2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(81) |
Sep
(111) |
Oct
(129) |
Nov
(83) |
Dec
(60) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2003 |
Jan
(57) |
Feb
(62) |
Mar
(149) |
Apr
(94) |
May
(107) |
Jun
(152) |
Jul
(211) |
Aug
(124) |
Sep
(49) |
Oct
(45) |
Nov
(47) |
Dec
(37) |
2004 |
Jan
(32) |
Feb
(78) |
Mar
(41) |
Apr
(93) |
May
(23) |
Jun
(55) |
Jul
(116) |
Aug
(12) |
Sep
(30) |
Oct
(20) |
Nov
(2) |
Dec
(18) |
2005 |
Jan
(51) |
Feb
(25) |
Mar
(130) |
Apr
(19) |
May
(9) |
Jun
(7) |
Jul
(5) |
Aug
(11) |
Sep
(14) |
Oct
(9) |
Nov
(2) |
Dec
(6) |
2006 |
Jan
(1) |
Feb
(2) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: James L. <jle...@us...> - 2006-02-28 18:11:40
|
Update of /cvsroot/dapl In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25210 Modified Files: CREDITS Log Message: |
From: James L. <jle...@us...> - 2006-02-28 16:01:53
|
Update of /cvsroot/dapl/dapl/openib_cma In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2497/dapl/openib_cma Modified Files: dapl_ib_cm.c dapl_ib_cq.c dapl_ib_util.c dapl_ib_util.h Log Message: Fix to destroy QPs in all cases and close the HCA. 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_cma/dapl_ib_cm.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C10 -d -r1.2 -r1.3 *** dapl_ib_cm.c 9 Jan 2006 16:58:28 -0000 1.2 --- dapl_ib_cm.c 28 Feb 2006 16:01:48 -0000 1.3 *************** *** 299,327 **** DAPL_DBG_TYPE_ERR, " dapli_cm_active_cb_handler: Unexpected CM " "event %d on ID 0x%p\n", event->event, conn->cm_id); break; } dapl_os_lock(&conn->lock); destroy = conn->destroy; conn->in_callback = conn->destroy; dapl_os_unlock(&conn->lock); - if (destroy) { - dapl_dbg_log(DAPL_DBG_TYPE_CM, - " active_cb: DESTROY conn %p id %d \n", - conn, conn->cm_id ); - if (conn->ep) - conn->ep->cm_handle = IB_INVALID_HANDLE; - - dapl_os_free(conn, sizeof(*conn)); - } return(destroy); } static int dapli_cm_passive_cb(struct dapl_cm_id *conn, struct rdma_cm_event *event) { int destroy; struct dapl_cm_id *new_conn; dapl_dbg_log(DAPL_DBG_TYPE_CM, --- 299,318 ---- *************** *** 382,407 **** dapl_dbg_log(DAPL_DBG_TYPE_ERR, " passive_cb: " "Unexpected CM event %d on ID 0x%p\n", event->event, conn->cm_id); break; } dapl_os_lock(&conn->lock); destroy = conn->destroy; conn->in_callback = conn->destroy; dapl_os_unlock(&conn->lock); - if (destroy) { - if (conn->ep) - conn->ep->cm_handle = IB_INVALID_HANDLE; - - dapl_os_free(conn, sizeof(*conn)); - } return(destroy); } /************************ DAPL provider entry points **********************/ /* * dapls_ib_connect * * Initiate a connection with the passive listener on another node --- 373,392 ---- *************** *** 1073,1108 **** case RDMA_CM_EVENT_CONNECT_ERROR: case RDMA_CM_EVENT_UNREACHABLE: case RDMA_CM_EVENT_REJECTED: case RDMA_CM_EVENT_ESTABLISHED: case RDMA_CM_EVENT_DISCONNECTED: /* passive or active */ if (conn->sp) ret = dapli_cm_passive_cb(conn,event); else ret = dapli_cm_active_cb(conn,event); ! ! if (ret) rdma_destroy_id(conn->cm_id); ! break; case RDMA_CM_EVENT_CONNECT_RESPONSE: default: dapl_dbg_log(DAPL_DBG_TYPE_WARN, " cm_event: UNEXPECTED EVENT=%p ID=%p CTX=%p\n", event->event, event->id, event->id->context); break; } rdma_ack_cm_event(event); } else { ! dapl_dbg_log(DAPL_DBG_TYPE_WARN, " cm_event: ERROR: rdma_get_cm_event() %d %d %s\n", ret, errno, strerror(errno)); } } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 --- 1058,1104 ---- case RDMA_CM_EVENT_CONNECT_ERROR: case RDMA_CM_EVENT_UNREACHABLE: case RDMA_CM_EVENT_REJECTED: case RDMA_CM_EVENT_ESTABLISHED: case RDMA_CM_EVENT_DISCONNECTED: /* passive or active */ if (conn->sp) ret = dapli_cm_passive_cb(conn,event); else ret = dapli_cm_active_cb(conn,event); ! ! /* destroy both qp and cm_id */ ! if (ret) { ! dapl_dbg_log(DAPL_DBG_TYPE_CM, ! " cma_cb: DESTROY conn %p" ! " cm_id %p qp %p\n", ! conn, conn->cm_id, ! conn->cm_id->qp); ! ! if (conn->cm_id->qp) ! rdma_destroy_qp(conn->cm_id); ! rdma_destroy_id(conn->cm_id); ! dapl_os_free(conn, sizeof(*conn)); ! } break; case RDMA_CM_EVENT_CONNECT_RESPONSE: default: dapl_dbg_log(DAPL_DBG_TYPE_WARN, " cm_event: UNEXPECTED EVENT=%p ID=%p CTX=%p\n", event->event, event->id, event->id->context); break; } rdma_ack_cm_event(event); } else { ! dapl_dbg_log(DAPL_DBG_TYPE_CM, " cm_event: ERROR: rdma_get_cm_event() %d %d %s\n", ret, errno, strerror(errno)); } } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 Index: dapl_ib_cq.c =================================================================== RCS file: /cvsroot/dapl/dapl/openib_cma/dapl_ib_cq.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C10 -d -r1.1 -r1.2 *** dapl_ib_cq.c 5 Dec 2005 16:48:36 -0000 1.1 --- dapl_ib_cq.c 28 Feb 2006 16:01:48 -0000 1.2 *************** *** 491,530 **** }; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " 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_UTIL, " 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 * tab-width: 8 * End: */ --- 491,535 ---- }; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " 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; ! /* restart syscall */ ! while ((status = poll(&cq_fd, 1, timeout_ms)) == -1 ) ! if (errno == EINTR) ! continue; /* 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; + else + status = errno; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " 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 * tab-width: 8 * End: */ Index: dapl_ib_util.c =================================================================== RCS file: /cvsroot/dapl/dapl/openib_cma/dapl_ib_util.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C10 -d -r1.1 -r1.2 *** dapl_ib_util.c 5 Dec 2005 16:48:36 -0000 1.1 --- dapl_ib_util.c 28 Feb 2006 16:01:48 -0000 1.2 *************** *** 278,313 **** --- 278,322 ---- { dapl_dbg_log(DAPL_DBG_TYPE_UTIL," close_hca: %p->%p\n", hca_ptr,hca_ptr->ib_hca_handle); if (hca_ptr->ib_hca_handle != IB_INVALID_HANDLE) { if (rdma_destroy_id(hca_ptr->ib_trans.cm_id)) return(dapl_convert_errno(errno,"ib_close_device")); hca_ptr->ib_hca_handle = IB_INVALID_HANDLE; } + dapl_os_lock(&g_hca_lock); + if (g_ib_thread_state != IB_THREAD_RUN) { + dapl_os_unlock(&g_hca_lock); + goto bail; + } + dapl_os_unlock(&g_hca_lock); + /* * Remove hca from async and CQ event processing list * Wakeup work thread to remove from polling list */ hca_ptr->ib_trans.destroy = 1; write(g_ib_pipe[1], "w", sizeof "w"); /* wait for thread to remove HCA references */ while (hca_ptr->ib_trans.destroy != 2) { struct timespec sleep, remain; sleep.tv_sec = 0; sleep.tv_nsec = 10000000; /* 10 ms */ + write(g_ib_pipe[1], "w", sizeof "w"); dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread_destroy: wait on hca %p destroy\n"); nanosleep (&sleep, &remain); } + bail: return (DAT_SUCCESS); } /* * dapls_ib_query_hca * * Query the hca attribute * * Input: * hca_handl hca handle Index: dapl_ib_util.h =================================================================== RCS file: /cvsroot/dapl/dapl/openib_cma/dapl_ib_util.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C10 -d -r1.1 -r1.2 *** dapl_ib_util.h 5 Dec 2005 16:48:36 -0000 1.1 --- dapl_ib_util.h 28 Feb 2006 16:01:48 -0000 1.2 *************** *** 288,308 **** /* * Convert errno to DAT_RETURN values */ STATIC _INLINE_ DAT_RETURN dapl_convert_errno( IN int err, IN const char *str ) { if (!err) return DAT_SUCCESS; #if DAPL_DBG ! if ((err != EAGAIN) && (err != ETIME) && (err != ETIMEDOUT)) dapl_dbg_log (DAPL_DBG_TYPE_ERR," %s %s\n", str, strerror(err)); #endif switch( err ) { case EOVERFLOW : return DAT_LENGTH_ERROR; case EACCES : return DAT_PRIVILEGES_VIOLATION; case ENXIO : case ERANGE : case EPERM : return DAT_PROTECTION_VIOLATION; --- 288,309 ---- /* * Convert errno to DAT_RETURN values */ STATIC _INLINE_ DAT_RETURN dapl_convert_errno( IN int err, IN const char *str ) { if (!err) return DAT_SUCCESS; #if DAPL_DBG ! if ((err != EAGAIN) && (err != ETIME) && ! (err != ETIMEDOUT) && (err != EINTR)) dapl_dbg_log (DAPL_DBG_TYPE_ERR," %s %s\n", str, strerror(err)); #endif switch( err ) { case EOVERFLOW : return DAT_LENGTH_ERROR; case EACCES : return DAT_PRIVILEGES_VIOLATION; case ENXIO : case ERANGE : case EPERM : return DAT_PROTECTION_VIOLATION; |
From: James L. <jle...@us...> - 2006-01-09 16:58:36
|
Update of /cvsroot/dapl/dapl/openib_cma In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9382/dapl/openib_cma Modified Files: dapl_ib_cm.c Log Message: Fix disconnect event processing and update dtest to validate. 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_cma/dapl_ib_cm.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C10 -d -r1.1 -r1.2 *** dapl_ib_cm.c 5 Dec 2005 16:48:36 -0000 1.1 --- dapl_ib_cm.c 9 Jan 2006 16:58:28 -0000 1.2 *************** *** 28,48 **** * Module: uDAPL * * Filename: dapl_ib_cm.c * * Author: Arlin Davis * * Created: 3/10/2005 * * Description: * ! * The uDAPL openib provider - connection management * **************************************************************************** * Source Control System Information * * $Id$ * * Copyright (c) 2005 Voltaire Inc. All rights reserved. * Copyright (c) 2005 Intel Corporation. All rights reserved. * Copyright (c) 2004-2005, Mellanox Technologies, Inc. All rights reserved. * Copyright (c) 2003 Topspin Corporation. All rights reserved. --- 28,48 ---- * Module: uDAPL * * Filename: dapl_ib_cm.c * * Author: Arlin Davis * * Created: 3/10/2005 * * Description: * ! * The OpenIB uCMA provider - uCMA connection management * **************************************************************************** * Source Control System Information * * $Id$ * * Copyright (c) 2005 Voltaire Inc. All rights reserved. * Copyright (c) 2005 Intel Corporation. All rights reserved. * Copyright (c) 2004-2005, Mellanox Technologies, Inc. All rights reserved. * Copyright (c) 2003 Topspin Corporation. All rights reserved. *************** *** 280,299 **** --- 280,305 ---- ntohs(((struct sockaddr_in *) &conn->cm_id->route.addr.dst_addr)->sin_port), ntohl(((struct sockaddr_in *) &conn->cm_id->route.addr.dst_addr)->sin_addr.s_addr)); dapl_evd_connection_callback(conn, IB_CME_CONNECTED, event->private_data, conn->ep); break; case RDMA_CM_EVENT_DISCONNECTED: + /* validate EP handle */ + if (!DAPL_BAD_HANDLE(conn->ep, DAPL_MAGIC_EP)) + dapl_evd_connection_callback(conn, + IB_CME_DISCONNECTED, + NULL, + conn->ep); break; default: dapl_dbg_log( DAPL_DBG_TYPE_ERR, " dapli_cm_active_cb_handler: Unexpected CM " "event %d on ID 0x%p\n", event->event, conn->cm_id); break; } dapl_os_lock(&conn->lock); *************** *** 357,376 **** --- 363,389 ---- ntohs(((struct sockaddr_in *) &conn->cm_id->route.addr.src_addr)->sin_port), ntohl(((struct sockaddr_in *) &conn->cm_id->route.addr.dst_addr)->sin_addr.s_addr)); dapls_cr_callback(conn, IB_CME_CONNECTED, NULL, conn->sp); break; case RDMA_CM_EVENT_DISCONNECTED: + /* validate SP handle context */ + if (!DAPL_BAD_HANDLE(conn->sp, DAPL_MAGIC_PSP) || + !DAPL_BAD_HANDLE(conn->sp, DAPL_MAGIC_RSP)) + dapls_cr_callback(conn, + IB_CME_DISCONNECTED, + NULL, + conn->sp); break; default: dapl_dbg_log(DAPL_DBG_TYPE_ERR, " passive_cb: " "Unexpected CM event %d on ID 0x%p\n", event->event, conn->cm_id); break; } dapl_os_lock(&conn->lock); destroy = conn->destroy; *************** *** 489,523 **** if (conn == IB_INVALID_HANDLE) return DAT_SUCCESS; /* no graceful half-pipe disconnect option */ ret = rdma_disconnect(conn->cm_id); if (ret) dapl_dbg_log(DAPL_DBG_TYPE_ERR, " disconnect: ID %p ret %d\n", ep_ptr->cm_handle, ret); ! /* ! * uDAPL does NOT expect disconnect callback from provider ! * with abrupt close. uDAPL will callback with DISC event when ! * from provider returns. So, if callback is expected from ! * rdma_cma then block and don't post the event during callback. */ - if (close_flags != DAT_CLOSE_ABRUPT_FLAG) - { - if (ep_ptr->cr_ptr) - dapls_cr_callback(conn, IB_CME_DISCONNECTED, NULL, - ((DAPL_CR *)ep_ptr->cr_ptr)->sp_ptr); - else - dapl_evd_connection_callback(conn, IB_CME_DISCONNECTED, - NULL, ep_ptr); - } return DAT_SUCCESS; } /* * dapls_ib_disconnect_clean * * Clean up outstanding connection data. This routine is invoked * after the final disconnect callback has occurred. Only on the * ACTIVE side of a connection. * --- 502,525 ---- if (conn == IB_INVALID_HANDLE) return DAT_SUCCESS; /* no graceful half-pipe disconnect option */ ret = rdma_disconnect(conn->cm_id); if (ret) dapl_dbg_log(DAPL_DBG_TYPE_ERR, " disconnect: ID %p ret %d\n", ep_ptr->cm_handle, ret); ! /* ! * DAT event notification occurs from the callback ! * Note: will fire even if DREQ goes unanswered on timeout */ return DAT_SUCCESS; } /* * dapls_ib_disconnect_clean * * Clean up outstanding connection data. This routine is invoked * after the final disconnect callback has occurred. Only on the * ACTIVE side of a connection. * *************** *** 530,554 **** * * Returns: * void * */ void dapls_ib_disconnect_clean(IN DAPL_EP *ep_ptr, IN DAT_BOOLEAN active, IN const ib_cm_events_t ib_cm_event) { ! /* ! * Clean up outstanding connection state ! */ ! dapls_ib_disconnect(ep_ptr, DAT_CLOSE_ABRUPT_FLAG); ! } /* * dapl_ib_setup_conn_listener * * Have the CM set up a connection listener. * * Input: * ibm_hca_handle HCA handle * qp_handle QP handle --- 532,553 ---- * * Returns: * void * */ void dapls_ib_disconnect_clean(IN DAPL_EP *ep_ptr, IN DAT_BOOLEAN active, IN const ib_cm_events_t ib_cm_event) { ! /* nothing to do */ ! return; } /* * dapl_ib_setup_conn_listener * * Have the CM set up a connection listener. * * Input: * ibm_hca_handle HCA handle * qp_handle QP handle *************** *** 585,605 **** dapl_os_free(conn, sizeof(*conn)); return(dapl_convert_errno(errno,"setup_listener")); } /* open identifies the local device; per DAT specification */ ((struct sockaddr_in *)&ia_ptr->hca_ptr->hca_address)->sin_port = htons(MAKE_PORT(ServiceID)); if (rdma_bind_addr(conn->cm_id, (struct sockaddr *)&ia_ptr->hca_ptr->hca_address)) { ! dat_status = dapl_convert_errno(errno,"setup_listener"); goto bail; } dapl_dbg_log(DAPL_DBG_TYPE_CM, " listen(ia_ptr %p SID %d sp %p conn %p id %d)\n", ia_ptr, MAKE_PORT(ServiceID), sp_ptr, conn, conn->cm_id); sp_ptr->cm_srvc_handle = conn; conn->sp = sp_ptr; --- 584,608 ---- dapl_os_free(conn, sizeof(*conn)); return(dapl_convert_errno(errno,"setup_listener")); } /* open identifies the local device; per DAT specification */ ((struct sockaddr_in *)&ia_ptr->hca_ptr->hca_address)->sin_port = htons(MAKE_PORT(ServiceID)); if (rdma_bind_addr(conn->cm_id, (struct sockaddr *)&ia_ptr->hca_ptr->hca_address)) { ! if (errno == -EBUSY) ! dat_status = DAT_CONN_QUAL_IN_USE; ! else ! dat_status = ! dapl_convert_errno(errno,"setup_listener"); goto bail; } dapl_dbg_log(DAPL_DBG_TYPE_CM, " listen(ia_ptr %p SID %d sp %p conn %p id %d)\n", ia_ptr, MAKE_PORT(ServiceID), sp_ptr, conn, conn->cm_id); sp_ptr->cm_srvc_handle = conn; conn->sp = sp_ptr; |
From: James L. <jle...@us...> - 2005-12-05 16:48:45
|
Update of /cvsroot/dapl/dapl/udapl In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16755/dapl/udapl Modified Files: Makefile Log Message: Added CMA API support. Signed-off-by: Arlin Davis <ar...@ic...> Signed-off-by: James Lentini <jle...@ne...> Index: Makefile =================================================================== RCS file: /cvsroot/dapl/dapl/udapl/Makefile,v retrieving revision 1.70 retrieving revision 1.71 diff -C10 -d -r1.70 -r1.71 *** Makefile 26 Oct 2005 21:13:54 -0000 1.70 --- Makefile 5 Dec 2005 16:48:37 -0000 1.71 *************** *** 49,69 **** LINUX = $(TOPDIR)/../udapl/linux CC = gcc MACH=$(shell uname -m) OSRELEASE=$(shell expr `uname -r | cut -f1 -d.` \* 65536 + `uname -r | cut -f2 -d.`) # # Set up the default provider # ifndef $VERBS ! VERBS=openib endif # # Set an OS Vendor # # OS_VENDOR = REDHAT_EL4 # OS_VENDOR = SuSE # # --- 49,69 ---- LINUX = $(TOPDIR)/../udapl/linux CC = gcc MACH=$(shell uname -m) OSRELEASE=$(shell expr `uname -r | cut -f1 -d.` \* 65536 + `uname -r | cut -f2 -d.`) # # Set up the default provider # ifndef $VERBS ! VERBS=openib_cma endif # # Set an OS Vendor # # OS_VENDOR = REDHAT_EL4 # OS_VENDOR = SuSE # # *************** *** 145,164 **** --- 145,174 ---- # OpenIB provider with Socket CM # ifeq ($(VERBS),openib_scm) PROVIDER = $(TOPDIR)/../openib_scm CFLAGS += -DOPENIB CFLAGS += -DCQ_WAIT_OBJECT CFLAGS += -I/usr/local/include/infiniband endif # + # OpenIB provider with IB CMA + # + ifeq ($(VERBS),openib_cma) + PROVIDER = $(TOPDIR)/../openib_cma + CFLAGS += -DOPENIB + CFLAGS += -DCQ_WAIT_OBJECT + CFLAGS += -I/usr/local/include/infiniband + endif + + # # If an implementation supports CM and DTO completions on the same EVD # then DAPL_MERGE_CM_DTO should be set # CFLAGS += -DDAPL_MERGE_CM_DTO=1 # # If an implementation supports Shared Memory, enable # VN_MEM_SHARED_VIRTUAL_SUPPORT # CFLAGS += -DVN_MEM_SHARED_VIRTUAL_SUPPORT=1 CFLAGS += -I. *************** *** 264,283 **** --- 274,300 ---- PROVIDER_SRCS += dapl_ib_cm.c dapl_ib_mem.c endif ifeq ($(VERBS),openib_scm) LDFLAGS += -libverbs LDFLAGS += -rpath /usr/local/lib -L /usr/local/lib PROVIDER_SRCS = dapl_ib_util.c dapl_ib_cq.c dapl_ib_qp.c \ dapl_ib_cm.c dapl_ib_mem.c endif + ifeq ($(VERBS),openib_cma) + LDFLAGS += -libverbs -lrdmacm + LDFLAGS += -rpath /usr/local/lib -L /usr/local/lib + PROVIDER_SRCS = dapl_ib_util.c dapl_ib_cq.c dapl_ib_qp.c \ + dapl_ib_cm.c dapl_ib_mem.c + endif + UDAPL_SRCS = dapl_init.c \ dapl_evd_create.c \ dapl_evd_query.c \ dapl_cno_create.c \ dapl_cno_modify_agent.c \ dapl_cno_free.c \ dapl_cno_wait.c \ dapl_cno_query.c \ dapl_lmr_create.c \ dapl_evd_wait.c \ |
From: James L. <jle...@us...> - 2005-12-05 16:48:45
|
Update of /cvsroot/dapl/doc In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16755/doc Modified Files: dat.conf Log Message: Added CMA API support. Signed-off-by: Arlin Davis <ar...@ic...> Signed-off-by: James Lentini <jle...@ne...> Index: dat.conf =================================================================== RCS file: /cvsroot/dapl/doc/dat.conf,v retrieving revision 1.4 retrieving revision 1.5 diff -C10 -d -r1.4 -r1.5 *** dat.conf 25 Apr 2005 17:29:42 -0000 1.4 --- dat.conf 5 Dec 2005 16:48:37 -0000 1.5 *************** *** 1,15 **** # ! # DAT 1.1 configuration file # # Each entry should have the following fields: # ! # <ia_name> <api_version> <threadsafety> <default> <lib_path> \ # <provider_version> <ia_params> <platform_params> # ! ! ia0 u1.1 nonthreadsafe default /usr/lib/libdapl.so ri.1.1 "ia_params" "pd_params" ! ! # Example for openib using the first Mellanox adapter, port 1 and port 2 ! OpenIB1 u1.2 nonthreadsafe default /usr/local/openib_dapl/udapl/Target/libdapl.so mv_dapl.1.2 "mthca0 1" "" ! OpenIB2 u1.2 nonthreadsafe default /usr/local/openib_dapl/udapl/Target/libdapl.so mv_dapl.1.2 "mthca0 2" "" ! --- 1,17 ---- # ! # DAT 1.2 configuration file # # Each entry should have the following fields: # ! # <ia_name> <api_version> <threadsafety> <default> <lib_path> \ # <provider_version> <ia_params> <platform_params> # ! # Example for openib_cma and openib_scm ! # ! # For scm version you specify <ia_params> as actual device name and port ! # For cma version you specify <ia_params> as the ib device network address or network hostname and 0 for port ! # ! OpenIB-scm1 u1.2 nonthreadsafe default /usr/local/openib_dapl/udapl/Target/libdapl.so mv_dapl.1.2 "mthca0 1" "" ! OpenIB-scm2 u1.2 nonthreadsafe default /usr/local/openib_dapl/udapl/Target/libdapl.so mv_dapl.1.2 "mthca0 2" "" ! OpenIB-cma-ip u1.2 nonthreadsafe default /usr/local/openib_dapl/udapl/Target/libdapl.so mv_dapl.1.2 "192.168.0.22 0" "" ! OpenIB-cma-name u1.2 nonthreadsafe default /usr/local/openib_dapl/udapl/Target/libdapl.so mv_dapl.1.2 "svr1-ib0 0" "" |
Update of /cvsroot/dapl/dapl/openib_cma In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16755/dapl/openib_cma Added Files: README dapl_ib_cm.c dapl_ib_cq.c dapl_ib_dto.h dapl_ib_mem.c dapl_ib_qp.c dapl_ib_util.c dapl_ib_util.h Log Message: Added CMA API support. Signed-off-by: Arlin Davis <ar...@ic...> Signed-off-by: James Lentini <jle...@ne...> --- NEW FILE: README --- OpenIB uDAPL provider using rdma cma and openib verbs interfaces to build: cd dapl/udapl make VERBS=openib_cma clean make VERBS=openib_cma Modifications to common code: - added dapl/openib_cma directory dapl/udapl/Makefile New files for openib_scm provider dapl/openib_cma/dapl_ib_cq.c dapl/openib_cma/dapl_ib_dto.h dapl/openib_cma/dapl_ib_mem.c dapl/openib_cma/dapl_ib_qp.c dapl/openib_cma/dapl_ib_util.c dapl/openib_cma/dapl_ib_util.h dapl/openib_cma/dapl_ib_cm.c A simple dapl test just for openib_scm testing... test/dtest/dtest.c test/dtest/makefile server: dtest -s client: dtest -h hostname known issues: no memory windows support in ibverbs, dat_create_rmr fails. --- NEW FILE: dapl_ib_cm.c --- /* * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. [...1068 lines suppressed...] " cm_event: UNEXPECTED EVENT=%p ID=%p CTX=%p\n", event->event, event->id, event->id->context); break; } rdma_ack_cm_event(event); } else { dapl_dbg_log(DAPL_DBG_TYPE_WARN, " cm_event: ERROR: rdma_get_cm_event() %d %d %s\n", ret, errno, strerror(errno)); } } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ --- NEW FILE: dapl_ib_cq.c --- /* * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /*************************************************************************** * * Module: uDAPL * * Filename: dapl_ib_cq.c * * Author: Arlin Davis * * Created: 3/10/2005 * * Description: * * The uDAPL openib provider - completion queue * **************************************************************************** * Source Control System Information * * $Id: dapl_ib_cq.c,v 1.1 2005/12/05 16:48:36 jlentini Exp $ * * Copyright (c) 2005 Intel Corporation. All rights reserved. * **************************************************************************/ #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->cm_id->verbs, 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; DAT_DTO_COMPLETION_STATUS dat_status; } ib_status_map[] = { /* 00 */ { IBV_WC_SUCCESS, DAT_DTO_SUCCESS}, /* 01 */ { IBV_WC_LOC_LEN_ERR, DAT_DTO_ERR_LOCAL_LENGTH}, /* 02 */ { IBV_WC_LOC_QP_OP_ERR, DAT_DTO_ERR_LOCAL_EP}, /* 03 */ { IBV_WC_LOC_EEC_OP_ERR, DAT_DTO_ERR_TRANSPORT}, /* 04 */ { IBV_WC_LOC_PROT_ERR, DAT_DTO_ERR_LOCAL_PROTECTION}, /* 05 */ { IBV_WC_WR_FLUSH_ERR, DAT_DTO_ERR_FLUSHED}, /* 06 */ { IBV_WC_MW_BIND_ERR, DAT_RMR_OPERATION_FAILED}, /* 07 */ { IBV_WC_BAD_RESP_ERR, DAT_DTO_ERR_BAD_RESPONSE}, /* 08 */ { IBV_WC_LOC_ACCESS_ERR, DAT_DTO_ERR_LOCAL_PROTECTION}, /* 09 */ { IBV_WC_REM_INV_REQ_ERR, DAT_DTO_ERR_REMOTE_RESPONDER}, /* 10 */ { IBV_WC_REM_ACCESS_ERR, DAT_DTO_ERR_REMOTE_ACCESS}, /* 11 */ { IBV_WC_REM_OP_ERR, DAT_DTO_ERR_REMOTE_RESPONDER}, /* 12 */ { IBV_WC_RETRY_EXC_ERR, DAT_DTO_ERR_TRANSPORT}, /* 13 */ { IBV_WC_RNR_RETRY_EXC_ERR, DAT_DTO_ERR_RECEIVER_NOT_READY}, /* 14 */ { IBV_WC_LOC_RDD_VIOL_ERR, DAT_DTO_ERR_LOCAL_PROTECTION}, /* 15 */ { IBV_WC_REM_INV_RD_REQ_ERR, DAT_DTO_ERR_REMOTE_RESPONDER}, /* 16 */ { IBV_WC_REM_ABORT_ERR, DAT_DTO_ERR_REMOTE_RESPONDER}, /* 17 */ { IBV_WC_INV_EECN_ERR, DAT_DTO_ERR_TRANSPORT}, /* 18 */ { IBV_WC_INV_EEC_STATE_ERR, DAT_DTO_ERR_TRANSPORT}, /* 19 */ { IBV_WC_FATAL_ERR, DAT_DTO_ERR_TRANSPORT}, /* 20 */ { IBV_WC_RESP_TIMEOUT_ERR, DAT_DTO_ERR_RECEIVER_NOT_READY}, /* 21 */ { IBV_WC_GENERAL_ERR, DAT_DTO_ERR_TRANSPORT}, }; /* * dapls_ib_get_dto_status * * Return the DAT status of a DTO operation * * Input: * cqe_ptr pointer to completion queue entry * * Output: * none * * Returns: * Value from ib_status_map table above */ DAT_DTO_COMPLETION_STATUS dapls_ib_get_dto_status (IN ib_work_completion_t *cqe_ptr) { uint32_t ib_status; int i; ib_status = DAPL_GET_CQE_STATUS (cqe_ptr); /* * Due to the implementation of verbs completion code, we need to * search the table for the correct value rather than assuming * linear distribution. */ for (i=0; i <= IBV_WC_GENERAL_ERR; i++) { if (ib_status == ib_status_map[i].ib_status) { if (ib_status != IBV_WC_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_DTO_COMP_ERR, " DTO completion ERROR: %d: op %#x\n", ib_status, DAPL_GET_CQE_OPTYPE (cqe_ptr)); } return ib_status_map[i].dat_status; } } dapl_dbg_log(DAPL_DBG_TYPE_DTO_COMP_ERR, " DTO completion ERROR: %d: op %#x\n", ib_status, DAPL_GET_CQE_OPTYPE (cqe_ptr)); return DAT_DTO_FAILURE; } DAT_RETURN dapls_ib_get_async_event(IN ib_error_record_t *err_record, OUT DAT_EVENT_NUMBER *async_event) { DAT_RETURN dat_status = DAT_SUCCESS; int err_code = err_record->event_type; switch (err_code) { /* OVERFLOW error */ case IBV_EVENT_CQ_ERR: *async_event = DAT_ASYNC_ERROR_EVD_OVERFLOW; break; /* INTERNAL errors */ case IBV_EVENT_DEVICE_FATAL: *async_event = DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR; break; /* CATASTROPHIC errors */ case IBV_EVENT_PORT_ERR: *async_event = DAT_ASYNC_ERROR_IA_CATASTROPHIC; break; /* BROKEN QP error */ case IBV_EVENT_SQ_DRAINED: case IBV_EVENT_QP_FATAL: case IBV_EVENT_QP_REQ_ERR: case IBV_EVENT_QP_ACCESS_ERR: *async_event = DAT_ASYNC_ERROR_EP_BROKEN; break; /* connection completion */ case IBV_EVENT_COMM_EST: *async_event = DAT_CONNECTION_EVENT_ESTABLISHED; break; /* TODO: process HW state changes */ case IBV_EVENT_PATH_MIG: case IBV_EVENT_PATH_MIG_ERR: case IBV_EVENT_PORT_ACTIVE: case IBV_EVENT_LID_CHANGE: case IBV_EVENT_PKEY_CHANGE: case IBV_EVENT_SM_CHANGE: default: dat_status = DAT_ERROR (DAT_NOT_IMPLEMENTED, 0); } return dat_status; } /* * dapl_ib_cq_alloc * * Alloc a CQ * * Input: * ia_handle IA handle * evd_ptr pointer to EVD struct * cqlen minimum QLen * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * */ 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; } /* * dapl_ib_cq_resize * * Alloc a CQ * * Input: * ia_handle IA handle * evd_ptr pointer to EVD struct * cqlen minimum QLen * * Output: * none * * Returns: * DAT_SUCCESS * 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")); } /* update EVD with new cq handle and size */ evd_ptr->ib_cq_handle = new_cq; *cqlen = new_cq->cqe; /* arm cq for events */ dapls_set_cq_notify (ia_ptr, evd_ptr); return DAT_SUCCESS; } /* * dapls_ib_cq_free * * destroy a CQ * * Input: * ia_handle IA handle * evd_ptr pointer to EVD struct * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER * */ DAT_RETURN dapls_ib_cq_free(IN DAPL_IA *ia_ptr, IN DAPL_EVD *evd_ptr) { if (evd_ptr->ib_cq_handle != IB_INVALID_HANDLE) { /* copy all entries on CQ to EVD before destroying */ dapls_evd_copy_cq(evd_ptr); if (ibv_destroy_cq(evd_ptr->ib_cq_handle)) return(dapl_convert_errno(errno,"destroy_cq")); evd_ptr->ib_cq_handle = IB_INVALID_HANDLE; } return DAT_SUCCESS; } /* * dapls_set_cq_notify * * Set the CQ notification for next * * Input: * hca_handl hca handle * DAPL_EVD evd handle * * Output: * none * * Returns: * DAT_SUCCESS * dapl_convert_errno */ DAT_RETURN dapls_set_cq_notify(IN DAPL_IA *ia_ptr, IN DAPL_EVD *evd_ptr) { if (ibv_req_notify_cq(evd_ptr->ib_cq_handle, 0)) return(dapl_convert_errno(errno,"notify_cq")); else return DAT_SUCCESS; } /* * dapls_ib_completion_notify * * Set the CQ notification type * * Input: * hca_handl hca handle * evd_ptr evd handle * type notification type * * Output: * none * * Returns: * DAT_SUCCESS * dapl_convert_errno */ DAT_RETURN dapls_ib_completion_notify(IN ib_hca_handle_t hca_handle, IN DAPL_EVD *evd_ptr, IN ib_notification_type_t type) { if (ibv_req_notify_cq( evd_ptr->ib_cq_handle, type )) return(dapl_convert_errno(errno,"notify_cq_type")); else return DAT_SUCCESS; } /* * dapls_ib_completion_poll * * CQ poll for completions * * Input: * hca_handl hca handle * evd_ptr evd handle * wc_ptr work completion * * Output: * none * * Returns: * DAT_SUCCESS * DAT_QUEUE_EMPTY * */ DAT_RETURN dapls_ib_completion_poll(IN DAPL_HCA *hca_ptr, IN DAPL_EVD *evd_ptr, IN ib_work_completion_t *wc_ptr) { if (ibv_poll_cq(evd_ptr->ib_cq_handle, 1, wc_ptr) == 1) return DAT_SUCCESS; return DAT_QUEUE_EMPTY; } #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_UTIL, " 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_UTIL, " 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_UTIL, " 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 * tab-width: 8 * End: */ --- NEW FILE: dapl_ib_dto.h --- /* * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /*************************************************************************** * * Module: uDAPL * * Filename: dapl_ib_dto.h * * Author: Arlin Davis * * Created: 3/10/2005 * * Description: * * The uDAPL openib provider - DTO operations and CQE macros * **************************************************************************** * Source Control System Information * * $Id: dapl_ib_dto.h,v 1.1 2005/12/05 16:48:36 jlentini Exp $ * * Copyright (c) 2005 Intel Corporation. All rights reserved. * **************************************************************************/ #ifndef _DAPL_IB_DTO_H_ #define _DAPL_IB_DTO_H_ #include "dapl_ib_util.h" #define DEFAULT_DS_ENTRIES 8 STATIC _INLINE_ int dapls_cqe_opcode(ib_work_completion_t *cqe_p); /* * dapls_ib_post_recv * * Provider specific Post RECV function */ STATIC _INLINE_ DAT_RETURN dapls_ib_post_recv ( IN DAPL_EP *ep_ptr, IN DAPL_COOKIE *cookie, IN DAT_COUNT segments, IN DAT_LMR_TRIPLET *local_iov ) { ib_data_segment_t ds_array[DEFAULT_DS_ENTRIES]; ib_data_segment_t *ds_array_p; struct ibv_recv_wr wr; struct ibv_recv_wr *bad_wr; DAT_COUNT i, total_len; dapl_dbg_log(DAPL_DBG_TYPE_EP, " post_rcv: ep %p cookie %p segs %d l_iov %p\n", ep_ptr, cookie, segments, local_iov); if (segments <= DEFAULT_DS_ENTRIES) ds_array_p = ds_array; else ds_array_p = dapl_os_alloc(segments * sizeof(ib_data_segment_t)); if (NULL == ds_array_p) return (DAT_INSUFFICIENT_RESOURCES); /* setup work request */ total_len = 0; wr.next = 0; wr.num_sge = 0; wr.wr_id = (uint64_t)(uintptr_t)cookie; wr.sg_list = ds_array_p; for (i = 0; i < segments; i++) { if (!local_iov[i].segment_length) continue; ds_array_p->addr = (uint64_t) local_iov[i].virtual_address; ds_array_p->length = local_iov[i].segment_length; ds_array_p->lkey = local_iov[i].lmr_context; dapl_dbg_log(DAPL_DBG_TYPE_EP, " post_rcv: l_key 0x%x va %p len %d\n", ds_array_p->lkey, ds_array_p->addr, ds_array_p->length ); total_len += ds_array_p->length; wr.num_sge++; ds_array_p++; } if (cookie != NULL) cookie->val.dto.size = total_len; if (ibv_post_recv(ep_ptr->qp_handle->cm_id->qp, &wr, &bad_wr)) return( dapl_convert_errno(EFAULT,"ibv_recv") ); return DAT_SUCCESS; } /* * dapls_ib_post_send * * Provider specific Post SEND function */ STATIC _INLINE_ DAT_RETURN dapls_ib_post_send ( IN DAPL_EP *ep_ptr, IN ib_send_op_type_t op_type, IN DAPL_COOKIE *cookie, IN DAT_COUNT segments, IN DAT_LMR_TRIPLET *local_iov, IN const DAT_RMR_TRIPLET *remote_iov, IN DAT_COMPLETION_FLAGS completion_flags) { dapl_dbg_log(DAPL_DBG_TYPE_EP, " post_snd: ep %p op %d ck %p sgs", "%d l_iov %p r_iov %p f %d\n", ep_ptr, op_type, cookie, segments, local_iov, remote_iov, completion_flags); ib_data_segment_t ds_array[DEFAULT_DS_ENTRIES]; ib_data_segment_t *ds_array_p; struct ibv_send_wr wr; struct ibv_send_wr *bad_wr; ib_hca_transport_t *ibt_ptr = &ep_ptr->header.owner_ia->hca_ptr->ib_trans; DAT_COUNT i, total_len; dapl_dbg_log(DAPL_DBG_TYPE_EP, " post_snd: ep %p cookie %p segs %d l_iov %p\n", ep_ptr, cookie, segments, local_iov); if(segments <= DEFAULT_DS_ENTRIES) ds_array_p = ds_array; else ds_array_p = dapl_os_alloc(segments * sizeof(ib_data_segment_t)); if (NULL == ds_array_p) return (DAT_INSUFFICIENT_RESOURCES); /* setup the work request */ wr.next = 0; wr.opcode = op_type; wr.num_sge = 0; wr.send_flags = 0; wr.wr_id = (uint64_t)(uintptr_t)cookie; wr.sg_list = ds_array_p; total_len = 0; for (i = 0; i < segments; i++ ) { if ( !local_iov[i].segment_length ) continue; ds_array_p->addr = (uint64_t) local_iov[i].virtual_address; ds_array_p->length = local_iov[i].segment_length; ds_array_p->lkey = local_iov[i].lmr_context; dapl_dbg_log(DAPL_DBG_TYPE_EP, " post_snd: lkey 0x%x va %p len %d\n", ds_array_p->lkey, ds_array_p->addr, ds_array_p->length ); total_len += ds_array_p->length; wr.num_sge++; ds_array_p++; } if (cookie != NULL) cookie->val.dto.size = total_len; if ((op_type == OP_RDMA_WRITE) || (op_type == OP_RDMA_READ)) { wr.wr.rdma.remote_addr = remote_iov->target_address; wr.wr.rdma.rkey = remote_iov->rmr_context; dapl_dbg_log(DAPL_DBG_TYPE_EP, " post_snd_rdma: rkey 0x%x va %#016Lx\n", wr.wr.rdma.rkey, wr.wr.rdma.remote_addr); } /* inline data for send or write ops */ if ((total_len <= ibt_ptr->max_inline_send) && ((op_type == OP_SEND) || (op_type == OP_RDMA_WRITE))) wr.send_flags |= IBV_SEND_INLINE; /* set completion flags in work request */ wr.send_flags |= (DAT_COMPLETION_SUPPRESS_FLAG & completion_flags) ? 0 : IBV_SEND_SIGNALED; wr.send_flags |= (DAT_COMPLETION_BARRIER_FENCE_FLAG & completion_flags) ? IBV_SEND_FENCE : 0; wr.send_flags |= (DAT_COMPLETION_SOLICITED_WAIT_FLAG & completion_flags) ? IBV_SEND_SOLICITED : 0; dapl_dbg_log(DAPL_DBG_TYPE_EP, " post_snd: op 0x%x flags 0x%x sglist %p, %d\n", wr.opcode, wr.send_flags, wr.sg_list, wr.num_sge); if (ibv_post_send(ep_ptr->qp_handle->cm_id->qp, &wr, &bad_wr)) return( dapl_convert_errno(EFAULT,"ibv_recv") ); dapl_dbg_log(DAPL_DBG_TYPE_EP," post_snd: returned\n"); return DAT_SUCCESS; } STATIC _INLINE_ DAT_RETURN dapls_ib_optional_prv_dat( IN DAPL_CR *cr_ptr, IN const void *event_data, OUT DAPL_CR **cr_pp) { return DAT_SUCCESS; } STATIC _INLINE_ int dapls_cqe_opcode(ib_work_completion_t *cqe_p) { switch (cqe_p->opcode) { case IBV_WC_SEND: return (OP_SEND); case IBV_WC_RDMA_WRITE: return (OP_RDMA_WRITE); case IBV_WC_RDMA_READ: return (OP_RDMA_READ); case IBV_WC_COMP_SWAP: return (OP_COMP_AND_SWAP); case IBV_WC_FETCH_ADD: return (OP_FETCH_AND_ADD); case IBV_WC_BIND_MW: return (OP_BIND_MW); case IBV_WC_RECV: return (OP_RECEIVE); case IBV_WC_RECV_RDMA_WITH_IMM: return (OP_RECEIVE_IMM); default: return (OP_INVALID); } } #define DAPL_GET_CQE_OPTYPE(cqe_p) dapls_cqe_opcode(cqe_p) #define DAPL_GET_CQE_WRID(cqe_p) ((ib_work_completion_t*)cqe_p)->wr_id #define DAPL_GET_CQE_STATUS(cqe_p) ((ib_work_completion_t*)cqe_p)->status #define DAPL_GET_CQE_BYTESNUM(cqe_p) ((ib_work_completion_t*)cqe_p)->byte_len #define DAPL_GET_CQE_IMMED_DATA(cqe_p) ((ib_work_completion_t*)cqe_p)->imm_data #endif /* _DAPL_IB_DTO_H_ */ --- NEW FILE: dapl_ib_mem.c --- /* * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_det_mem.c * * PURPOSE: Intel DET APIs: Memory windows, registration, * and protection domain * * $Id: dapl_ib_mem.c,v 1.1 2005/12/05 16:48:36 jlentini Exp $ * **********************************************************************/ #include <sys/ioctl.h> /* for IOCTL's */ #include <sys/types.h> /* for socket(2) and related bits and pieces */ #include <sys/socket.h> /* for socket(2) */ #include <net/if.h> /* for struct ifreq */ #include <net/if_arp.h> /* for ARPHRD_ETHER */ #include <unistd.h> /* for _SC_CLK_TCK */ #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_lmr_util.h" /* * dapls_convert_privileges * * Convert LMR privileges to provider * * Input: * DAT_MEM_PRIV_FLAGS * * Output: * none * * Returns: * ibv_access_flags * */ STATIC _INLINE_ int dapls_convert_privileges(IN DAT_MEM_PRIV_FLAGS privileges) { int access = 0; /* * if (DAT_MEM_PRIV_LOCAL_READ_FLAG & privileges) do nothing */ if (DAT_MEM_PRIV_LOCAL_WRITE_FLAG & privileges) access |= IBV_ACCESS_LOCAL_WRITE; if (DAT_MEM_PRIV_REMOTE_WRITE_FLAG & privileges) access |= IBV_ACCESS_REMOTE_WRITE; if (DAT_MEM_PRIV_REMOTE_READ_FLAG & privileges) access |= IBV_ACCESS_REMOTE_READ; if (DAT_MEM_PRIV_REMOTE_READ_FLAG & privileges) access |= IBV_ACCESS_REMOTE_READ; if (DAT_MEM_PRIV_REMOTE_READ_FLAG & privileges) access |= IBV_ACCESS_REMOTE_READ; return access; } /* * dapl_ib_pd_alloc * * Alloc a PD * * Input: * ia_handle IA handle * pz pointer to PZ struct * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_ib_pd_alloc(IN DAPL_IA *ia_ptr, IN DAPL_PZ *pz) { /* get a protection domain */ pz->pd_handle = ibv_alloc_pd(ia_ptr->hca_ptr->ib_hca_handle); if (!pz->pd_handle) return(dapl_convert_errno(ENOMEM,"alloc_pd")); dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " pd_alloc: pd_handle=%p\n", pz->pd_handle ); return DAT_SUCCESS; } /* * dapl_ib_pd_free * * Free a PD * * Input: * ia_handle IA handle * PZ_ptr pointer to PZ struct * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_STATE * */ DAT_RETURN dapls_ib_pd_free(IN DAPL_PZ *pz ) { if (pz->pd_handle != IB_INVALID_HANDLE) { if (ibv_dealloc_pd(pz->pd_handle)) return(dapl_convert_errno(errno,"dealloc_pd")); pz->pd_handle = IB_INVALID_HANDLE; } return DAT_SUCCESS; } /* * dapl_ib_mr_register * * Register a virtual memory region * * Input: * ia_handle IA handle * lmr pointer to dapl_lmr struct * virt_addr virtual address of beginning of mem region * length length of memory region * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_ib_mr_register(IN DAPL_IA *ia_ptr, IN DAPL_LMR *lmr, IN DAT_PVOID virt_addr, IN DAT_VLEN length, IN DAT_MEM_PRIV_FLAGS privileges) { ib_pd_handle_t ib_pd_handle; ib_pd_handle = ((DAPL_PZ *)lmr->param.pz_handle)->pd_handle; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " mr_register: ia=%p, lmr=%p va=%p ln=%d pv=0x%x\n", ia_ptr, lmr, virt_addr, length, privileges ); /* TODO: shared memory */ if (lmr->param.mem_type == DAT_MEM_TYPE_SHARED_VIRTUAL) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mr_register_shared: NOT IMPLEMENTED\n"); return DAT_ERROR (DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE); } /* local read is default on IB */ lmr->mr_handle = ibv_reg_mr(((DAPL_PZ *)lmr->param.pz_handle)->pd_handle, virt_addr, length, dapls_convert_privileges(privileges)); if (!lmr->mr_handle) return(dapl_convert_errno(ENOMEM,"reg_mr")); lmr->param.lmr_context = lmr->mr_handle->lkey; lmr->param.rmr_context = lmr->mr_handle->rkey; lmr->param.registered_size = length; lmr->param.registered_address = (DAT_VADDR)(uintptr_t)virt_addr; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " mr_register: mr=%p h %x pd %p ctx %p " "lkey=0x%x rkey=0x%x priv=%x\n", lmr->mr_handle, lmr->mr_handle->handle, lmr->mr_handle->pd, lmr->mr_handle->context, lmr->mr_handle->lkey, lmr->mr_handle->rkey, length, dapls_convert_privileges(privileges)); return DAT_SUCCESS; } /* * dapl_ib_mr_deregister * * Free a memory region * * Input: * lmr pointer to dapl_lmr struct * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_STATE * */ DAT_RETURN dapls_ib_mr_deregister(IN DAPL_LMR *lmr) { if (lmr->mr_handle != IB_INVALID_HANDLE) { if (ibv_dereg_mr(lmr->mr_handle)) return(dapl_convert_errno(errno,"dereg_pd")); lmr->mr_handle = IB_INVALID_HANDLE; } return DAT_SUCCESS; } /* * dapl_ib_mr_register_shared * * Register a virtual memory region * * Input: * ia_ptr IA handle * lmr pointer to dapl_lmr struct * virt_addr virtual address of beginning of mem region * length length of memory region * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_ib_mr_register_shared(IN DAPL_IA *ia_ptr, IN DAPL_LMR *lmr, IN DAT_MEM_PRIV_FLAGS privileges) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mr_register_shared: NOT IMPLEMENTED\n"); return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE); } /* * dapls_ib_mw_alloc * * Bind a protection domain to a memory window * * Input: * rmr Initialized rmr to hold binding handles * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_ib_mw_alloc (IN DAPL_RMR *rmr) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mw_alloc: NOT IMPLEMENTED\n"); return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE); } /* * dapls_ib_mw_free * * Release bindings of a protection domain to a memory window * * Input: * rmr Initialized rmr to hold binding handles * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_STATE * */ DAT_RETURN dapls_ib_mw_free(IN DAPL_RMR *rmr) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mw_free: NOT IMPLEMENTED\n"); return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE); } /* * dapls_ib_mw_bind * * Bind a protection domain to a memory window * * Input: * rmr Initialized rmr to hold binding handles * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER; * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_ib_mw_bind(IN DAPL_RMR *rmr, IN DAPL_LMR *lmr, IN DAPL_EP *ep, IN DAPL_COOKIE *cookie, IN DAT_VADDR virtual_address, IN DAT_VLEN length, IN DAT_MEM_PRIV_FLAGS mem_priv, IN DAT_BOOLEAN is_signaled) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mw_bind: NOT IMPLEMENTED\n"); return DAT_ERROR (DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE); } /* * dapls_ib_mw_unbind * * Unbind a protection domain from a memory window * * Input: * rmr Initialized rmr to hold binding handles * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER; * DAT_INVALID_STATE; * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_ib_mw_unbind(IN DAPL_RMR *rmr, IN DAPL_EP *ep, IN DAPL_COOKIE *cookie, IN DAT_BOOLEAN is_signaled ) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mw_unbind: NOT IMPLEMENTED\n"); return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE); } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ --- NEW FILE: dapl_ib_qp.c --- /* * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_det_qp.c * * PURPOSE: QP routines for access to DET Verbs * * $Id: dapl_ib_qp.c,v 1.1 2005/12/05 16:48:36 jlentini Exp $ **********************************************************************/ #include "dapl.h" #include "dapl_adapter_util.h" /* * dapl_ib_qp_alloc * * Alloc a QP * * Input: * *ep_ptr pointer to EP INFO * ib_hca_handle provider HCA handle * ib_pd_handle provider protection domain handle * cq_recv provider recv CQ handle * cq_send provider send CQ handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INTERNAL_ERROR * */ DAT_RETURN dapls_ib_qp_alloc(IN DAPL_IA *ia_ptr, IN DAPL_EP *ep_ptr, IN DAPL_EP *ep_ctx_ptr) { DAT_EP_ATTR *attr; DAPL_EVD *rcv_evd, *req_evd; ib_cq_handle_t rcv_cq, req_cq; ib_pd_handle_t ib_pd_handle; struct ibv_qp_init_attr qp_create; ib_cm_handle_t conn; struct rdma_cm_id *cm_id; dapl_dbg_log(DAPL_DBG_TYPE_EP, " qp_alloc: ia_ptr %p ep_ptr %p ep_ctx_ptr %p\n", ia_ptr, ep_ptr, ep_ctx_ptr); 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; /* * IMPLEMENTATION NOTE: * uDAPL allows consumers to post buffers on the EP after creation * and before a connect request (outbound and inbound). This forces * a binding to a device during the hca_open call and requires the * consumer to predetermine which device to listen on or connect from. * This restriction eliminates any option of listening or connecting * over multiple devices. uDAPL should add API's to resolve addresses * and bind to the device at the approriate time (before connect * and after CR arrives). Discovery should happen at connection time * based on addressing and not on static configuration during open. */ /* Allocate CM and initialize lock */ if ((conn = dapl_os_alloc(sizeof(*conn))) == NULL) return(dapl_convert_errno(ENOMEM, "create_cq")); dapl_os_memzero(conn, sizeof(*conn)); dapl_os_lock_init(&conn->lock); /* create CM_ID, bind to local device, create QP */ if (rdma_create_id(&cm_id, (void*)conn)) { dapl_os_free(conn, sizeof(*conn)); return(dapl_convert_errno(errno, "create_qp")); } /* open identifies the local device; per DAT specification */ if (rdma_bind_addr(cm_id, (struct sockaddr *)&ia_ptr->hca_ptr->hca_address)) goto bail; /* Setup attributes and create qp */ dapl_os_memzero((void*)&qp_create, sizeof(qp_create)); qp_create.cap.max_send_wr = attr->max_request_dtos; qp_create.cap.max_recv_wr = attr->max_recv_dtos; qp_create.cap.max_send_sge = attr->max_request_iov; qp_create.cap.max_recv_sge = attr->max_recv_iov; qp_create.cap.max_inline_data = ia_ptr->hca_ptr->ib_trans.max_inline_send; qp_create.send_cq = req_cq; qp_create.recv_cq = rcv_cq; qp_create.qp_type = IBV_QPT_RC; qp_create.qp_context = (void*)ep_ptr; /* Let uCMA transition QP states */ if (rdma_create_qp(cm_id, ib_pd_handle, &qp_create)) goto bail; conn->cm_id = cm_id; conn->ep = ep_ptr; conn->hca = ia_ptr->hca_ptr; ep_ptr->qp_handle = conn; ep_ptr->qp_state = IB_QP_STATE_INIT; dapl_dbg_log(DAPL_DBG_TYPE_EP, " qp_alloc: qpn %p sq %d,%d rq %d,%d\n", ep_ptr->qp_handle->cm_id->qp->qp_num, qp_create.cap.max_send_wr,qp_create.cap.max_send_sge, qp_create.cap.max_recv_wr,qp_create.cap.max_recv_sge); return DAT_SUCCESS; bail: rdma_destroy_id(cm_id); dapl_os_free(conn, sizeof(*conn)); return(dapl_convert_errno(errno, "create_qp")); } /* * dapl_ib_qp_free * * Free a QP * * Input: * ia_handle IA handle * *ep_ptr pointer to EP INFO * * Output: * none * * Returns: * DAT_SUCCESS * dapl_convert_errno * */ DAT_RETURN dapls_ib_qp_free(IN DAPL_IA *ia_ptr, IN DAPL_EP *ep_ptr) { dapl_dbg_log(DAPL_DBG_TYPE_EP, " qp_free: ep_ptr %p qp %p\n", ep_ptr, ep_ptr->qp_handle); if (ep_ptr->qp_handle != IB_INVALID_HANDLE) { /* qp_handle is conn object with reference to cm_id and qp */ dapli_destroy_conn(ep_ptr->qp_handle); ep_ptr->qp_handle = IB_INVALID_HANDLE; ep_ptr->qp_state = IB_QP_STATE_ERROR; } return DAT_SUCCESS; } /* * dapl_ib_qp_modify * * Set the QP to the parameters specified in an EP_PARAM * * The EP_PARAM structure that is provided has been * sanitized such that only non-zero values are valid. * * Input: * ib_hca_handle HCA handle * qp_handle QP handle * ep_attr Sanitized EP Params * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * */ DAT_RETURN dapls_ib_qp_modify(IN DAPL_IA *ia_ptr, IN DAPL_EP *ep_ptr, IN DAT_EP_ATTR *attr) { struct ibv_qp_attr qp_attr; if (ep_ptr->qp_handle == IB_INVALID_HANDLE) return DAT_INVALID_PARAMETER; /* * Check if we have the right qp_state to modify attributes */ if ((ep_ptr->qp_handle->cm_id->qp->state != IBV_QPS_RTR) && (ep_ptr->qp_handle->cm_id->qp->state != IBV_QPS_RTS)) return DAT_INVALID_STATE; /* Adjust to current EP attributes */ dapl_os_memzero((void*)&qp_attr, sizeof(qp_attr)); qp_attr.cap.max_send_wr = attr->max_request_dtos; qp_attr.cap.max_recv_wr = attr->max_recv_dtos; qp_attr.cap.max_send_sge = attr->max_request_iov; qp_attr.cap.max_recv_sge = attr->max_recv_iov; dapl_dbg_log(DAPL_DBG_TYPE_EP, "modify_qp: qp %p sq %d,%d, rq %d,%d\n", ep_ptr->qp_handle->cm_id->qp, qp_attr.cap.max_send_wr, qp_attr.cap.max_send_sge, qp_attr.cap.max_recv_wr, qp_attr.cap.max_recv_sge); if (ibv_modify_qp(ep_ptr->qp_handle->cm_id->qp, &qp_attr, IBV_QP_CAP)) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, "modify_qp: modify ep %p qp %p failed\n", ep_ptr, ep_ptr->qp_handle->cm_id->qp); return(dapl_convert_errno(errno,"modify_qp_state")); } return DAT_SUCCESS; } /* * dapls_ib_reinit_ep * * Move the QP to INIT state again. * * Input: * ep_ptr DAPL_EP * * Output: * none * * Returns: * void * */ void dapls_ib_reinit_ep(IN DAPL_EP *ep_ptr) { /* uCMA does not allow reuse of CM_ID, destroy and create new one */ if (ep_ptr->qp_handle != IB_INVALID_HANDLE) { /* destroy */ dapli_destroy_conn(ep_ptr->qp_handle); /* create new CM_ID and QP */ ep_ptr->qp_handle = IB_INVALID_HANDLE; dapls_ib_qp_alloc(ep_ptr->header.owner_ia, ep_ptr, ep_ptr); } } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ --- NEW FILE: dapl_ib_util.c --- /* * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /*************************************************************************** * * Module: uDAPL * * Filename: dapl_ib_util.c * * Author: Arlin Davis * * Created: 3/10/2005 * * Description: * * The uDAPL openib provider - init, open, close, utilities, work thread * **************************************************************************** * Source Control System Information * * $Id: dapl_ib_util.c,v 1.1 2005/12/05 16:48:36 jlentini Exp $ * * Copyright (c) 2005 Intel Corporation. All rights reserved. * **************************************************************************/ #ifdef RCSID static const char rcsid[] = "$Id: dapl_ib_util.c,v 1.1 2005/12/05 16:48:36 jlentini Exp $"; #endif #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_ib_util.h" #include <stdlib.h> #include <netinet/tcp.h> #include <sys/poll.h> #include <fcntl.h> int g_dapl_loopback_connection = 0; int g_ib_pipe[2]; ib_thread_state_t g_ib_thread_state = 0; DAPL_OS_THREAD g_ib_thread; DAPL_OS_LOCK g_hca_lock; struct dapl_llist_entry *g_hca_list; /* Get IP address */ static int getipaddr(char *name, char *addr, int len) { struct addrinfo *res; int ret; ret = getaddrinfo(name, NULL, NULL, &res); if (ret) { dapl_dbg_log(DAPL_DBG_TYPE_WARN, " getipaddr: invalid name or address (%s)\n", name); return ret; } dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " getipaddr: family %d port %d addr %d.%d.%d.%d\n", ((struct sockaddr_in *)res->ai_addr)->sin_family, ((struct sockaddr_in *)res->ai_addr)->sin_port, ((struct sockaddr_in *) res->ai_addr)->sin_addr.s_addr >> 0 & 0xff, ((struct sockaddr_in *) res->ai_addr)->sin_addr.s_addr >> 8 & 0xff, ((struct sockaddr_in *) res->ai_addr)->sin_addr.s_addr >> 16 & 0xff, ((struct sockaddr_in *) res->ai_addr)->sin_addr.s_addr >> 24 & 0xff ); if (len >= res->ai_addrlen) memcpy(addr, res->ai_addr, res->ai_addrlen); else return EINVAL; freeaddrinfo(res); return 0; } /* * dapls_ib_init, dapls_ib_release * * Initialize Verb related items for device open * * Input: * none * * Output: * none * * Returns: * 0 success, -1 error * */ int32_t dapls_ib_init(void) { dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " dapl_ib_init: \n" ); /* initialize hca_list lock */ dapl_os_lock_init(&g_hca_lock); /* initialize hca list for CQ events */ dapl_llist_init_head(&g_hca_list); /* create pipe for waking up work thread */ if (pipe(g_ib_pipe)) return 1; return 0; } int32_t dapls_ib_release(void) { dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " dapl_ib_release: \n"); dapli_ib_thread_destroy(); return 0; } /* * dapls_ib_open_hca * * Open HCA * * Input: * *hca_name pointer to provider device name * *ib_hca_handle_p pointer to provide HCA handle * * Output: * none * * Return: * DAT_SUCCESS * dapl_convert_errno * */ DAT_RETURN dapls_ib_open_hca(IN IB_HCA_NAME hca_name, IN DAPL_HCA *hca_ptr) { long opts; struct rdma_cm_id *cm_id; union ibv_gid *gid; int ret; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " open_hca: %s - %p\n", hca_name, hca_ptr); if (dapli_ib_thread_init()) return DAT_INTERNAL_ERROR; /* HCA name will be hostname or IP address */ if (getipaddr((char*)hca_name, (char*)&hca_ptr->hca_address, 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)) return DAT_INTERNAL_ERROR; ret = rdma_bind_addr(cm_id, (struct sockaddr *)&hca_ptr->hca_address); if (ret) { rdma_destroy_id(cm_id); dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " open_hca: ERR bind (%d) %s \n", ret, strerror(-ret)); return DAT_INVALID_ADDRESS; } /* keep reference to IB device and cm_id */ hca_ptr->ib_trans.cm_id = cm_id; hca_ptr->ib_hca_handle = cm_id->verbs; hca_ptr->port_num = cm_id->port_num; gid = &cm_id->route.addr.addr.ibaddr.sgid; dapl_dbg_log( DAPL_DBG_TYPE_UTIL, " open_hca: ctx=%p port=%d GID subnet %016llx id %016llx\n", cm_id->verbs,cm_id->port_num, (unsigned long long)bswap_64(gid->global.subnet_prefix), (unsigned long long)bswap_64(gid->global.interface_id)); /* set inline max with env or default, get local lid and gid 0 */ hca_ptr->ib_trans.max_inline_send = dapl_os_get_env_val("DAPL_MAX_INLINE", INLINE_SEND_DEFAULT); /* 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; } /* * Put new hca_transport on list for async and CQ event processing * Wakeup work thread to add to polling list */ dapl_llist_init_entry((DAPL_LLIST_ENTRY*)&hca_ptr->ib_trans.entry); dapl_os_lock( &g_hca_lock ); dapl_llist_add_tail(&g_hca_list, (DAPL_LLIST_ENTRY*)&hca_ptr->ib_trans.entry, &hca_ptr->ib_trans.entry); write(g_ib_pipe[1], "w", sizeof "w"); dapl_os_unlock(&g_hca_lock); dapl_dbg_log( DAPL_DBG_TYPE_UTIL, " open_hca: %s, %s %d.%d.%d.%d INLINE_MAX=%d\n", hca_name, ((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: rdma_destroy_id(hca_ptr->ib_trans.cm_id); hca_ptr->ib_hca_handle = IB_INVALID_HANDLE; return DAT_INTERNAL_ERROR; } /* * dapls_ib_close_hca * * Open HCA * * Input: * DAPL_HCA provide CA handle * * Output: * none * * Return: * DAT_SUCCESS * dapl_convert_errno * */ DAT_RETURN dapls_ib_close_hca(IN DAPL_HCA *hca_ptr) { dapl_dbg_log(DAPL_DBG_TYPE_UTIL," close_hca: %p->%p\n", hca_ptr,hca_ptr->ib_hca_handle); if (hca_ptr->ib_hca_handle != IB_INVALID_HANDLE) { if (rdma_destroy_id(hca_ptr->ib_trans.cm_id)) return(dapl_convert_errno(errno,"ib_close_device")); hca_ptr->ib_hca_handle = IB_INVALID_HANDLE; } /* * Remove hca from async and CQ event processing list * Wakeup work thread to remove from polling list */ hca_ptr->ib_trans.destroy = 1; write(g_ib_pipe[1], "w", sizeof "w"); /* wait for thread to remove HCA references */ while (hca_ptr->ib_trans.destroy != 2) { struct timespec sleep, remain; sleep.tv_sec = 0; sleep.tv_nsec = 10000000; /* 10 ms */ dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread_destroy: wait on hca %p destroy\n"); nanosleep (&sleep, &remain); } return (DAT_SUCCESS); } /* * dapls_ib_query_hca * * Query the hca attribute * * Input: * hca_handl hca handle * ia_attr attribute of the ia * ep_attr attribute of the ep * ip_addr ip address of DET NIC * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE */ DAT_RETURN dapls_ib_query_hca(IN DAPL_HCA *hca_ptr, OUT DAT_IA_ATTR *ia_attr, OUT DAT_EP_ATTR *ep_attr, OUT DAT_SOCK_ADDR6 *ip_addr) { struct ibv_device_attr dev_attr; struct ibv_port_attr port_attr; if (hca_ptr->ib_hca_handle == NULL) { dapl_dbg_log(DAPL_DBG_TYPE_ERR," query_hca: BAD handle\n"); return (DAT_INVALID_HANDLE); } /* local IP address of device, set during ia_open */ if (ip_addr != NULL) memcpy(ip_addr, &hca_ptr->hca_address, sizeof(DAT_SOCK_ADDR6)); if (ia_attr == NULL && ep_attr == NULL) return DAT_SUCCESS; /* query verbs for this device and port attributes */ if (ibv_query_device(hca_ptr->ib_hca_handle, &dev_attr) || ibv_query_port(hca_ptr->ib_hca_handle, hca_ptr->port_num, &port_attr)) return(dapl_convert_errno(errno,"ib_query_hca")); if (ia_attr != NULL) { ia_attr->adapter_name[DAT_NAME_MAX_LENGTH - 1] = '\0'; ia_attr->vendor_name[DAT_NAME_MAX_LENGTH - 1] = '\0'; ia_attr->ia_address_ptr = (DAT_IA_ADDRESS_PTR)&hca_ptr->hca_address; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " query_hca: %s %s %d.%d.%d.%d\n", hca_ptr->name, ((struct sockaddr_in *) ia_attr->ia_address_ptr)->sin_family == AF_INET ? "AF_INET":"AF_INET6", ((struct sockaddr_in *) ia_attr->ia_address_ptr)->sin_addr.s_addr >> 0 & 0xff, ((struct sockaddr_in *) ia_attr->ia_address_ptr)->sin_addr.s_addr >> 8 & 0xff, ((struct sockaddr_in *) ia_attr->ia_address_ptr)->sin_addr.s_addr >> 16 & 0xff, ((struct sockaddr_in *) ia_attr->ia_address_ptr)->sin_addr.s_addr >> 24 & 0xff); ia_attr->hardware_version_major = dev_attr.hw_ver; ia_attr->max_eps = dev_attr.max_qp; ia_attr->max_dto_per_ep = dev_attr.max_qp_wr; ia_attr->max_rdma_read_per_ep = dev_attr.max_qp_rd_atom; ia_attr->max_evds = dev_attr.max_cq; ia_attr->max_evd_qlen = dev_attr.max_cqe; ia_attr->max_iov_segments_per_dto = dev_attr.max_sge; ia_attr->max_lmrs = dev_attr.max_mr; ia_attr->max_lmr_block_size = dev_attr.max_mr_size; ia_attr->max_rmrs = dev_attr.max_mw; ia_attr->max_lmr_virtual_address = dev_attr.max_mr_size; ia_attr->max_rmr_target_address = dev_attr.max_mr_size; ia_attr->max_pzs = dev_attr.max_pd; ia_attr->max_mtu_size = port_attr.max_msg_sz; ia_attr->max_rdma_size = port_attr.max_msg_sz; ia_attr->num_transport_attr = 0; ia_attr->transport_attr = NULL; ia_attr->num_vendor_attr = 0; ia_attr->vendor_attr = NULL; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " query_hca: (ver=%x) ep %d ep_q %d evd %d evd_q %d\n", ia_attr->hardware_version_major, ia_attr->max_eps, ia_attr->max_dto_per_ep, ia_attr->max_evds, ia_attr->max_evd_qlen ); dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " query_hca: msg %llu rdma %llu iov %d lmr %d rmr %d\n", ia_attr->max_mtu_size, ia_attr->max_rdma_size, ia_attr->max_iov_segments_per_dto, ia_attr->max_lmrs, ia_attr->max_rmrs ); } if (ep_attr != NULL) { ep_attr->max_mtu_size = port_attr.max_msg_sz; ep_attr->max_rdma_size = port_attr.max_msg_sz; ep_attr->max_recv_dtos = dev_attr.max_qp_wr; ep_attr->max_request_dtos = dev_attr.max_qp_wr; ep_attr->max_recv_iov = dev_attr.max_sge; ep_attr->max_request_iov = dev_attr.max_sge; ep_attr->max_rdma_read_in = dev_attr.max_qp_rd_atom; ep_attr->max_rdma_read_out= dev_attr.max_qp_rd_atom; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " query_hca: MAX msg %llu dto %d iov %d rdma i%d,o%d\n", ep_attr->max_mtu_size, ep_attr->max_recv_dtos, ep_attr->max_recv_iov, ep_attr->max_rdma_read_in, ep_attr->max_rdma_read_out); } return DAT_SUCCESS; } /* * dapls_ib_setup_async_callback * * Set up an asynchronous callbacks of various kinds * * Input: * ia_handle IA handle * handler_type type of handler to set up * callback_handle handle param for completion callbacks * callback callback routine pointer * context argument for callback routine * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * */ DAT_RETURN dapls_ib_setup_async_callback(IN DAPL_IA *ia_ptr, IN DAPL_ASYNC_HANDLER_TYPE type, IN DAPL_EVD *evd_ptr, IN ib_async_handler_t callback, IN void *context) { ib_hca_transport_t *hca_ptr; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " setup_async_cb: ia %p type %d hdl %p cb %p ctx %p\n", ia_ptr, type, evd_ptr, callback, context); hca_ptr = &ia_ptr->hca_ptr->ib_trans; switch(type) { case DAPL_ASYNC_UNAFILIATED: hca_ptr->async_unafiliated = (ib_async_handler_t)callback; hca_ptr->async_un_ctx = context; break; case DAPL_ASYNC_CQ_ERROR: hca_ptr->async_cq_error = (ib_async_cq_handler_t)callback; break; case DAPL_ASYNC_CQ_COMPLETION: hca_ptr->async_cq = (ib_async_dto_handler_t)callback; break; case DAPL_ASYNC_QP_ERROR: hca_ptr->async_qp_error = (ib_async_qp_handler_t)callback; break; default: break; } return DAT_SUCCESS; } int dapli_ib_thread_init(void) { long opts; DAT_RETURN ret; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread_init(%d)\n", getpid()); dapl_os_lock(&g_hca_lock); if (g_ib_thread_state != IB_THREAD_INIT) { dapl_os_unlock(&g_hca_lock); return 0; } /* uCMA events non-blocking */ opts = fcntl(rdma_get_fd(), F_GETFL); /* uCMA */ if (opts < 0 || fcntl(rdma_get_fd(), F_SETFL, opts | O_NONBLOCK) < 0) { dapl_dbg_log (DAPL_DBG_TYPE_ERR, " dapl_ib_init: ERR with uCMA FD\n" ); dapl_os_unlock(&g_hca_lock); return 1; } g_ib_thread_state = IB_THREAD_CREATE; dapl_os_unlock(&g_hca_lock); /* create thread to process inbound connect request */ ret = dapl_os_thread_create(dapli_thread, NULL, &g_ib_thread); if (ret != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, " ib_thread_init: failed to create thread\n"); return 1; } /* wait for thread to start */ dapl_os_lock(&g_hca_lock); while (g_ib_thread_state != IB_THREAD_RUN) { struct timespec sleep, remain; sleep.tv_sec = 0; sleep.tv_nsec = 20000000; /* 20 ms */ dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread_init: waiting for ib_thread\n"); dapl_os_unlock(&g_hca_lock); nanosleep (&sleep, &remain); dapl_os_lock(&g_hca_lock); } dapl_os_unlock(&g_hca_lock); dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread_init(%d) exit\n",getpid()); return 0; } void dapli_ib_thread_destroy(void) { int retries = 10; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread_destroy(%d)\n", getpid()); /* * wait for async thread to terminate. * pthread_join would be the correct method * but some applications have some issues */ /* destroy ib_thread, wait for termination, if not already */ dapl_os_lock(&g_hca_lock); if (g_ib_thread_state != IB_THREAD_RUN) goto bail; g_ib_thread_state = IB_THREAD_CANCEL; write(g_ib_pipe[1], "w", sizeof "w"); while ((g_ib_thread_state != IB_THREAD_EXIT) && (retries--)) { struct timespec sleep, remain; sleep.tv_sec = 0; sleep.tv_nsec = 20000000; /* 20 ms */ dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread_destroy: waiting for ib_thread\n"); write(g_ib_pipe[1], "w", sizeof "w"); dapl_os_unlock( &g_hca_lock ); nanosleep(&sleep, &remain); dapl_os_lock( &g_hca_lock ); } bail: dapl_os_unlock( &g_hca_lock ); dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread_destroy(%d) exit\n",getpid()); } void dapli_async_event_cb(struct _ib_hca_transport *hca) { struct ibv_async_event event; struct pollfd async_fd = { .fd = hca->cm_id->verbs->async_fd, .events = POLLIN, .revents = 0 }; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " async_event(%p)\n",hca); if (hca->destroy) return; if ((poll(&async_fd, 1, 0)==1) && (!ibv_get_async_event(hca->cm_id->verbs, &event))) { switch (event.event_type) { case IBV_EVENT_CQ_ERR: { struct dapl_ep *evd_ptr = event.element.cq->cq_context; dapl_dbg_log( DAPL_DBG_TYPE_WARN, " async_event CQ (%p) ERR %d\n", evd_ptr, event.event_type); /* report up if async callback still setup */ if (hca->async_cq_error) hca->async_cq_error(hca->cm_id->verbs, event.element.cq, &event, (void*)evd_ptr); break; } case IBV_EVENT_COMM_EST: { /* Received msgs on connected QP before RTU */ dapl_dbg_log( DAPL_DBG_TYPE_UTIL, " async_event COMM_EST(%p) rdata beat RTU\n", event.element.qp); break; } case IBV_EVENT_QP_FATAL: case IBV_EVENT_QP_REQ_ERR: case IBV_EVENT_QP_ACCESS_ERR: case IBV_EVENT_QP_LAST_WQE_REACHED: case IBV_EVENT_SRQ_ERR: case IBV_EVENT_SRQ_LIMIT_REACHED: case IBV_EVENT_SQ_DRAINED: { struct dapl_ep *ep_ptr = event.element.qp->qp_context; dapl_dbg_log( DAPL_DBG_TYPE_WARN, " async_event QP (%p) ERR %d\n", ep_ptr, event.event_type); /* report up if async callback still setup */ if (hca->async_qp_error) hca->async_qp_error(hca->cm_id->verbs, ep_ptr->qp_handle, &event, (void*)ep_ptr); break; } case IBV_EVENT_PATH_MIG: case IBV_EVENT_PATH_MIG_ERR: case IBV_EVENT_DEVICE_FATAL: case IBV_EVENT_PORT_ACTIVE: case IBV_EVENT_PORT_ERR: case IBV_EVENT_LID_CHANGE: case IBV_EVENT_PKEY_CHANGE: case IBV_EVENT_SM_CHANGE: { dapl_dbg_log(DAPL_DBG_TYPE_WARN, " async_event: DEV ERR %d\n", event.event_type); /* report up if async callback still setup */ if (hca->async_unafiliated) hca->async_unafiliated( hca->cm_id->verbs, &event, hca->async_un_ctx); break; } default: dapl_dbg_log (DAPL_DBG_TYPE_WARN, " async_event: 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_CM, " ib_thread(%d,0x%x): ENTER: pipe %d ucma %d\n", getpid(), g_ib_thread, g_ib_pipe[0], rdma_get_fd()); /* Poll across pipe, CM, AT never changes */ dapl_os_lock( &g_hca_lock ); g_ib_thread_state = IB_THREAD_RUN; ufds[0].fd = g_ib_pipe[0]; /* pipe */ ufds[0].events = POLLIN; ufds[1].fd = rdma_get_fd(); /* uCMA */ ufds[1].events = POLLIN; while (g_ib_thread_state == IB_THREAD_RUN) { /* build ufds after pipe and uCMA events */ ufds[0].revents = 0; 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) { /* uASYNC events */ ufds[++idx].fd = hca->cm_id->verbs->async_fd; ufds[idx].events = POLLIN; ufds[idx].revents = 0; uhca[idx] = hca; /* uCQ, non-direct events */ ufds[++idx].fd = hca->ib_cq->fd; ufds[idx].events = POLLIN; ufds[idx].revents = 0; uhca[idx] = hca; dapl_dbg_log(DAPL_DBG_TYPE_CM, " ib_thread(%d) poll_fd: hca[%d]=%p, async=%d" " pipe=%d cm=%d cq=d\n", getpid(), hca, ufds[idx-1].fd, ufds[0].fd, ufds[1].fd, ufds[idx].fd); 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)); dapl_os_lock(&g_hca_lock); continue; } dapl_dbg_log(DAPL_DBG_TYPE_CM, " ib_thread(%d) poll_event: " " async=0x%x pipe=0x%x cm=0x%x cq=0x%x\n", getpid(), ufds[idx-1].revents, ufds[0].revents, ufds[1].revents, ufds[idx].revents); /* uCMA events */ if (ufds[1].revents == POLLIN) dapli_cma_event_cb(); /* check and process CQ and ASYNC events, per device */ for(idx=2;idx<fds;idx++) { if (ufds[idx].revents == POLLIN) { dapli_cq_event_cb(uhca[idx]); dapli_async_event_cb(uhca[idx]); } } /*... [truncated message content] |
From: James L. <jle...@us...> - 2005-12-05 16:48:44
|
Update of /cvsroot/dapl In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16755 Modified Files: README Log Message: Added CMA API support. Signed-off-by: Arlin Davis <ar...@ic...> Signed-off-by: James Lentini <jle...@ne...> |
From: James L. <jle...@us...> - 2005-12-05 16:42:52
|
Update of /cvsroot/dapl/dapl/openib_cma In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15856/dapl/openib_cma Log Message: Directory /cvsroot/dapl/dapl/openib_cma added to the repository |
From: James L. <jle...@us...> - 2005-12-05 16:39:12
|
Update of /cvsroot/dapl/dapl/common In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14819/dapl/common Modified Files: dapl_ep_create_with_srq.c Log Message: Fix a gcc 4.0 warning Signed-off-by: James Lentini <jle...@ne...> Index: dapl_ep_create_with_srq.c =================================================================== RCS file: /cvsroot/dapl/dapl/common/dapl_ep_create_with_srq.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C10 -d -r1.3 -r1.4 *** dapl_ep_create_with_srq.c 24 Mar 2005 05:58:01 -0000 1.3 --- dapl_ep_create_with_srq.c 5 Dec 2005 16:38:55 -0000 1.4 *************** *** 252,276 **** } else { evd_ptr->completion_type = ep_attr->recv_completion_flags; } } dat_status = DAT_NOT_IMPLEMENTED; /* ! * XXX The rest of the EP code is sueful in this case too, * XXX but need to complete the SRQ implementation before * XXX committing resources */ ! ep_ptr = ep_ptr; goto bail; #ifdef notdef /* Allocate EP */ ep_ptr = dapl_ep_alloc ( ia_ptr, ep_attr ); if ( ep_ptr == NULL ) { dat_status = DAT_ERROR (DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } --- 252,276 ---- } else { evd_ptr->completion_type = ep_attr->recv_completion_flags; } } dat_status = DAT_NOT_IMPLEMENTED; /* ! * XXX The rest of the EP code is useful in this case too, * XXX but need to complete the SRQ implementation before * XXX committing resources */ ! *ep_handle = ep_ptr = NULL; goto bail; #ifdef notdef /* Allocate EP */ ep_ptr = dapl_ep_alloc ( ia_ptr, ep_attr ); if ( ep_ptr == NULL ) { dat_status = DAT_ERROR (DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } |
From: James L. <jle...@us...> - 2005-11-10 21:42:44
|
Update of /cvsroot/dapl/dapl/openib In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29585/dapl/openib Modified Files: dapl_ib_cm.c Log Message: Fixed some problems with the free build openib_scm version and turned down some debugging and added some debug prints for uAT path records. 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.8 retrieving revision 1.9 diff -C10 -d -r1.8 -r1.9 *** dapl_ib_cm.c 3 Oct 2005 14:47:51 -0000 1.8 --- dapl_ib_cm.c 10 Nov 2005 21:42:34 -0000 1.9 *************** *** 134,161 **** struct dapl_cm_id *conn = context; int status; ib_cm_events_t event; dapl_dbg_log(DAPL_DBG_TYPE_CM, " path_comp_handler: ctxt %p, req_id %lld rec_num %d\n", context, req_id, rec_num); dapl_dbg_log(DAPL_DBG_TYPE_CM, " path_comp_handler: SRC GID subnet %016llx id %016llx\n", ! (unsigned long long)cpu_to_be64(conn->dapl_rt.sgid.global.subnet_prefix), ! (unsigned long long)cpu_to_be64(conn->dapl_rt.sgid.global.interface_id) ); dapl_dbg_log(DAPL_DBG_TYPE_CM, " path_comp_handler: DST GID subnet %016llx id %016llx\n", ! (unsigned long long)cpu_to_be64(conn->dapl_rt.dgid.global.subnet_prefix), ! (unsigned long long)cpu_to_be64(conn->dapl_rt.dgid.global.interface_id) ); if (rec_num <= 0) { dapl_dbg_log(DAPL_DBG_TYPE_CM, " path_comp_handler: ERR %d retry %d\n", rec_num, conn->retries + 1); if (++conn->retries > IB_MAX_AT_RETRY) { dapl_dbg_log(DAPL_DBG_TYPE_CM, " path_comp_handler: ERR no PATH (ep=%p)\n", conn->ep); event = IB_CME_DESTINATION_UNREACHABLE; goto bail; --- 134,174 ---- struct dapl_cm_id *conn = context; int status; ib_cm_events_t event; dapl_dbg_log(DAPL_DBG_TYPE_CM, " path_comp_handler: ctxt %p, req_id %lld rec_num %d\n", context, req_id, rec_num); dapl_dbg_log(DAPL_DBG_TYPE_CM, " path_comp_handler: SRC GID subnet %016llx id %016llx\n", ! (unsigned long long)cpu_to_be64(conn->dapl_path.sgid.global.subnet_prefix), ! (unsigned long long)cpu_to_be64(conn->dapl_path.sgid.global.interface_id) ); dapl_dbg_log(DAPL_DBG_TYPE_CM, " path_comp_handler: DST GID subnet %016llx id %016llx\n", ! (unsigned long long)cpu_to_be64(conn->dapl_path.dgid.global.subnet_prefix), ! (unsigned long long)cpu_to_be64(conn->dapl_path.dgid.global.interface_id) ); + dapl_dbg_log(DAPL_DBG_TYPE_CM, + " path_comp_handler: slid %x dlid %x mtu %x(%x) pktlife %x(%x)\n", + ntohs(conn->dapl_path.slid), ntohs(conn->dapl_path.dlid), + conn->dapl_path.mtu, conn->dapl_path.mtu_selector, + conn->dapl_path.packet_life_time, + conn->dapl_path.packet_life_time_selector ); + + dapl_dbg_log(DAPL_DBG_TYPE_CM, + " path_comp_handler: hops %x npaths %x pkey %x tclass %x rate %x(%x)\n", + conn->dapl_path.hop_limit, conn->dapl_path.numb_path, + conn->dapl_path.pkey, conn->dapl_path.traffic_class, + conn->dapl_path.rate, conn->dapl_path.rate_selector); + if (rec_num <= 0) { dapl_dbg_log(DAPL_DBG_TYPE_CM, " path_comp_handler: ERR %d retry %d\n", rec_num, conn->retries + 1); if (++conn->retries > IB_MAX_AT_RETRY) { dapl_dbg_log(DAPL_DBG_TYPE_CM, " path_comp_handler: ERR no PATH (ep=%p)\n", conn->ep); event = IB_CME_DESTINATION_UNREACHABLE; goto bail; |
From: James L. <jle...@us...> - 2005-11-10 21:42:44
|
Update of /cvsroot/dapl/dapl/openib_scm In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29585/dapl/openib_scm Modified Files: dapl_ib_cm.c dapl_ib_cq.c Log Message: Fixed some problems with the free build openib_scm version and turned down some debugging and added some debug prints for uAT path records. 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_scm/dapl_ib_cm.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C10 -d -r1.1 -r1.2 *** dapl_ib_cm.c 26 Oct 2005 21:19:32 -0000 1.1 --- dapl_ib_cm.c 10 Nov 2005 21:42:34 -0000 1.2 *************** *** 278,298 **** } setsockopt(cm_ptr->l_socket,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)); addr.sin_port = htons(serviceID); addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; if (( bind( cm_ptr->l_socket,(struct sockaddr*)&addr, sizeof(addr) ) < 0) || (listen( cm_ptr->l_socket, 128 ) < 0) ) { ! dapl_dbg_log( DAPL_DBG_TYPE_ERR, " listen: ERROR %s on conn_qual 0x%x\n", strerror(errno),serviceID); if ( errno == EADDRINUSE ) dat_status = DAT_CONN_QUAL_IN_USE; else dat_status = DAT_CONN_QUAL_UNAVAILABLE; goto bail; } --- 278,298 ---- } setsockopt(cm_ptr->l_socket,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)); addr.sin_port = htons(serviceID); addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; if (( bind( cm_ptr->l_socket,(struct sockaddr*)&addr, sizeof(addr) ) < 0) || (listen( cm_ptr->l_socket, 128 ) < 0) ) { ! dapl_dbg_log( DAPL_DBG_TYPE_CM, " listen: ERROR %s on conn_qual 0x%x\n", strerror(errno),serviceID); if ( errno == EADDRINUSE ) dat_status = DAT_CONN_QUAL_IN_USE; else dat_status = DAT_CONN_QUAL_UNAVAILABLE; goto bail; } *************** *** 306,326 **** dapl_llist_add_tail(&cm_ptr->hca_ptr->ib_trans.list, (DAPL_LLIST_ENTRY*)&cm_ptr->entry, cm_ptr); dapl_os_unlock(&cm_ptr->hca_ptr->ib_trans.lock); dapl_dbg_log( DAPL_DBG_TYPE_CM, " listen: qual 0x%x cr %p s_fd %d\n", ntohs(serviceID), cm_ptr, cm_ptr->l_socket ); return dat_status; bail: ! dapl_dbg_log( DAPL_DBG_TYPE_ERR, " listen: ERROR on conn_qual 0x%x\n",serviceID); if ( cm_ptr->l_socket >= 0 ) close( cm_ptr->l_socket ); dapl_os_free( cm_ptr, sizeof( *cm_ptr ) ); return dat_status; } /* * PASSIVE: send local QP information, private data, and wait for --- 306,326 ---- dapl_llist_add_tail(&cm_ptr->hca_ptr->ib_trans.list, (DAPL_LLIST_ENTRY*)&cm_ptr->entry, cm_ptr); dapl_os_unlock(&cm_ptr->hca_ptr->ib_trans.lock); dapl_dbg_log( DAPL_DBG_TYPE_CM, " listen: qual 0x%x cr %p s_fd %d\n", ntohs(serviceID), cm_ptr, cm_ptr->l_socket ); return dat_status; bail: ! dapl_dbg_log( DAPL_DBG_TYPE_CM, " listen: ERROR on conn_qual 0x%x\n",serviceID); if ( cm_ptr->l_socket >= 0 ) close( cm_ptr->l_socket ); dapl_os_free( cm_ptr, sizeof( *cm_ptr ) ); return dat_status; } /* * PASSIVE: send local QP information, private data, and wait for Index: dapl_ib_cq.c =================================================================== RCS file: /cvsroot/dapl/dapl/openib_scm/dapl_ib_cq.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C10 -d -r1.1 -r1.2 *** dapl_ib_cq.c 26 Oct 2005 21:19:32 -0000 1.1 --- dapl_ib_cq.c 10 Nov 2005 21:42:34 -0000 1.2 *************** *** 562,582 **** 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", --- 562,581 ---- *************** *** 595,615 **** 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 --- 594,614 ---- 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,strerror(errno)); return(dapl_convert_errno(status,"cq_wait_object_wait")); } #endif /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 |
From: James L. <jle...@us...> - 2005-10-31 18:30:25
|
Update of /cvsroot/dapl/dapl/common In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24691 Modified Files: dapl_ep_post_rdma_write.c dapl_ep_post_recv.c dapl_ep_post_send.c dapl_srq_post_recv.c Log Message: Fix printing of debug statements. Signed off by: Aniruddha Bohra <bo...@cs...> Signed off by: James Lentini <jle...@ne... Index: dapl_ep_post_rdma_write.c =================================================================== RCS file: /cvsroot/dapl/dapl/common/dapl_ep_post_rdma_write.c,v retrieving revision 1.12 retrieving revision 1.13 diff -C10 -d -r1.12 -r1.13 *** dapl_ep_post_rdma_write.c 24 Mar 2005 05:58:02 -0000 1.12 --- dapl_ep_post_rdma_write.c 31 Oct 2005 18:30:14 -0000 1.13 *************** *** 74,94 **** IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT num_segments, IN DAT_LMR_TRIPLET *local_iov, IN DAT_DTO_COOKIE user_cookie, IN const DAT_RMR_TRIPLET *remote_iov, IN DAT_COMPLETION_FLAGS completion_flags ) { DAT_RETURN dat_status; dapl_dbg_log (DAPL_DBG_TYPE_API, ! "dapl_ep_post_rdma_write (%p, %d, %p, %P, %p, %x)\n", ep_handle, num_segments, local_iov, user_cookie.as_64, remote_iov, completion_flags); DAPL_CNTR(DCNT_POST_RDMA_WRITE); dat_status = dapl_ep_post_send_req(ep_handle, num_segments, --- 74,94 ---- IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT num_segments, IN DAT_LMR_TRIPLET *local_iov, IN DAT_DTO_COOKIE user_cookie, IN const DAT_RMR_TRIPLET *remote_iov, IN DAT_COMPLETION_FLAGS completion_flags ) { DAT_RETURN dat_status; dapl_dbg_log (DAPL_DBG_TYPE_API, ! "dapl_ep_post_rdma_write (%p, %d, %p, %p, %p, %x)\n", ep_handle, num_segments, local_iov, user_cookie.as_64, remote_iov, completion_flags); DAPL_CNTR(DCNT_POST_RDMA_WRITE); dat_status = dapl_ep_post_send_req(ep_handle, num_segments, Index: dapl_ep_post_recv.c =================================================================== RCS file: /cvsroot/dapl/dapl/common/dapl_ep_post_recv.c,v retrieving revision 1.22 retrieving revision 1.23 diff -C10 -d -r1.22 -r1.23 *** dapl_ep_post_recv.c 24 Mar 2005 05:58:02 -0000 1.22 --- dapl_ep_post_recv.c 31 Oct 2005 18:30:14 -0000 1.23 *************** *** 75,95 **** IN DAT_COUNT num_segments, IN DAT_LMR_TRIPLET *local_iov, IN DAT_DTO_COOKIE user_cookie, IN DAT_COMPLETION_FLAGS completion_flags ) { DAPL_EP *ep_ptr; DAPL_COOKIE *cookie; DAT_RETURN dat_status; dapl_dbg_log (DAPL_DBG_TYPE_API, ! "dapl_ep_post_recv (%p, %d, %p, %P, %x)\n", ep_handle, num_segments, local_iov, user_cookie.as_64, completion_flags); DAPL_CNTR (DCNT_POST_RECV); if ( DAPL_BAD_HANDLE (ep_handle, DAPL_MAGIC_EP) ) { dat_status = DAT_ERROR (DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); --- 75,95 ---- IN DAT_COUNT num_segments, IN DAT_LMR_TRIPLET *local_iov, IN DAT_DTO_COOKIE user_cookie, IN DAT_COMPLETION_FLAGS completion_flags ) { DAPL_EP *ep_ptr; DAPL_COOKIE *cookie; DAT_RETURN dat_status; dapl_dbg_log (DAPL_DBG_TYPE_API, ! "dapl_ep_post_recv (%p, %d, %p, %p, %x)\n", ep_handle, num_segments, local_iov, user_cookie.as_64, completion_flags); DAPL_CNTR (DCNT_POST_RECV); if ( DAPL_BAD_HANDLE (ep_handle, DAPL_MAGIC_EP) ) { dat_status = DAT_ERROR (DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); Index: dapl_ep_post_send.c =================================================================== RCS file: /cvsroot/dapl/dapl/common/dapl_ep_post_send.c,v retrieving revision 1.11 retrieving revision 1.12 diff -C10 -d -r1.11 -r1.12 *** dapl_ep_post_send.c 24 Mar 2005 05:58:02 -0000 1.11 --- dapl_ep_post_send.c 31 Oct 2005 18:30:14 -0000 1.12 *************** *** 71,91 **** IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT num_segments, IN DAT_LMR_TRIPLET *local_iov, IN DAT_DTO_COOKIE user_cookie, IN DAT_COMPLETION_FLAGS completion_flags ) { DAT_RMR_TRIPLET remote_iov = {0,0,0,0}; DAT_RETURN dat_status; dapl_dbg_log (DAPL_DBG_TYPE_API, ! "dapl_ep_post_send (%p, %d, %p, %P, %x)\n", ep_handle, num_segments, local_iov, user_cookie.as_64, completion_flags); DAPL_CNTR(DCNT_POST_SEND); dat_status = dapl_ep_post_send_req(ep_handle, num_segments, local_iov, --- 71,91 ---- IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT num_segments, IN DAT_LMR_TRIPLET *local_iov, IN DAT_DTO_COOKIE user_cookie, IN DAT_COMPLETION_FLAGS completion_flags ) { DAT_RMR_TRIPLET remote_iov = {0,0,0,0}; DAT_RETURN dat_status; dapl_dbg_log (DAPL_DBG_TYPE_API, ! "dapl_ep_post_send (%p, %d, %p, %p, %x)\n", ep_handle, num_segments, local_iov, user_cookie.as_64, completion_flags); DAPL_CNTR(DCNT_POST_SEND); dat_status = dapl_ep_post_send_req(ep_handle, num_segments, local_iov, Index: dapl_srq_post_recv.c =================================================================== RCS file: /cvsroot/dapl/dapl/common/dapl_srq_post_recv.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C10 -d -r1.3 -r1.4 *** dapl_srq_post_recv.c 24 Mar 2005 05:58:05 -0000 1.3 --- dapl_srq_post_recv.c 31 Oct 2005 18:30:14 -0000 1.4 *************** *** 75,95 **** IN DAT_SRQ_HANDLE srq_handle, IN DAT_COUNT num_segments, IN DAT_LMR_TRIPLET *local_iov, IN DAT_DTO_COOKIE user_cookie) { DAPL_SRQ *srq_ptr; DAPL_COOKIE *cookie; DAT_RETURN dat_status; dapl_dbg_log (DAPL_DBG_TYPE_API, ! "dapl_srq_post_recv (%p, %d, %p, %P)\n", srq_handle, num_segments, local_iov, user_cookie.as_64); if ( DAPL_BAD_HANDLE (srq_handle, DAPL_MAGIC_SRQ) ) { dat_status = DAT_ERROR (DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_SRQ); goto bail; } --- 75,95 ---- IN DAT_SRQ_HANDLE srq_handle, IN DAT_COUNT num_segments, IN DAT_LMR_TRIPLET *local_iov, IN DAT_DTO_COOKIE user_cookie) { DAPL_SRQ *srq_ptr; DAPL_COOKIE *cookie; DAT_RETURN dat_status; dapl_dbg_log (DAPL_DBG_TYPE_API, ! "dapl_srq_post_recv (%p, %d, %p, %p)\n", srq_handle, num_segments, local_iov, user_cookie.as_64); if ( DAPL_BAD_HANDLE (srq_handle, DAPL_MAGIC_SRQ) ) { dat_status = DAT_ERROR (DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_SRQ); goto bail; } |
Update of /cvsroot/dapl/dapl/openib_scm In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2389/dapl/openib_scm Added Files: README dapl_ib_cm.c dapl_ib_cq.c dapl_ib_dto.h dapl_ib_mem.c dapl_ib_qp.c dapl_ib_util.c dapl_ib_util.h Log Message: uDAPL provider for OpenIB socket CM. Signed-off by: Arlin Davis <ar...@ic...> Signed-off by: James Lentini <jle...@ne...> --- NEW FILE: README --- OpenIB uDAPL provider using socket-based CM, in leiu of uCM/uAT, to setup QP/channels. to build: cd dapl/udapl make VERBS=openib_scm clean make VERBS=openib_scm Modifications to common code: - added dapl/openib_scm directory dapl/udapl/Makefile New files for openib_scm provider dapl/openib/dapl_ib_cq.c dapl/openib/dapl_ib_dto.h dapl/openib/dapl_ib_mem.c dapl/openib/dapl_ib_qp.c dapl/openib/dapl_ib_util.c dapl/openib/dapl_ib_util.h dapl/openib/dapl_ib_cm.c A simple dapl test just for openib_scm testing... test/dtest/dtest.c test/dtest/makefile server: dtest -s client: dtest -h hostname known issues: no memory windows support in ibverbs, dat_create_rmr fails. --- NEW FILE: dapl_ib_cm.c --- /* * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. [...1035 lines suppressed...] (DAPL_LLIST_ENTRY*)&cr->entry ); } dapl_os_unlock( &hca_ptr->ib_trans.lock ); to.tv_sec = 0; to.tv_usec = 100000; /* wakeup and check destroy */ select(max_fd + 1, &rfds, NULL, NULL, &to); dapl_os_lock( &hca_ptr->ib_trans.lock ); } dapl_os_unlock( &hca_ptr->ib_trans.lock ); hca_ptr->ib_trans.cr_state = IB_THREAD_EXIT; dapl_dbg_log(DAPL_DBG_TYPE_UTIL," cr_thread(hca %p) exit\n",hca_ptr); } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ --- NEW FILE: dapl_ib_cq.c --- /* * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /*************************************************************************** * * Module: uDAPL * * Filename: dapl_ib_cq.c * * Author: Arlin Davis * * Created: 3/10/2005 * * Description: * * The uDAPL openib provider - completion queue * **************************************************************************** * Source Control System Information * * $Id: dapl_ib_cq.c,v 1.1 2005/10/26 21:19:32 jlentini Exp $ * * Copyright (c) 2005 Intel Corporation. All rights reserved. * **************************************************************************/ #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> #include <signal.h> int dapli_cq_thread_init(struct dapl_hca *hca_ptr) { DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_UTIL," cq_thread_init(%p)\n", hca_ptr); /* create thread to process inbound connect request */ hca_ptr->ib_trans.cq_state = IB_THREAD_INIT; dat_status = dapl_os_thread_create(cq_thread, (void*)hca_ptr, &hca_ptr->ib_trans.cq_thread); if (dat_status != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, " cq_thread_init: failed to create thread\n"); return 1; } /* wait for thread to start */ while (hca_ptr->ib_trans.cq_state != IB_THREAD_RUN) { struct timespec sleep, remain; sleep.tv_sec = 0; sleep.tv_nsec = 20000000; /* 20 ms */ dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cq_thread_init: waiting for cq_thread\n"); nanosleep (&sleep, &remain); } dapl_dbg_log(DAPL_DBG_TYPE_UTIL," cq_thread_init(%d) exit\n",getpid()); return 0; } void dapli_cq_thread_destroy(struct dapl_hca *hca_ptr) { dapl_dbg_log(DAPL_DBG_TYPE_UTIL," cq_thread_destroy(%p)\n", hca_ptr); if (hca_ptr->ib_trans.cq_state != IB_THREAD_RUN) return; /* destroy cr_thread and lock */ hca_ptr->ib_trans.cq_state = IB_THREAD_CANCEL; pthread_kill(hca_ptr->ib_trans.cq_thread, SIGUSR1); dapl_dbg_log(DAPL_DBG_TYPE_CM," cq_thread_destroy(%p) cancel\n",hca_ptr); while (hca_ptr->ib_trans.cq_state != IB_THREAD_EXIT) { struct timespec sleep, remain; sleep.tv_sec = 0; sleep.tv_nsec = 200000000; /* 200 ms */ dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cq_thread_destroy: waiting for cq_thread\n"); nanosleep (&sleep, &remain); } dapl_dbg_log(DAPL_DBG_TYPE_UTIL," cq_thread_destroy(%d) exit\n",getpid()); } /* catch the signal */ static void ib_cq_handler(int signum) { return; } void cq_thread( void *arg ) { struct dapl_hca *hca_ptr = arg; struct dapl_evd *evd_ptr; struct ibv_cq *ibv_cq = NULL; sigset_t sigset; sigemptyset(&sigset); sigaddset(&sigset,SIGUSR1); pthread_sigmask(SIG_UNBLOCK, &sigset, NULL); signal(SIGUSR1, ib_cq_handler); hca_ptr->ib_trans.cq_state = IB_THREAD_RUN; dapl_dbg_log(DAPL_DBG_TYPE_UTIL," cq_thread: ENTER hca %p\n",hca_ptr); /* wait on DTO event, or signal to abort */ while (hca_ptr->ib_trans.cq_state == IB_THREAD_RUN) { struct pollfd cq_fd = { .fd = hca_ptr->ib_trans.ib_cq->fd, .events = POLLIN, .revents = 0 }; if ((poll(&cq_fd, 1, -1) == 1) && (!ibv_get_cq_event(hca_ptr->ib_trans.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_ptr->ib_hca_handle, evd_ptr->ib_cq_handle, (void*)evd_ptr ); ibv_ack_cq_events(ibv_cq, 1); } } hca_ptr->ib_trans.cq_state = IB_THREAD_EXIT; dapl_dbg_log(DAPL_DBG_TYPE_UTIL," cq_thread: EXIT: hca %p \n", hca_ptr); } /* * 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; DAT_DTO_COMPLETION_STATUS dat_status; } ib_status_map[] = { /* 00 */ { IBV_WC_SUCCESS, DAT_DTO_SUCCESS}, /* 01 */ { IBV_WC_LOC_LEN_ERR, DAT_DTO_ERR_LOCAL_LENGTH}, /* 02 */ { IBV_WC_LOC_QP_OP_ERR, DAT_DTO_ERR_LOCAL_EP}, /* 03 */ { IBV_WC_LOC_EEC_OP_ERR, DAT_DTO_ERR_TRANSPORT}, /* 04 */ { IBV_WC_LOC_PROT_ERR, DAT_DTO_ERR_LOCAL_PROTECTION}, /* 05 */ { IBV_WC_WR_FLUSH_ERR, DAT_DTO_ERR_FLUSHED}, /* 06 */ { IBV_WC_MW_BIND_ERR, DAT_RMR_OPERATION_FAILED}, /* 07 */ { IBV_WC_BAD_RESP_ERR, DAT_DTO_ERR_BAD_RESPONSE}, /* 08 */ { IBV_WC_LOC_ACCESS_ERR, DAT_DTO_ERR_LOCAL_PROTECTION}, /* 09 */ { IBV_WC_REM_INV_REQ_ERR, DAT_DTO_ERR_REMOTE_RESPONDER}, /* 10 */ { IBV_WC_REM_ACCESS_ERR, DAT_DTO_ERR_REMOTE_ACCESS}, /* 11 */ { IBV_WC_REM_OP_ERR, DAT_DTO_ERR_REMOTE_RESPONDER}, /* 12 */ { IBV_WC_RETRY_EXC_ERR, DAT_DTO_ERR_TRANSPORT}, /* 13 */ { IBV_WC_RNR_RETRY_EXC_ERR, DAT_DTO_ERR_RECEIVER_NOT_READY}, /* 14 */ { IBV_WC_LOC_RDD_VIOL_ERR, DAT_DTO_ERR_LOCAL_PROTECTION}, /* 15 */ { IBV_WC_REM_INV_RD_REQ_ERR, DAT_DTO_ERR_REMOTE_RESPONDER}, /* 16 */ { IBV_WC_REM_ABORT_ERR, DAT_DTO_ERR_REMOTE_RESPONDER}, /* 17 */ { IBV_WC_INV_EECN_ERR, DAT_DTO_ERR_TRANSPORT}, /* 18 */ { IBV_WC_INV_EEC_STATE_ERR, DAT_DTO_ERR_TRANSPORT}, /* 19 */ { IBV_WC_FATAL_ERR, DAT_DTO_ERR_TRANSPORT}, /* 20 */ { IBV_WC_RESP_TIMEOUT_ERR, DAT_DTO_ERR_RECEIVER_NOT_READY}, /* 21 */ { IBV_WC_GENERAL_ERR, DAT_DTO_ERR_TRANSPORT}, }; /* * dapls_ib_get_dto_status * * Return the DAT status of a DTO operation * * Input: * cqe_ptr pointer to completion queue entry * * Output: * none * * Returns: * Value from ib_status_map table above */ DAT_DTO_COMPLETION_STATUS dapls_ib_get_dto_status ( IN ib_work_completion_t *cqe_ptr) { uint32_t ib_status; int i; ib_status = DAPL_GET_CQE_STATUS (cqe_ptr); /* * Due to the implementation of verbs completion code, we need to * search the table for the correct value rather than assuming * linear distribution. */ for (i = 0; i <= IBV_WC_GENERAL_ERR; i++) { if (ib_status == ib_status_map[i].ib_status) { if ( ib_status != IBV_WC_SUCCESS ) { dapl_dbg_log (DAPL_DBG_TYPE_DTO_COMP_ERR, " DTO completion ERROR: %d: op %#x\n", ib_status, DAPL_GET_CQE_OPTYPE (cqe_ptr)); } return ib_status_map[i].dat_status; } } dapl_dbg_log (DAPL_DBG_TYPE_DTO_COMP_ERR, " DTO completion ERROR: %d: op %#x\n", ib_status, DAPL_GET_CQE_OPTYPE (cqe_ptr)); return DAT_DTO_FAILURE; } DAT_RETURN dapls_ib_get_async_event ( IN ib_error_record_t *err_record, OUT DAT_EVENT_NUMBER *async_event) { DAT_RETURN dat_status = DAT_SUCCESS; int err_code = err_record->event_type; switch (err_code) { /* OVERFLOW error */ case IBV_EVENT_CQ_ERR: *async_event = DAT_ASYNC_ERROR_EVD_OVERFLOW; break; /* INTERNAL errors */ case IBV_EVENT_DEVICE_FATAL: *async_event = DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR; break; /* CATASTROPHIC errors */ case IBV_EVENT_PORT_ERR: *async_event = DAT_ASYNC_ERROR_IA_CATASTROPHIC; break; /* BROKEN QP error */ case IBV_EVENT_SQ_DRAINED: case IBV_EVENT_QP_FATAL: case IBV_EVENT_QP_REQ_ERR: case IBV_EVENT_QP_ACCESS_ERR: *async_event = DAT_ASYNC_ERROR_EP_BROKEN; break; /* connection completion */ case IBV_EVENT_COMM_EST: *async_event = DAT_CONNECTION_EVENT_ESTABLISHED; break; /* TODO: process HW state changes */ case IBV_EVENT_PATH_MIG: case IBV_EVENT_PATH_MIG_ERR: case IBV_EVENT_PORT_ACTIVE: case IBV_EVENT_LID_CHANGE: case IBV_EVENT_PKEY_CHANGE: case IBV_EVENT_SM_CHANGE: default: dat_status = DAT_ERROR (DAT_NOT_IMPLEMENTED, 0); } return dat_status; } /* * dapl_ib_cq_alloc * * Alloc a CQ * * Input: * ia_handle IA handle * evd_ptr pointer to EVD struct * cqlen minimum QLen * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * */ 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; } /* * dapl_ib_cq_resize * * Alloc a CQ * * Input: * ia_handle IA handle * evd_ptr pointer to EVD struct * cqlen minimum QLen * * Output: * none * * Returns: * DAT_SUCCESS * 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")); } /* update EVD with new cq handle and size */ evd_ptr->ib_cq_handle = new_cq; *cqlen = new_cq->cqe; /* arm cq for events */ dapls_set_cq_notify (ia_ptr, evd_ptr); return DAT_SUCCESS; } /* * dapls_ib_cq_free * * destroy a CQ * * Input: * ia_handle IA handle * evd_ptr pointer to EVD struct * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER * */ DAT_RETURN dapls_ib_cq_free ( IN DAPL_IA *ia_ptr, IN DAPL_EVD *evd_ptr) { if ( evd_ptr->ib_cq_handle != IB_INVALID_HANDLE ) { /* copy all entries on CQ to EVD before destroying */ dapls_evd_copy_cq(evd_ptr); if (ibv_destroy_cq(evd_ptr->ib_cq_handle)) return(dapl_convert_errno(errno,"destroy_cq")); evd_ptr->ib_cq_handle = IB_INVALID_HANDLE; } return DAT_SUCCESS; } /* * dapls_set_cq_notify * * Set the CQ notification for next * * Input: * hca_handl hca handle * DAPL_EVD evd handle * * Output: * none * * Returns: * DAT_SUCCESS * dapl_convert_errno */ DAT_RETURN dapls_set_cq_notify ( IN DAPL_IA *ia_ptr, IN DAPL_EVD *evd_ptr) { if (ibv_req_notify_cq( evd_ptr->ib_cq_handle, 0 )) return(dapl_convert_errno(errno,"notify_cq")); else return DAT_SUCCESS; } /* * dapls_ib_completion_notify * * Set the CQ notification type * * Input: * hca_handl hca handle * evd_ptr evd handle * type notification type * * Output: * none * * Returns: * DAT_SUCCESS * dapl_convert_errno */ DAT_RETURN dapls_ib_completion_notify ( IN ib_hca_handle_t hca_handle, IN DAPL_EVD *evd_ptr, IN ib_notification_type_t type) { if (ibv_req_notify_cq( evd_ptr->ib_cq_handle, type )) return(dapl_convert_errno(errno,"notify_cq_type")); else return DAT_SUCCESS; } /* * dapls_ib_completion_poll * * CQ poll for completions * * Input: * hca_handl hca handle * evd_ptr evd handle * wc_ptr work completion * * Output: * none * * Returns: * DAT_SUCCESS * DAT_QUEUE_EMPTY * */ DAT_RETURN dapls_ib_completion_poll ( IN DAPL_HCA *hca_ptr, IN DAPL_EVD *evd_ptr, IN ib_work_completion_t *wc_ptr) { int ret; ret = ibv_poll_cq(evd_ptr->ib_cq_handle, 1, wc_ptr); if (ret == 1) return DAT_SUCCESS; return DAT_QUEUE_EMPTY; } #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 * tab-width: 8 * End: */ --- NEW FILE: dapl_ib_dto.h --- /* * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /*************************************************************************** * * Module: uDAPL * * Filename: dapl_ib_dto.h * * Author: Arlin Davis * * Created: 3/10/2005 * * Description: * * The uDAPL openib provider - DTO operations and CQE macros * **************************************************************************** * Source Control System Information * * $Id: dapl_ib_dto.h,v 1.1 2005/10/26 21:19:32 jlentini Exp $ * * Copyright (c) 2005 Intel Corporation. All rights reserved. * **************************************************************************/ #ifndef _DAPL_IB_DTO_H_ #define _DAPL_IB_DTO_H_ #include "dapl_ib_util.h" #define DEFAULT_DS_ENTRIES 8 STATIC _INLINE_ int dapls_cqe_opcode(ib_work_completion_t *cqe_p); /* * dapls_ib_post_recv * * Provider specific Post RECV function */ STATIC _INLINE_ DAT_RETURN dapls_ib_post_recv ( IN DAPL_EP *ep_ptr, IN DAPL_COOKIE *cookie, IN DAT_COUNT segments, IN DAT_LMR_TRIPLET *local_iov ) { ib_data_segment_t ds_array[DEFAULT_DS_ENTRIES]; ib_data_segment_t *ds_array_p; struct ibv_recv_wr wr; struct ibv_recv_wr *bad_wr; DAT_COUNT i, total_len; dapl_dbg_log (DAPL_DBG_TYPE_EP, " post_rcv: ep %p cookie %p segs %d l_iov %p\n", ep_ptr, cookie, segments, local_iov); if ( segments <= DEFAULT_DS_ENTRIES ) ds_array_p = ds_array; else ds_array_p = dapl_os_alloc(segments * sizeof(ib_data_segment_t)); if (NULL == ds_array_p) return (DAT_INSUFFICIENT_RESOURCES); /* setup work request */ total_len = 0; wr.next = 0; wr.num_sge = 0; wr.wr_id = (uint64_t)(uintptr_t)cookie; wr.sg_list = ds_array_p; for (i = 0; i < segments; i++ ) { if ( !local_iov[i].segment_length ) continue; ds_array_p->addr = (uint64_t) local_iov[i].virtual_address; ds_array_p->length = local_iov[i].segment_length; ds_array_p->lkey = local_iov[i].lmr_context; dapl_dbg_log ( DAPL_DBG_TYPE_EP, " post_rcv: l_key 0x%x va %p len %d\n", ds_array_p->lkey, ds_array_p->addr, ds_array_p->length ); total_len += ds_array_p->length; wr.num_sge++; ds_array_p++; } if (cookie != NULL) cookie->val.dto.size = total_len; if (ibv_post_recv(ep_ptr->qp_handle, &wr, &bad_wr)) return( dapl_convert_errno(EFAULT,"ibv_recv") ); return DAT_SUCCESS; } /* * dapls_ib_post_send * * Provider specific Post SEND function */ STATIC _INLINE_ DAT_RETURN dapls_ib_post_send ( IN DAPL_EP *ep_ptr, IN ib_send_op_type_t op_type, IN DAPL_COOKIE *cookie, IN DAT_COUNT segments, IN DAT_LMR_TRIPLET *local_iov, IN const DAT_RMR_TRIPLET *remote_iov, IN DAT_COMPLETION_FLAGS completion_flags) { dapl_dbg_log (DAPL_DBG_TYPE_EP, " post_snd: ep %p op %d ck %p sgs %d l_iov %p r_iov %p f %d\n", ep_ptr, op_type, cookie, segments, local_iov, remote_iov, completion_flags); ib_data_segment_t ds_array[DEFAULT_DS_ENTRIES]; ib_data_segment_t *ds_array_p; struct ibv_send_wr wr; struct ibv_send_wr *bad_wr; ib_hca_transport_t *ibt_ptr = &ep_ptr->header.owner_ia->hca_ptr->ib_trans; DAT_COUNT i, total_len; dapl_dbg_log (DAPL_DBG_TYPE_EP, " post_snd: ep %p cookie %p segs %d l_iov %p\n", ep_ptr, cookie, segments, local_iov); if( segments <= DEFAULT_DS_ENTRIES ) ds_array_p = ds_array; else ds_array_p = dapl_os_alloc(segments * sizeof(ib_data_segment_t)); if (NULL == ds_array_p) return (DAT_INSUFFICIENT_RESOURCES); /* setup the work request */ wr.next = 0; wr.opcode = op_type; wr.num_sge = 0; wr.send_flags = 0; wr.wr_id = (uint64_t)(uintptr_t)cookie; wr.sg_list = ds_array_p; total_len = 0; for (i = 0; i < segments; i++ ) { if ( !local_iov[i].segment_length ) continue; ds_array_p->addr = (uint64_t) local_iov[i].virtual_address; ds_array_p->length = local_iov[i].segment_length; ds_array_p->lkey = local_iov[i].lmr_context; dapl_dbg_log ( DAPL_DBG_TYPE_EP, " post_snd: lkey 0x%x va %p len %d \n", ds_array_p->lkey, ds_array_p->addr, ds_array_p->length ); total_len += ds_array_p->length; wr.num_sge++; ds_array_p++; } if (cookie != NULL) cookie->val.dto.size = total_len; if ((op_type == OP_RDMA_WRITE) || (op_type == OP_RDMA_READ)) { wr.wr.rdma.remote_addr = remote_iov->target_address; wr.wr.rdma.rkey = remote_iov->rmr_context; dapl_dbg_log ( DAPL_DBG_TYPE_EP, " post_snd_rdma: rkey 0x%x va %#016Lx\n", wr.wr.rdma.rkey, wr.wr.rdma.remote_addr ); } /* inline data for send or write ops */ if ((total_len <= ibt_ptr->max_inline_send ) && ((op_type == OP_SEND) || (op_type == OP_RDMA_WRITE))) wr.send_flags |= IBV_SEND_INLINE; /* set completion flags in work request */ wr.send_flags |= (DAT_COMPLETION_SUPPRESS_FLAG & completion_flags) ? 0 : IBV_SEND_SIGNALED; wr.send_flags |= (DAT_COMPLETION_BARRIER_FENCE_FLAG & completion_flags) ? IBV_SEND_FENCE : 0; wr.send_flags |= (DAT_COMPLETION_SOLICITED_WAIT_FLAG & completion_flags) ? IBV_SEND_SOLICITED : 0; dapl_dbg_log (DAPL_DBG_TYPE_EP, " post_snd: op 0x%x flags 0x%x sglist %p, %d\n", wr.opcode, wr.send_flags, wr.sg_list, wr.num_sge); if (ibv_post_send(ep_ptr->qp_handle, &wr, &bad_wr)) return( dapl_convert_errno(EFAULT,"ibv_recv") ); dapl_dbg_log (DAPL_DBG_TYPE_EP," post_snd: returned\n"); return DAT_SUCCESS; } STATIC _INLINE_ DAT_RETURN dapls_ib_optional_prv_dat ( IN DAPL_CR *cr_ptr, IN const void *event_data, OUT DAPL_CR **cr_pp) { return DAT_SUCCESS; } STATIC _INLINE_ int dapls_cqe_opcode(ib_work_completion_t *cqe_p) { switch (cqe_p->opcode) { case IBV_WC_SEND: return (OP_SEND); case IBV_WC_RDMA_WRITE: return (OP_RDMA_WRITE); case IBV_WC_RDMA_READ: return (OP_RDMA_READ); case IBV_WC_COMP_SWAP: return (OP_COMP_AND_SWAP); case IBV_WC_FETCH_ADD: return (OP_FETCH_AND_ADD); case IBV_WC_BIND_MW: return (OP_BIND_MW); case IBV_WC_RECV: return (OP_RECEIVE); case IBV_WC_RECV_RDMA_WITH_IMM: return (OP_RECEIVE_IMM); default: return (OP_INVALID); } } #define DAPL_GET_CQE_OPTYPE(cqe_p) dapls_cqe_opcode(cqe_p) #define DAPL_GET_CQE_WRID(cqe_p) ((ib_work_completion_t*)cqe_p)->wr_id #define DAPL_GET_CQE_STATUS(cqe_p) ((ib_work_completion_t*)cqe_p)->status #define DAPL_GET_CQE_BYTESNUM(cqe_p) ((ib_work_completion_t*)cqe_p)->byte_len #define DAPL_GET_CQE_IMMED_DATA(cqe_p) ((ib_work_completion_t*)cqe_p)->imm_data #endif /* _DAPL_IB_DTO_H_ */ --- NEW FILE: dapl_ib_mem.c --- /* * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_det_mem.c * * PURPOSE: Intel DET APIs: Memory windows, registration, * and protection domain * * $Id: dapl_ib_mem.c,v 1.1 2005/10/26 21:19:32 jlentini Exp $ * **********************************************************************/ #include <sys/ioctl.h> /* for IOCTL's */ #include <sys/types.h> /* for socket(2) and related bits and pieces */ #include <sys/socket.h> /* for socket(2) */ #include <net/if.h> /* for struct ifreq */ #include <net/if_arp.h> /* for ARPHRD_ETHER */ #include <unistd.h> /* for _SC_CLK_TCK */ #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_lmr_util.h" /* * dapls_convert_privileges * * Convert LMR privileges to provider * * Input: * DAT_MEM_PRIV_FLAGS * * Output: * none * * Returns: * ibv_access_flags * */ STATIC _INLINE_ int dapls_convert_privileges ( IN DAT_MEM_PRIV_FLAGS privileges) { int access = 0; /* * if (DAT_MEM_PRIV_LOCAL_READ_FLAG & privileges) do nothing */ if (DAT_MEM_PRIV_LOCAL_WRITE_FLAG & privileges) access |= IBV_ACCESS_LOCAL_WRITE; if (DAT_MEM_PRIV_REMOTE_WRITE_FLAG & privileges) access |= IBV_ACCESS_REMOTE_WRITE; if (DAT_MEM_PRIV_REMOTE_READ_FLAG & privileges) access |= IBV_ACCESS_REMOTE_READ; if (DAT_MEM_PRIV_REMOTE_READ_FLAG & privileges) access |= IBV_ACCESS_REMOTE_READ; if (DAT_MEM_PRIV_REMOTE_READ_FLAG & privileges) access |= IBV_ACCESS_REMOTE_READ; return access; } /* * dapl_ib_pd_alloc * * Alloc a PD * * Input: * ia_handle IA handle * pz pointer to PZ struct * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_ib_pd_alloc ( IN DAPL_IA *ia_ptr, IN DAPL_PZ *pz ) { /* get a protection domain */ pz->pd_handle = ibv_alloc_pd(ia_ptr->hca_ptr->ib_hca_handle); if (!pz->pd_handle) return(dapl_convert_errno(ENOMEM,"alloc_pd")); dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " pd_alloc: pd_handle=%p\n", pz->pd_handle ); return DAT_SUCCESS; } /* * dapl_ib_pd_free * * Free a PD * * Input: * ia_handle IA handle * PZ_ptr pointer to PZ struct * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_STATE * */ DAT_RETURN dapls_ib_pd_free ( IN DAPL_PZ *pz ) { if (pz->pd_handle != IB_INVALID_HANDLE) { if (ibv_dealloc_pd(pz->pd_handle)) return(dapl_convert_errno(errno,"dealloc_pd")); pz->pd_handle = IB_INVALID_HANDLE; } return DAT_SUCCESS; } /* * dapl_ib_mr_register * * Register a virtual memory region * * Input: * ia_handle IA handle * lmr pointer to dapl_lmr struct * virt_addr virtual address of beginning of mem region * length length of memory region * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_ib_mr_register ( IN DAPL_IA *ia_ptr, IN DAPL_LMR *lmr, IN DAT_PVOID virt_addr, IN DAT_VLEN length, IN DAT_MEM_PRIV_FLAGS privileges) { ib_pd_handle_t ib_pd_handle; ib_pd_handle = ((DAPL_PZ *)lmr->param.pz_handle)->pd_handle; dapl_dbg_log ( DAPL_DBG_TYPE_UTIL, " mr_register: ia=%p, lmr=%p va=%p ln=%d pv=0x%x\n", ia_ptr, lmr, virt_addr, length, privileges ); /* TODO: shared memory */ if (lmr->param.mem_type == DAT_MEM_TYPE_SHARED_VIRTUAL) { dapl_dbg_log( DAPL_DBG_TYPE_ERR, " mr_register_shared: NOT IMPLEMENTED\n"); return DAT_ERROR (DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE); } /* local read is default on IB */ lmr->mr_handle = ibv_reg_mr(((DAPL_PZ *)lmr->param.pz_handle)->pd_handle, virt_addr, length, dapls_convert_privileges(privileges)); if (!lmr->mr_handle) return(dapl_convert_errno(ENOMEM,"reg_mr")); lmr->param.lmr_context = lmr->mr_handle->lkey; lmr->param.rmr_context = lmr->mr_handle->rkey; lmr->param.registered_size = length; lmr->param.registered_address = (DAT_VADDR)(uintptr_t) virt_addr; dapl_dbg_log ( DAPL_DBG_TYPE_UTIL, " mr_register: mr=%p h %x pd %p ctx %p ,lkey=0x%x, rkey=0x%x priv=%x\n", lmr->mr_handle, lmr->mr_handle->handle, lmr->mr_handle->pd, lmr->mr_handle->context, lmr->mr_handle->lkey, lmr->mr_handle->rkey, length, dapls_convert_privileges(privileges) ); return DAT_SUCCESS; } /* * dapl_ib_mr_deregister * * Free a memory region * * Input: * lmr pointer to dapl_lmr struct * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_STATE * */ DAT_RETURN dapls_ib_mr_deregister ( IN DAPL_LMR *lmr ) { if (lmr->mr_handle != IB_INVALID_HANDLE) { if (ibv_dereg_mr(lmr->mr_handle)) return(dapl_convert_errno(errno,"dereg_pd")); lmr->mr_handle = IB_INVALID_HANDLE; } return DAT_SUCCESS; } /* * dapl_ib_mr_register_shared * * Register a virtual memory region * * Input: * ia_ptr IA handle * lmr pointer to dapl_lmr struct * virt_addr virtual address of beginning of mem region * length length of memory region * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_ib_mr_register_shared ( IN DAPL_IA *ia_ptr, IN DAPL_LMR *lmr, IN DAT_MEM_PRIV_FLAGS privileges ) { dapl_dbg_log(DAPL_DBG_TYPE_ERR," mr_register_shared: NOT IMPLEMENTED\n"); return DAT_ERROR (DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE); } /* * dapls_ib_mw_alloc * * Bind a protection domain to a memory window * * Input: * rmr Initialized rmr to hold binding handles * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_ib_mw_alloc ( IN DAPL_RMR *rmr ) { dapl_dbg_log(DAPL_DBG_TYPE_ERR," mw_alloc: NOT IMPLEMENTED\n"); return DAT_ERROR (DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE); } /* * dapls_ib_mw_free * * Release bindings of a protection domain to a memory window * * Input: * rmr Initialized rmr to hold binding handles * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_STATE * */ DAT_RETURN dapls_ib_mw_free ( IN DAPL_RMR *rmr ) { dapl_dbg_log(DAPL_DBG_TYPE_ERR," mw_free: NOT IMPLEMENTED\n"); return DAT_ERROR (DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE); } /* * dapls_ib_mw_bind * * Bind a protection domain to a memory window * * Input: * rmr Initialized rmr to hold binding handles * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER; * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_ib_mw_bind ( IN DAPL_RMR *rmr, IN DAPL_LMR *lmr, IN DAPL_EP *ep, IN DAPL_COOKIE *cookie, IN DAT_VADDR virtual_address, IN DAT_VLEN length, IN DAT_MEM_PRIV_FLAGS mem_priv, IN DAT_BOOLEAN is_signaled) { dapl_dbg_log(DAPL_DBG_TYPE_ERR," mw_bind: NOT IMPLEMENTED\n"); return DAT_ERROR (DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE); } /* * dapls_ib_mw_unbind * * Unbind a protection domain from a memory window * * Input: * rmr Initialized rmr to hold binding handles * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER; * DAT_INVALID_STATE; * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_ib_mw_unbind ( IN DAPL_RMR *rmr, IN DAPL_EP *ep, IN DAPL_COOKIE *cookie, IN DAT_BOOLEAN is_signaled ) { dapl_dbg_log(DAPL_DBG_TYPE_ERR," mw_unbind: NOT IMPLEMENTED\n"); return DAT_ERROR (DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE); } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ --- NEW FILE: dapl_ib_qp.c --- /* * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_det_qp.c * * PURPOSE: QP routines for access to DET Verbs * * $Id: dapl_ib_qp.c,v 1.1 2005/10/26 21:19:32 jlentini Exp $ **********************************************************************/ #include "dapl.h" #include "dapl_adapter_util.h" /* * dapl_ib_qp_alloc * * Alloc a QP * * Input: * *ep_ptr pointer to EP INFO * ib_hca_handle provider HCA handle * ib_pd_handle provider protection domain handle * cq_recv provider recv CQ handle * cq_send provider send CQ handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INTERNAL_ERROR * */ DAT_RETURN dapls_ib_qp_alloc ( IN DAPL_IA *ia_ptr, IN DAPL_EP *ep_ptr, IN DAPL_EP *ep_ctx_ptr ) { DAT_EP_ATTR *attr; DAPL_EVD *rcv_evd, *req_evd; ib_cq_handle_t rcv_cq, req_cq; ib_pd_handle_t ib_pd_handle; struct ibv_qp_init_attr qp_create; dapl_dbg_log (DAPL_DBG_TYPE_EP, " qp_alloc: ia_ptr %p ep_ptr %p ep_ctx_ptr %p\n", ia_ptr, ep_ptr, ep_ctx_ptr); 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; /* Setup attributes and create qp */ dapl_os_memzero((void*)&qp_create, sizeof(qp_create)); qp_create.send_cq = req_cq; qp_create.recv_cq = rcv_cq; qp_create.cap.max_send_wr = attr->max_request_dtos; qp_create.cap.max_recv_wr = attr->max_recv_dtos; qp_create.cap.max_send_sge = attr->max_request_iov; qp_create.cap.max_recv_sge = attr->max_recv_iov; qp_create.cap.max_inline_data = ia_ptr->hca_ptr->ib_trans.max_inline_send; qp_create.qp_type = IBV_QPT_RC; qp_create.qp_context = (void*)ep_ptr; ep_ptr->qp_handle = ibv_create_qp( ib_pd_handle, &qp_create); if (!ep_ptr->qp_handle) return(dapl_convert_errno(ENOMEM, "create_qp")); dapl_dbg_log ( DAPL_DBG_TYPE_EP, " qp_alloc: qpn %p sq %d,%d rq %d,%d\n", ep_ptr->qp_handle->qp_num, qp_create.cap.max_send_wr,qp_create.cap.max_send_sge, qp_create.cap.max_recv_wr,qp_create.cap.max_recv_sge ); /* Setup QP attributes for INIT state on the way out */ if (dapls_modify_qp_state(ep_ptr->qp_handle, IBV_QPS_INIT, NULL ) != DAT_SUCCESS ) { ibv_destroy_qp(ep_ptr->qp_handle); ep_ptr->qp_handle = IB_INVALID_HANDLE; return DAT_INTERNAL_ERROR; } ep_ptr->qp_state = IB_QP_STATE_INIT; return DAT_SUCCESS; } /* * dapl_ib_qp_free * * Free a QP * * Input: * ia_handle IA handle * *ep_ptr pointer to EP INFO * * Output: * none * * Returns: * DAT_SUCCESS * dapl_convert_errno * */ DAT_RETURN dapls_ib_qp_free ( IN DAPL_IA *ia_ptr, IN DAPL_EP *ep_ptr ) { dapl_dbg_log (DAPL_DBG_TYPE_EP, " qp_free: ep_ptr %p qp %p\n", ep_ptr, ep_ptr->qp_handle); if (ep_ptr->qp_handle != IB_INVALID_HANDLE) { /* force error state to flush queue, then destroy */ dapls_modify_qp_state(ep_ptr->qp_handle, IBV_QPS_ERR, NULL); if (ibv_destroy_qp(ep_ptr->qp_handle)) return(dapl_convert_errno(errno,"destroy_qp")); ep_ptr->qp_handle = IB_INVALID_HANDLE; ep_ptr->qp_state = IB_QP_STATE_ERROR; } return DAT_SUCCESS; } /* * dapl_ib_qp_modify * * Set the QP to the parameters specified in an EP_PARAM * * The EP_PARAM structure that is provided has been * sanitized such that only non-zero values are valid. * * Input: * ib_hca_handle HCA handle * qp_handle QP handle * ep_attr Sanitized EP Params * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * */ DAT_RETURN dapls_ib_qp_modify ( IN DAPL_IA *ia_ptr, IN DAPL_EP *ep_ptr, IN DAT_EP_ATTR *attr ) { struct ibv_qp_attr qp_attr; if (ep_ptr->qp_handle == IB_INVALID_HANDLE) return DAT_INVALID_PARAMETER; /* * EP state, qp_handle state should be an indication * of current state but the only way to be sure is with * a user mode ibv_query_qp call which is NOT available */ /* move to error state if necessary */ if ((ep_ptr->qp_state == IB_QP_STATE_ERROR) && (ep_ptr->qp_handle->state != IBV_QPS_ERR)) { ep_ptr->qp_state = IB_QP_STATE_ERROR; return (dapls_modify_qp_state(ep_ptr->qp_handle, IBV_QPS_ERR, NULL)); } /* * Check if we have the right qp_state to modify attributes */ if ((ep_ptr->qp_handle->state != IBV_QPS_RTR ) && (ep_ptr->qp_handle->state != IBV_QPS_RTS )) return DAT_INVALID_STATE; /* Adjust to current EP attributes */ dapl_os_memzero((void*)&qp_attr, sizeof(qp_attr)); qp_attr.cap.max_send_wr = attr->max_request_dtos; qp_attr.cap.max_recv_wr = attr->max_recv_dtos; qp_attr.cap.max_send_sge = attr->max_request_iov; qp_attr.cap.max_recv_sge = attr->max_recv_iov; dapl_dbg_log (DAPL_DBG_TYPE_EP, "modify_qp: qp %p sq %d,%d, rq %d,%d\n", ep_ptr->qp_handle, qp_attr.cap.max_send_wr, qp_attr.cap.max_send_sge, qp_attr.cap.max_recv_wr, qp_attr.cap.max_recv_sge ); if (ibv_modify_qp(ep_ptr->qp_handle, &qp_attr, IBV_QP_CAP)) { dapl_dbg_log (DAPL_DBG_TYPE_ERR, "modify_qp: modify ep %p qp %p failed\n", ep_ptr, ep_ptr->qp_handle); return(dapl_convert_errno(errno,"modify_qp_state")); } return DAT_SUCCESS; } /* * dapls_ib_reinit_ep * * Move the QP to INIT state again. * * Input: * ep_ptr DAPL_EP * * Output: * none * * Returns: * void * */ void dapls_ib_reinit_ep ( IN DAPL_EP *ep_ptr) { if ( ep_ptr->qp_handle != IB_INVALID_HANDLE ) { /* move to RESET state and then to INIT */ dapls_modify_qp_state(ep_ptr->qp_handle, IBV_QPS_RESET, 0); dapls_modify_qp_state(ep_ptr->qp_handle, IBV_QPS_INIT, 0); ep_ptr->qp_state = IB_QP_STATE_INIT; } /* TODO: When IB-CM is implement then handle timewait before * allowing re-use of this QP */ } /* * Generic QP modify for init, reset, error, RTS, RTR */ DAT_RETURN dapls_modify_qp_state ( IN ib_qp_handle_t qp_handle, IN ib_qp_state_t qp_state, IN ib_qp_cm_t *qp_cm ) { struct ibv_qp_attr qp_attr; enum ibv_qp_attr_mask mask = IBV_QP_STATE; dapl_os_memzero((void*)&qp_attr, sizeof(qp_attr)); qp_attr.qp_state = qp_state; switch (qp_state) { /* additional attributes with RTR and RTS */ case IBV_QPS_RTR: { mask |= IBV_QP_AV | IBV_QP_PATH_MTU | IBV_QP_DEST_QPN | IBV_QP_RQ_PSN | IBV_QP_MAX_DEST_RD_ATOMIC | IBV_QP_MIN_RNR_TIMER; qp_attr.qp_state = IBV_QPS_RTR; qp_attr.path_mtu = IBV_MTU_1024; qp_attr.dest_qp_num = qp_cm->qpn; qp_attr.rq_psn = 1; qp_attr.max_dest_rd_atomic = 8; qp_attr.min_rnr_timer = 12; qp_attr.ah_attr.is_global = 0; qp_attr.ah_attr.dlid = qp_cm->lid; qp_attr.ah_attr.sl = 0; qp_attr.ah_attr.src_path_bits = 0; qp_attr.ah_attr.port_num = qp_cm->port; dapl_dbg_log (DAPL_DBG_TYPE_EP, " modify_qp_rtr: qpn %x lid %x port %x\n", qp_cm->qpn,qp_cm->lid,qp_cm->port ); break; } case IBV_QPS_RTS: { mask |= IBV_QP_TIMEOUT | IBV_QP_RETRY_CNT | IBV_QP_RNR_RETRY | IBV_QP_SQ_PSN | IBV_QP_MAX_QP_RD_ATOMIC; qp_attr.qp_state = IBV_QPS_RTS; qp_attr.timeout = 14; qp_attr.retry_cnt = 7; qp_attr.rnr_retry = 7; qp_attr.sq_psn = 1; qp_attr.max_rd_atomic = 8; dapl_dbg_log (DAPL_DBG_TYPE_EP, " modify_qp_rts: psn %x or %x\n", qp_attr.sq_psn, qp_attr.max_rd_atomic ); break; } case IBV_QPS_INIT: { DAPL_IA *ia_ptr; DAPL_EP *ep_ptr; /* need to find way back to port num */ ep_ptr = (DAPL_EP*)qp_handle->qp_context; if (ep_ptr) ia_ptr = ep_ptr->header.owner_ia; else break; mask |= IBV_QP_PKEY_INDEX | IBV_QP_PORT | IBV_QP_ACCESS_FLAGS; qp_attr.pkey_index = 0; qp_attr.port_num = ia_ptr->hca_ptr->port_num; qp_attr.qp_access_flags = IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE | IBV_ACCESS_REMOTE_READ | IBV_ACCESS_REMOTE_ATOMIC; dapl_dbg_log (DAPL_DBG_TYPE_EP, " modify_qp_init: pi %x port %x acc %x\n", qp_attr.pkey_index, qp_attr.port_num, qp_attr.qp_access_flags ); break; } default: break; } if (ibv_modify_qp(qp_handle, &qp_attr, mask)) return(dapl_convert_errno(errno,"modify_qp_state")); return DAT_SUCCESS; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ --- NEW FILE: dapl_ib_util.c --- /* * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /*************************************************************************** * * Module: uDAPL * * Filename: dapl_ib_util.c * * Author: Arlin Davis * * Created: 3/10/2005 * * Description: * * The uDAPL openib provider - init, open, close, utilities * **************************************************************************** * Source Control System Information * * $Id: dapl_ib_util.c,v 1.1 2005/10/26 21:19:32 jlentini Exp $ * * Copyright (c) 2005 Intel Corporation. All rights reserved. * **************************************************************************/ #ifdef RCSID static const char rcsid[] = "$Id: dapl_ib_util.c,v 1.1 2005/10/26 21:19:32 jlentini Exp $"; #endif #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_ib_util.h" #include <stdlib.h> #include <netinet/tcp.h> #include <sys/utsname.h> #include <unistd.h> #include <fcntl.h> int g_dapl_loopback_connection = 0; /* just get IP address for hostname */ DAT_RETURN getipaddr( char *addr, int addr_len) { struct sockaddr_in *ipv4_addr = (struct sockaddr_in*)addr; struct hostent *h_ptr; struct utsname ourname; if ( uname( &ourname ) < 0 ) return DAT_INTERNAL_ERROR; h_ptr = gethostbyname( ourname.nodename ); if ( h_ptr == NULL ) return DAT_INTERNAL_ERROR; if ( h_ptr->h_addrtype == AF_INET ) { ipv4_addr = (struct sockaddr_in*) addr; ipv4_addr->sin_family = AF_INET; dapl_os_memcpy( &ipv4_addr->sin_addr, h_ptr->h_addr_list[0], 4 ); } else return DAT_INVALID_ADDRESS; return DAT_SUCCESS; } /* * dapls_ib_init, dapls_ib_release * * Initialize Verb related items for device open * * Input: * none * * Output: * none * * Returns: * 0 success, -1 error * */ int32_t dapls_ib_init (void) { return 0; } int32_t dapls_ib_release (void) { return 0; } /* * dapls_ib_open_hca * * Open HCA * * Input: * *hca_name pointer to provider device name * *ib_hca_handle_p pointer to provide HCA handle * * Output: * none * * Return: * 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; int opts; DAT_RETURN dat_status = DAT_SUCCESS; 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; } if (!hca_ptr->ib_trans.ib_dev) { dapl_dbg_log (DAPL_DBG_TYPE_ERR, " open_hca: IB device %s not found\n", hca_name); return DAT_INTERNAL_ERROR; } dapl_dbg_log (DAPL_DBG_TYPE_UTIL," open_hca: Found dev %s %016llx\n", ibv_get_device_name(hca_ptr->ib_trans.ib_dev), (unsigned long long)bswap_64(ibv_get_device_guid(hca_ptr->ib_trans.ib_dev))); hca_ptr->ib_hca_handle = ibv_open_device(hca_ptr->ib_trans.ib_dev); if (!hca_ptr->ib_hca_handle) { dapl_dbg_log (DAPL_DBG_TYPE_ERR, " open_hca: IB dev open failed for %s\n", ibv_get_device_name(hca_ptr->ib_trans.ib_dev) ); return DAT_INTERNAL_ERROR; } /* set inline max with enviroment or default */ hca_ptr->ib_trans.max_inline_send = dapl_os_get_env_val ( "DAPL_MAX_INLINE", INLINE_SEND_DEFAULT ); /* initialize cq_lock */ dat_status = dapl_os_lock_init(&hca_ptr->ib_trans.cq_lock); if (dat_status != DAT_SUCCESS) { dapl_dbg_log (DAPL_DBG_TYPE_ERR, " open_hca: failed to init cq_lock\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; } if (dapli_cq_thread_init(hca_ptr)) { dapl_dbg_log (DAPL_DBG_TYPE_ERR, " open_hca: cq_thread_init failed for %s\n", ibv_get_device_name(hca_ptr->ib_trans.ib_dev) ); goto bail; } /* initialize cr_list lock */ dat_status = dapl_os_lock_init(&hca_ptr->ib_trans.lock); if (dat_status != DAT_SUCCESS) { dapl_dbg_log (DAPL_DBG_TYPE_ERR, " open_hca: failed to init lock\n"); goto bail; } /* initialize CM list for listens on this HCA */ dapl_llist_init_head(&hca_ptr->ib_trans.list); /* create thread to process inbound connect request */ hca_ptr->ib_trans.cr_state = IB_THREAD_INIT; dat_status = dapl_os_thread_create(cr_thread, (void*)hca_ptr, &hca_ptr->ib_trans.thread ); if (dat_status != DAT_SUCCESS) { dapl_dbg_log (DAPL_DBG_TYPE_ERR, " open_hca: failed to create thread\n"); goto bail; } /* wait for thread */ while (hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) { struct timespec sleep, remain; sleep.tv_sec = 0; sleep.tv_nsec = 20000000; /* 20 ms */ dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " open_hca: waiting for cr_thread\n"); nanosleep (&sleep, &remain); } /* get the IP address of the device */ dat_status = getipaddr((char*)&hca_ptr->hca_address, sizeof(DAT_SOCK_ADDR6) ); dapl_dbg_log (DAPL_DBG_TYPE_UTIL, " open_hca: %s, port %d, %s %d.%d.%d.%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 ); return dat_status; bail: ibv_close_device(hca_ptr->ib_hca_handle); hca_ptr->ib_hca_handle = IB_INVALID_HANDLE; return DAT_INTERNAL_ERROR; } /* * dapls_ib_close_hca * * Open HCA * * Input: * DAPL_HCA provide CA handle * * Output: * none * * Return: * DAT_SUCCESS * dapl_convert_errno * */ DAT_RETURN dapls_ib_close_hca ( IN DAPL_HCA *hca_ptr ) { dapl_dbg_log (DAPL_DBG_TYPE_UTIL," close_hca: %p\n",hca_ptr); dapli_cq_thread_destroy(hca_ptr); if (hca_ptr->ib_hca_handle != IB_INVALID_HANDLE) { if (ibv_close_device(hca_ptr->ib_hca_handle)) return(dapl_convert_errno(errno,"ib_close_device")); hca_ptr->ib_hca_handle = IB_INVALID_HANDLE; } dapl_os_lock_destroy(&hca_ptr->ib_trans.cq_lock); /* destroy cr_thread and lock */ hca_ptr->ib_trans.cr_state = IB_THREAD_CANCEL; while (hca_ptr->ib_trans.cr_state != IB_THREAD_EXIT) { struct timespec sleep, remain; sleep.tv_sec = 0; sleep.tv_nsec = 20000000; /* 20 ms */ dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " close_hca: waiting for cr_thread\n"); nanosleep (&sleep, &remain); } dapl_os_lock_destroy(&hca_ptr->ib_trans.lock); return (DAT_SUCCESS); } /* * dapls_ib_query_hca * * Query the hca attribute * * Input: * hca_handl hca handle * ia_attr attribute of the ia * ep_attr attribute of the ep * ip_addr ip address of DET NIC * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE */ DAT_RETURN dapls_ib_query_hca ( IN DAPL_HCA *hca_ptr, OUT DAT_IA_ATTR *ia_attr, OUT DAT_EP_ATTR *ep_attr, OUT DAT_SOCK_ADDR6 *ip_addr) { struct ibv_device_attr dev_attr; struct ibv_port_attr port_attr; if (hca_ptr->ib_hca_handle == NULL) { dapl_dbg_log (DAPL_DBG_TYPE_ERR," query_hca: BAD handle\n"); return (DAT_INVALID_HANDLE); } /* local IP address of device, set during ia_open */ if (ip_addr != NULL) memcpy(ip_addr, &hca_ptr->hca_address, sizeof(DAT_SOCK_ADDR6)); if (ia_attr == NULL && ep_attr == NULL) return DAT_SUCCESS; /* query verbs for this device and port attributes */ if (ibv_query_device(hca_ptr->ib_hca_handle, &dev_attr) || ibv_query_port(hca_ptr->ib_hca_handle, hca_ptr->port_num, &port_attr)) return(dapl_convert_errno(errno,"ib_query_hca")); if (ia_attr != NULL) { ia_attr->adapter_name[DAT_NAME_MAX_LENGTH - 1] = '\0'; ia_attr->vendor_name[DAT_NAME_MAX_LENGTH - 1] = '\0'; ia_attr->ia_address_ptr = (DAT_IA_ADDRESS_PTR)&hca_ptr->hca_address; dapl_dbg_log (DAPL_DBG_TYPE_UTIL, " query_hca: %s %s %d.%d.%d.%d\n", ibv_get_device_name(hca_ptr->ib_trans.ib_dev), ((struct sockaddr_in *)ia_attr->ia_address_ptr)->sin_family == AF_INET ? "AF_INET":"AF_INET6", ((struct sockaddr_in *)ia_attr->ia_address_ptr)->sin_addr.s_addr >> 0 & 0xff, ((struct sockaddr_in *)ia_attr->ia_address_ptr)->sin_addr.s_addr >> 8 & 0xff, ((struct sockaddr_in *)ia_attr->ia_address_ptr)->sin_addr.s_addr >> 16 & 0xff, ((struct sockaddr_in *)ia_attr->ia_address_ptr)->sin_addr.s_addr >> 24 & 0xff ); ia_attr->hardware_version_major = dev_attr.hw_ver; /* ia_attr->hardware_version_minor = dev_attr.fw_ver; */ ia_attr->max_eps = dev_attr.max_qp; ia_attr->max_dto_per_ep = dev_attr.max_qp_wr; ia_attr->max_rdma_read_per_ep = dev_attr.max_qp_rd_atom; ia_attr->max_evds = dev_attr.max_cq; ia_attr->max_evd_qlen = dev_attr.max_cqe; ia_attr->max_iov_segments_per_dto = dev_attr.max_sge; ia_attr->max_lmrs = dev_attr.max_mr; ia_attr->max_lmr_block_size = dev_attr.max_mr_size; ia_attr->max_rmrs = dev_attr.max_mw; ia_attr->max_lmr_virtual_address = dev_attr.max_mr_size; ia_attr->max_rmr_target_address = dev_attr.max_mr_size; ia_attr->max_pzs = dev_attr.max_pd; ia_attr->max_mtu_size = port_attr.max_msg_sz; ia_attr->max_rdma_size = port_attr.max_msg_sz; ia_attr->num_transport_attr = 0; ia_attr->transport_attr = NULL; ia_attr->num_vendor_attr = 0; ia_attr->vendor_attr = NULL; dapl_dbg_log (DAPL_DBG_TYPE_UTIL, " query_hca: (%x.%x) ep %d ep_q %d evd %d evd_q %d\n", ia_attr->hardware_version_major, ia_attr->hardware_version_minor, ia_attr->max_eps, ia_attr->max_dto_per_ep, ia_attr->max_evds, ia_attr->max_evd_qlen ); dapl_dbg_log (DAPL_DBG_TYPE_UTIL, " query_hca: msg %llu rdma %llu iov %d lmr %d rmr %d\n", ia_attr->max_mtu_size, ia_attr->max_rdma_size, ia_attr->max_iov_segments_per_dto, ia_attr->max_lmrs, ia_attr->max_rmrs ); } if (ep_attr != NULL) { ep_attr->max_mtu_size = port_attr.max_msg_sz; ep_attr->max_rdma_size = port_attr.max_msg_sz; ep_attr->max_recv_dtos = dev_attr.max_qp_wr; ep_attr->max_request_dtos = dev_attr.max_qp_wr; ep_attr->max_recv_iov = dev_attr.max_sge; ep_attr->max_request_iov = dev_attr.max_sge; ep_attr->max_rdma_read_in = dev_attr.max_qp_rd_atom; ep_attr->max_rdma_read_out= dev_attr.max_qp_rd_atom; dapl_dbg_log (DAPL_DBG_TYPE_UTIL, " query_hca: MAX msg %llu dto %d iov %d rdma i%d,o%d\n", ep_attr->max_mtu_size, ep_attr->max_recv_dtos, ep_attr->max_recv_iov, ep_attr->max_rdma_read_in, ep_attr->max_rdma_read_out); } return DAT_SUCCESS; } /* * dapls_ib_setup_async_callback * * Set up an asynchronous callbacks of various kinds * * Input: * ia_handle IA handle * handler_type type of handler to set up * callback_handle handle param for completion callbacks * callback callback routine pointer * context argument for callback routine * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * */ DAT_RETURN dapls_ib_setup_async_callback ( IN DAPL_IA *ia_ptr, IN DAPL_ASYNC_HANDLER_TYPE handler_type, IN DAPL_EVD *evd_ptr, IN ib_async_handler_t callback, IN void *context ) { ib_hca_transport_t *hca_ptr; dapl_dbg_log (DAPL_DBG_TYPE_UTIL, " setup_async_cb: ia %p type %d handle %p cb %p ctx %p\n", ia_ptr, handler_type, evd_ptr, callback, context); hca_ptr = &ia_ptr->hca_ptr->ib_trans; switch(handler_type) { case DAPL_ASYNC_UNAFILIATED: hca_ptr->async_unafiliated = (ib_async_handler_t)callback; hca_ptr->async_un_ctx = context; break; case DAPL_ASYNC_CQ_ERROR: hca_ptr->async_cq_error = (ib_async_cq_handler_t)callback; break; case DAPL_ASYNC_CQ_COMPLETION: hca_ptr->async_cq = (ib_async_dto_handler_t)callback; break; case DAPL_ASYNC_QP_ERROR: hca_ptr->async_qp_error = (ib_async_qp_handler_t)callback; break; default: break; } return DAT_SUCCESS; } --- NEW FILE: dapl_ib_util.h --- /* * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /*************************************************************************** * * Module: uDAPL * * Filename: dapl_ib_util.h * * Author: Arlin Davis * * Created: 3/10/2005 * * Description: * * The uDAPL openib provider - definitions, prototypes, * **************************************************************************** * Source Control System Information * * $Id: dapl_ib_util.h,v 1.1 2005/10/26 21:19:32 jlentini Exp $ * * Copyright (c) 2005 Intel Corporation. All rights reserved. * **************************************************************************/ #ifndef _DAPL_IB_UTIL_H_ #define _DAPL_IB_UTIL_H_ #include "verbs.h" #include <byteswap.h> #ifndef __cplusplus #define false 0 #define true 1 #endif /*__cplusplus */ /* Typedefs to map common DAPL provider types to IB verbs */ typedef struct ibv_qp *ib_qp_handle_t; typedef struct ibv_cq *ib_cq_handle_t; typedef struct ibv_pd *ib_pd_handle_t; typedef struct ibv_mr *ib_mr_handle_t; typedef... [truncated message content] |
From: James L. <jle...@us...> - 2005-10-26 21:14:25
|
Update of /cvsroot/dapl/dapl/openib_scm In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1144/dapl/openib_scm Log Message: Directory /cvsroot/dapl/dapl/openib_scm added to the repository |
From: James L. <jle...@us...> - 2005-10-26 21:14:05
|
Update of /cvsroot/dapl/dapl/udapl In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv659/dapl/udapl Modified Files: Makefile Log Message: uDAPL provider for the OpenIB socket CM. Signed-off by: Arlin Davis <ar...@ic...> Signed-off-by: James Lentini <jle...@ne...> Index: Makefile =================================================================== RCS file: /cvsroot/dapl/dapl/udapl/Makefile,v retrieving revision 1.69 retrieving revision 1.70 diff -C10 -d -r1.69 -r1.70 *** Makefile 3 Oct 2005 14:47:51 -0000 1.69 --- Makefile 26 Oct 2005 21:13:54 -0000 1.70 *************** *** 135,154 **** --- 135,164 ---- # OpenIB provider # ifeq ($(VERBS),openib) PROVIDER = $(TOPDIR)/../openib CFLAGS += -DOPENIB CFLAGS += -DCQ_WAIT_OBJECT CFLAGS += -I/usr/local/include/infiniband endif # + # OpenIB provider with Socket CM + # + ifeq ($(VERBS),openib_scm) + PROVIDER = $(TOPDIR)/../openib_scm + CFLAGS += -DOPENIB + CFLAGS += -DCQ_WAIT_OBJECT + CFLAGS += -I/usr/local/include/infiniband + endif + + # # If an implementation supports CM and DTO completions on the same EVD # then DAPL_MERGE_CM_DTO should be set # CFLAGS += -DDAPL_MERGE_CM_DTO=1 # # If an implementation supports Shared Memory, enable # VN_MEM_SHARED_VIRTUAL_SUPPORT # CFLAGS += -DVN_MEM_SHARED_VIRTUAL_SUPPORT=1 CFLAGS += -I. *************** *** 247,266 **** --- 257,283 ---- PROVIDER_SRCS += dapl_openib_util.c dapl_openib_cm.c dapl_openib_cm_util_user.c endif ifeq ($(VERBS),openib) LDFLAGS += -libverbs -libcm -libat LDFLAGS += -rpath /usr/local/lib -L /usr/local/lib PROVIDER_SRCS = dapl_ib_util.c dapl_ib_cq.c dapl_ib_qp.c PROVIDER_SRCS += dapl_ib_cm.c dapl_ib_mem.c endif + ifeq ($(VERBS),openib_scm) + LDFLAGS += -libverbs + LDFLAGS += -rpath /usr/local/lib -L /usr/local/lib + PROVIDER_SRCS = dapl_ib_util.c dapl_ib_cq.c dapl_ib_qp.c \ + dapl_ib_cm.c dapl_ib_mem.c + endif + UDAPL_SRCS = dapl_init.c \ dapl_evd_create.c \ dapl_evd_query.c \ dapl_cno_create.c \ dapl_cno_modify_agent.c \ dapl_cno_free.c \ dapl_cno_wait.c \ dapl_cno_query.c \ dapl_lmr_create.c \ dapl_evd_wait.c \ |
From: James L. <jle...@us...> - 2005-10-13 20:34:43
|
Update of /cvsroot/dapl/dapl/openib In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21319/dapl/openib Modified Files: dapl_ib_util.c dapl_ib_util.h Log Message: Fix the async error handling and callback mappings. Updated TODO list. Signed-off by: Arlin Davis <ar...@ic...> Signed-off by: James Lentini <jle...@ne...> Index: dapl_ib_util.c =================================================================== RCS file: /cvsroot/dapl/dapl/openib/dapl_ib_util.c,v retrieving revision 1.7 retrieving revision 1.8 diff -C10 -d -r1.7 -r1.8 *** dapl_ib_util.c 3 Oct 2005 14:47:51 -0000 1.7 --- dapl_ib_util.c 13 Oct 2005 20:34:33 -0000 1.8 *************** *** 212,279 **** IN DAPL_HCA *hca_ptr) { struct dlist *dev_list; long opts; 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; } if (!hca_ptr->ib_trans.ib_dev) { dapl_dbg_log (DAPL_DBG_TYPE_ERR, " open_hca: IB device %s not found\n", hca_name); return DAT_INTERNAL_ERROR; } ! dapl_dbg_log (DAPL_DBG_TYPE_UTIL," open_hca: Found dev %s %016llx\n", ! ibv_get_device_name(hca_ptr->ib_trans.ib_dev), ! (unsigned long long)bswap_64(ibv_get_device_guid(hca_ptr->ib_trans.ib_dev))); hca_ptr->ib_hca_handle = ibv_open_device(hca_ptr->ib_trans.ib_dev); if (!hca_ptr->ib_hca_handle) { dapl_dbg_log (DAPL_DBG_TYPE_ERR, " open_hca: IB dev open failed for %s\n", ! ibv_get_device_name(hca_ptr->ib_trans.ib_dev) ); return DAT_INTERNAL_ERROR; } hca_ptr->ib_trans.ib_ctx = hca_ptr->ib_hca_handle; ! /* set inline max with enviromment or default, get local lid and gid 0 */ hca_ptr->ib_trans.max_inline_send = dapl_os_get_env_val("DAPL_MAX_INLINE", INLINE_SEND_DEFAULT); /* GID with port_num provided, index 0 for now */ if (ibv_query_gid(hca_ptr->ib_hca_handle, hca_ptr->port_num, 0, &hca_ptr->ib_trans.gid)) { dapl_dbg_log (DAPL_DBG_TYPE_ERR, " open_hca: IB get GID failed for %s\n", ibv_get_device_name(hca_ptr->ib_trans.ib_dev)); goto bail; } dapl_dbg_log(DAPL_DBG_TYPE_UTIL, ! " open_hca: GID subnet %016llx id %016llx\n", ! (unsigned long long)bswap_64(hca_ptr->ib_trans.gid.global.subnet_prefix), ! (unsigned long long)bswap_64(hca_ptr->ib_trans.gid.global.interface_id) ); /* get the IP address of the device using GID */ if (dapli_get_hca_addr(hca_ptr)) { dapl_dbg_log (DAPL_DBG_TYPE_ERR, " open_hca: ERR ib_at_ips_by_gid for %s\n", ! ibv_get_device_name(hca_ptr->ib_trans.ib_dev) ); goto bail; } /* initialize hca wait object for uAT event */ 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) { --- 212,286 ---- IN DAPL_HCA *hca_ptr) { struct dlist *dev_list; long opts; 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; } if (!hca_ptr->ib_trans.ib_dev) { dapl_dbg_log (DAPL_DBG_TYPE_ERR, " open_hca: IB device %s not found\n", hca_name); return DAT_INTERNAL_ERROR; } ! dapl_dbg_log ( ! DAPL_DBG_TYPE_UTIL," open_hca: Found dev %s %016llx\n", ! ibv_get_device_name(hca_ptr->ib_trans.ib_dev), ! (unsigned long long) ! bswap_64(ibv_get_device_guid(hca_ptr->ib_trans.ib_dev))); hca_ptr->ib_hca_handle = ibv_open_device(hca_ptr->ib_trans.ib_dev); if (!hca_ptr->ib_hca_handle) { dapl_dbg_log (DAPL_DBG_TYPE_ERR, " open_hca: IB dev open failed for %s\n", ! ibv_get_device_name(hca_ptr->ib_trans.ib_dev)); return DAT_INTERNAL_ERROR; } hca_ptr->ib_trans.ib_ctx = hca_ptr->ib_hca_handle; ! /* set inline max with env or default, get local lid and gid 0 */ hca_ptr->ib_trans.max_inline_send = dapl_os_get_env_val("DAPL_MAX_INLINE", INLINE_SEND_DEFAULT); /* GID with port_num provided, index 0 for now */ if (ibv_query_gid(hca_ptr->ib_hca_handle, hca_ptr->port_num, 0, &hca_ptr->ib_trans.gid)) { dapl_dbg_log (DAPL_DBG_TYPE_ERR, " open_hca: IB get GID failed for %s\n", ibv_get_device_name(hca_ptr->ib_trans.ib_dev)); goto bail; } dapl_dbg_log(DAPL_DBG_TYPE_UTIL, ! " open_hca: GID subnet %016llx id %016llx\n", ! (unsigned long long) ! bswap_64(hca_ptr->ib_trans.gid.global.subnet_prefix), ! (unsigned long long) ! bswap_64(hca_ptr->ib_trans.gid.global.interface_id)); /* get the IP address of the device using GID */ if (dapli_get_hca_addr(hca_ptr)) { dapl_dbg_log (DAPL_DBG_TYPE_ERR, " open_hca: ERR ib_at_ips_by_gid for %s\n", ! ibv_get_device_name(hca_ptr->ib_trans.ib_dev)); goto bail; } /* initialize hca wait object for uAT event */ 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) { *************** *** 308,336 **** * Wakeup work thread to add to polling list */ dapl_llist_init_entry((DAPL_LLIST_ENTRY*)&hca_ptr->ib_trans.entry); dapl_os_lock( &g_hca_lock ); dapl_llist_add_tail(&g_hca_list, (DAPL_LLIST_ENTRY*)&hca_ptr->ib_trans.entry, &hca_ptr->ib_trans.entry); write(g_ib_pipe[1], "w", sizeof "w"); dapl_os_unlock(&g_hca_lock); ! 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; } --- 315,351 ---- * Wakeup work thread to add to polling list */ dapl_llist_init_entry((DAPL_LLIST_ENTRY*)&hca_ptr->ib_trans.entry); dapl_os_lock( &g_hca_lock ); dapl_llist_add_tail(&g_hca_list, (DAPL_LLIST_ENTRY*)&hca_ptr->ib_trans.entry, &hca_ptr->ib_trans.entry); write(g_ib_pipe[1], "w", sizeof "w"); dapl_os_unlock(&g_hca_lock); ! 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; } *************** *** 368,388 **** */ hca_ptr->ib_trans.destroy = 1; write(g_ib_pipe[1], "w", sizeof "w"); /* wait for thread to remove HCA references */ while (hca_ptr->ib_trans.destroy != 2) { struct timespec sleep, remain; sleep.tv_sec = 0; sleep.tv_nsec = 10000000; /* 10 ms */ dapl_dbg_log(DAPL_DBG_TYPE_UTIL, ! " ib_thread_destroy: waiting on hca %p destroy\n"); nanosleep (&sleep, &remain); } return (DAT_SUCCESS); } /* * dapls_ib_query_hca * * Query the hca attribute * --- 383,403 ---- */ hca_ptr->ib_trans.destroy = 1; write(g_ib_pipe[1], "w", sizeof "w"); /* wait for thread to remove HCA references */ while (hca_ptr->ib_trans.destroy != 2) { struct timespec sleep, remain; sleep.tv_sec = 0; sleep.tv_nsec = 10000000; /* 10 ms */ dapl_dbg_log(DAPL_DBG_TYPE_UTIL, ! " ib_thread_destroy: wait on hca %p destroy\n"); nanosleep (&sleep, &remain); } return (DAT_SUCCESS); } /* * dapls_ib_query_hca * * Query the hca attribute * *************** *** 423,455 **** /* query verbs for this device and port attributes */ if (ibv_query_device(hca_ptr->ib_hca_handle, &dev_attr) || ibv_query_port(hca_ptr->ib_hca_handle, hca_ptr->port_num, &port_attr)) return(dapl_convert_errno(errno,"ib_query_hca")); if (ia_attr != NULL) { ia_attr->adapter_name[DAT_NAME_MAX_LENGTH - 1] = '\0'; ia_attr->vendor_name[DAT_NAME_MAX_LENGTH - 1] = '\0'; ! ia_attr->ia_address_ptr = (DAT_IA_ADDRESS_PTR)&hca_ptr->hca_address; dapl_dbg_log (DAPL_DBG_TYPE_UTIL, " query_hca: %s %s %d.%d.%d.%d\n", ibv_get_device_name(hca_ptr->ib_trans.ib_dev), ! ((struct sockaddr_in *)ia_attr->ia_address_ptr)->sin_family == AF_INET ? "AF_INET":"AF_INET6", ! ((struct sockaddr_in *)ia_attr->ia_address_ptr)->sin_addr.s_addr >> 0 & 0xff, ! ((struct sockaddr_in *)ia_attr->ia_address_ptr)->sin_addr.s_addr >> 8 & 0xff, ! ((struct sockaddr_in *)ia_attr->ia_address_ptr)->sin_addr.s_addr >> 16 & 0xff, ! ((struct sockaddr_in *)ia_attr->ia_address_ptr)->sin_addr.s_addr >> 24 & 0xff ); ia_attr->hardware_version_major = dev_attr.hw_ver; ! ia_attr->hardware_version_minor = dev_attr.fw_ver; ia_attr->max_eps = dev_attr.max_qp; ia_attr->max_dto_per_ep = dev_attr.max_qp_wr; ia_attr->max_rdma_read_per_ep = dev_attr.max_qp_rd_atom; ia_attr->max_evds = dev_attr.max_cq; ia_attr->max_evd_qlen = dev_attr.max_cqe; ia_attr->max_iov_segments_per_dto = dev_attr.max_sge; ia_attr->max_lmrs = dev_attr.max_mr; ia_attr->max_lmr_block_size = dev_attr.max_mr_size; ia_attr->max_rmrs = dev_attr.max_mw; ia_attr->max_lmr_virtual_address = dev_attr.max_mr_size; --- 438,477 ---- /* query verbs for this device and port attributes */ if (ibv_query_device(hca_ptr->ib_hca_handle, &dev_attr) || ibv_query_port(hca_ptr->ib_hca_handle, hca_ptr->port_num, &port_attr)) return(dapl_convert_errno(errno,"ib_query_hca")); if (ia_attr != NULL) { ia_attr->adapter_name[DAT_NAME_MAX_LENGTH - 1] = '\0'; ia_attr->vendor_name[DAT_NAME_MAX_LENGTH - 1] = '\0'; ! ia_attr->ia_address_ptr = ! (DAT_IA_ADDRESS_PTR)&hca_ptr->hca_address; dapl_dbg_log (DAPL_DBG_TYPE_UTIL, " query_hca: %s %s %d.%d.%d.%d\n", ibv_get_device_name(hca_ptr->ib_trans.ib_dev), ! ((struct sockaddr_in *) ! ia_attr->ia_address_ptr)->sin_family == AF_INET ? ! "AF_INET":"AF_INET6", ! ((struct sockaddr_in *) ! ia_attr->ia_address_ptr)->sin_addr.s_addr >> 0 & 0xff, ! ((struct sockaddr_in *) ! ia_attr->ia_address_ptr)->sin_addr.s_addr >> 8 & 0xff, ! ((struct sockaddr_in *) ! ia_attr->ia_address_ptr)->sin_addr.s_addr >> 16 & 0xff, ! ((struct sockaddr_in *) ! ia_attr->ia_address_ptr)->sin_addr.s_addr >> 24 & 0xff); ia_attr->hardware_version_major = dev_attr.hw_ver; ! /* ia_attr->hardware_version_minor = dev_attr.fw_ver; */ ia_attr->max_eps = dev_attr.max_qp; ia_attr->max_dto_per_ep = dev_attr.max_qp_wr; ia_attr->max_rdma_read_per_ep = dev_attr.max_qp_rd_atom; ia_attr->max_evds = dev_attr.max_cq; ia_attr->max_evd_qlen = dev_attr.max_cqe; ia_attr->max_iov_segments_per_dto = dev_attr.max_sge; ia_attr->max_lmrs = dev_attr.max_mr; ia_attr->max_lmr_block_size = dev_attr.max_mr_size; ia_attr->max_rmrs = dev_attr.max_mw; ia_attr->max_lmr_virtual_address = dev_attr.max_mr_size; *************** *** 466,486 **** " query_hca: (%x.%x) ep %d ep_q %d evd %d evd_q %d\n", ia_attr->hardware_version_major, ia_attr->hardware_version_minor, ia_attr->max_eps, ia_attr->max_dto_per_ep, ia_attr->max_evds, ia_attr->max_evd_qlen ); dapl_dbg_log (DAPL_DBG_TYPE_UTIL, " query_hca: msg %llu rdma %llu iov %d lmr %d rmr %d\n", ia_attr->max_mtu_size, ia_attr->max_rdma_size, ia_attr->max_iov_segments_per_dto, ia_attr->max_lmrs, ia_attr->max_rmrs ); - } if (ep_attr != NULL) { ep_attr->max_mtu_size = port_attr.max_msg_sz; ep_attr->max_rdma_size = port_attr.max_msg_sz; ep_attr->max_recv_dtos = dev_attr.max_qp_wr; ep_attr->max_request_dtos = dev_attr.max_qp_wr; ep_attr->max_recv_iov = dev_attr.max_sge; ep_attr->max_request_iov = dev_attr.max_sge; ep_attr->max_rdma_read_in = dev_attr.max_qp_rd_atom; --- 488,507 ---- *************** *** 520,560 **** IN DAPL_IA *ia_ptr, IN DAPL_ASYNC_HANDLER_TYPE handler_type, IN DAPL_EVD *evd_ptr, IN ib_async_handler_t callback, IN void *context ) { ib_hca_transport_t *hca_ptr; dapl_dbg_log (DAPL_DBG_TYPE_UTIL, ! " setup_async_cb: ia %p type %d handle %p cb %p ctx %p\n", ia_ptr, handler_type, evd_ptr, callback, context); hca_ptr = &ia_ptr->hca_ptr->ib_trans; switch(handler_type) { case DAPL_ASYNC_UNAFILIATED: ! hca_ptr->async_unafiliated = callback; hca_ptr->async_un_ctx = context; break; case DAPL_ASYNC_CQ_ERROR: ! hca_ptr->async_cq_error = callback; ! hca_ptr->async_cq_ctx = context; break; case DAPL_ASYNC_CQ_COMPLETION: ! hca_ptr->async_cq = callback; ! hca_ptr->async_ctx = context; break; case DAPL_ASYNC_QP_ERROR: ! hca_ptr->async_qp_error = callback; ! hca_ptr->async_qp_ctx = context; break; default: break; } return DAT_SUCCESS; } int dapli_ib_thread_init(void) { DAT_RETURN dat_status; --- 541,582 ---- IN DAPL_IA *ia_ptr, IN DAPL_ASYNC_HANDLER_TYPE handler_type, IN DAPL_EVD *evd_ptr, IN ib_async_handler_t callback, IN void *context ) { ib_hca_transport_t *hca_ptr; dapl_dbg_log (DAPL_DBG_TYPE_UTIL, ! " setup_async_cb: ia %p type %d hdl %p cb %p ctx %p\n", ia_ptr, handler_type, evd_ptr, callback, context); hca_ptr = &ia_ptr->hca_ptr->ib_trans; switch(handler_type) { case DAPL_ASYNC_UNAFILIATED: ! hca_ptr->async_unafiliated = ! (ib_async_handler_t)callback; hca_ptr->async_un_ctx = context; break; case DAPL_ASYNC_CQ_ERROR: ! hca_ptr->async_cq_error = ! (ib_async_cq_handler_t)callback; break; case DAPL_ASYNC_CQ_COMPLETION: ! hca_ptr->async_cq = ! (ib_async_dto_handler_t)callback; break; case DAPL_ASYNC_QP_ERROR: ! hca_ptr->async_qp_error = ! (ib_async_qp_handler_t)callback; break; default: break; } return DAT_SUCCESS; } int dapli_ib_thread_init(void) { DAT_RETURN dat_status; *************** *** 571,591 **** return 1; } return 0; } void dapli_ib_thread_destroy(void) { int retries = 10; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread_destroy(%d)\n", getpid()); - /* * wait for async thread to terminate. * pthread_join would be the correct method * but some applications have some issues */ /* destroy ib_thread, wait for termination, if not already */ dapl_os_lock( &g_hca_lock ); g_ib_destroy = 1; write(g_ib_pipe[1], "w", sizeof "w"); --- 593,612 ---- *************** *** 621,688 **** if (hca->destroy) return; if ((poll(&async_fd, 1, 0)==1) && (!ibv_get_async_event(hca->ib_ctx, &event))) { switch (event.event_type) { case IBV_EVENT_CQ_ERR: { ! dapl_dbg_log(DAPL_DBG_TYPE_WARN, ! " dapli_async_event CQ ERR %d\n", ! event.event_type); /* report up if async callback still setup */ if (hca->async_cq_error) hca->async_cq_error(hca->ib_ctx, &event, ! hca->async_cq_ctx); break; } case IBV_EVENT_COMM_EST: { ! /* Received messages on connected QP before RTU */ ! struct dapl_ep *ep_ptr = event.element.qp->qp_context; /* TODO: cannot process COMM_EST until ibv * guarantees valid QP context for events. * Race conditions exist with QP destroy call. * For now, assume the RTU will arrive. */ ! dapl_dbg_log(DAPL_DBG_TYPE_UTIL, ! " dapli_async_event COMM_EST (qp=%p)\n", ! event.element.qp); if (!DAPL_BAD_HANDLE(ep_ptr, DAPL_MAGIC_EP) && ep_ptr->cm_handle != IB_INVALID_HANDLE) ! ib_cm_establish(ep_ptr->cm_handle->cm_id); break; } case IBV_EVENT_QP_FATAL: case IBV_EVENT_QP_REQ_ERR: case IBV_EVENT_QP_ACCESS_ERR: case IBV_EVENT_QP_LAST_WQE_REACHED: case IBV_EVENT_SRQ_ERR: case IBV_EVENT_SRQ_LIMIT_REACHED: case IBV_EVENT_SQ_DRAINED: { ! dapl_dbg_log(DAPL_DBG_TYPE_WARN, ! " dapli_async_event QP ERR %d\n", ! event.event_type); /* report up if async callback still setup */ if (hca->async_qp_error) hca->async_qp_error(hca->ib_ctx, &event, ! hca->async_qp_ctx); break; } case IBV_EVENT_PATH_MIG: case IBV_EVENT_PATH_MIG_ERR: case IBV_EVENT_DEVICE_FATAL: case IBV_EVENT_PORT_ACTIVE: case IBV_EVENT_PORT_ERR: case IBV_EVENT_LID_CHANGE: case IBV_EVENT_PKEY_CHANGE: case IBV_EVENT_SM_CHANGE: --- 642,722 ---- if (hca->destroy) return; if ((poll(&async_fd, 1, 0)==1) && (!ibv_get_async_event(hca->ib_ctx, &event))) { switch (event.event_type) { case IBV_EVENT_CQ_ERR: { ! struct dapl_ep *evd_ptr = ! event.element.cq->cq_context; ! ! dapl_dbg_log( ! DAPL_DBG_TYPE_WARN, ! " dapli_async_event CQ (%p) ERR %d\n", ! evd_ptr, event.event_type); /* report up if async callback still setup */ if (hca->async_cq_error) hca->async_cq_error(hca->ib_ctx, + event.element.cq, &event, ! (void*)evd_ptr); break; } case IBV_EVENT_COMM_EST: { ! /* Received msgs on connected QP before RTU */ ! struct dapl_ep *ep_ptr = ! event.element.qp->qp_context; /* TODO: cannot process COMM_EST until ibv * guarantees valid QP context for events. * Race conditions exist with QP destroy call. * For now, assume the RTU will arrive. */ ! dapl_dbg_log( ! DAPL_DBG_TYPE_UTIL, ! " dapli_async_event COMM_EST(qp=%p)\n", ! event.element.qp); if (!DAPL_BAD_HANDLE(ep_ptr, DAPL_MAGIC_EP) && ep_ptr->cm_handle != IB_INVALID_HANDLE) ! ib_cm_establish( ! ep_ptr->cm_handle->cm_id); break; } case IBV_EVENT_QP_FATAL: case IBV_EVENT_QP_REQ_ERR: case IBV_EVENT_QP_ACCESS_ERR: case IBV_EVENT_QP_LAST_WQE_REACHED: case IBV_EVENT_SRQ_ERR: case IBV_EVENT_SRQ_LIMIT_REACHED: case IBV_EVENT_SQ_DRAINED: { ! struct dapl_ep *ep_ptr = ! event.element.qp->qp_context; ! ! dapl_dbg_log( ! DAPL_DBG_TYPE_WARN, ! " dapli_async_event QP (%p) ERR %d\n", ! ep_ptr, event.event_type); /* report up if async callback still setup */ if (hca->async_qp_error) hca->async_qp_error(hca->ib_ctx, + event.element.qp, &event, ! (void*)ep_ptr); break; } case IBV_EVENT_PATH_MIG: case IBV_EVENT_PATH_MIG_ERR: case IBV_EVENT_DEVICE_FATAL: case IBV_EVENT_PORT_ACTIVE: case IBV_EVENT_PORT_ERR: case IBV_EVENT_LID_CHANGE: case IBV_EVENT_PKEY_CHANGE: case IBV_EVENT_SM_CHANGE: Index: dapl_ib_util.h =================================================================== RCS file: /cvsroot/dapl/dapl/openib/dapl_ib_util.h,v retrieving revision 1.6 retrieving revision 1.7 diff -C10 -d -r1.6 -r1.7 *** dapl_ib_util.h 3 Oct 2005 14:47:51 -0000 1.6 --- dapl_ib_util.h 13 Oct 2005 20:34:33 -0000 1.7 *************** *** 140,160 **** }; typedef struct dapl_cm_id *ib_cm_handle_t; typedef struct dapl_cm_id *ib_cm_srvc_handle_t; /* Operation and state mappings */ typedef enum ibv_send_flags ib_send_op_type_t; typedef struct ibv_sge ib_data_segment_t; typedef enum ibv_qp_state ib_qp_state_t; typedef enum ibv_event_type ib_async_event_type; ! typedef struct ibv_async_event ib_error_record_t; /* CQ notifications */ typedef enum { IB_NOTIFY_ON_NEXT_COMP, IB_NOTIFY_ON_SOLIC_COMP } ib_notification_type_t; /* other mappings */ --- 140,160 ---- }; typedef struct dapl_cm_id *ib_cm_handle_t; typedef struct dapl_cm_id *ib_cm_srvc_handle_t; /* Operation and state mappings */ typedef enum ibv_send_flags ib_send_op_type_t; typedef struct ibv_sge ib_data_segment_t; typedef enum ibv_qp_state ib_qp_state_t; typedef enum ibv_event_type ib_async_event_type; ! typedef struct ibv_async_event ib_error_record_t; /* CQ notifications */ typedef enum { IB_NOTIFY_ON_NEXT_COMP, IB_NOTIFY_ON_SOLIC_COMP } ib_notification_type_t; /* other mappings */ *************** *** 221,268 **** * ibv_get_cq_event - Return 0 & ibv_cq/context, int * ibv_poll_cq - Return n & ibv_wc, 0 ok, -1 empty, -2 error * ibv_req_notify_cq - Return 0 (void?) * ibv_create_qp - Return ibv_qp, NULL * ibv_modify_qp - Return 0, errno * ibv_destroy_qp - Return 0, errno * ibv_post_send - Return 0, -1 & bad_wr * ibv_post_recv - Return 0, -1 & bad_wr */ ! /* async handler for CQ, QP, and unafiliated */ 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; ! ib_async_handler_t async_qp_error; ! void *async_qp_ctx; } ib_hca_transport_t; /* provider specfic fields for shared memory support */ typedef uint32_t ib_shm_transport_t; /* prototypes */ int32_t dapls_ib_init (void); int32_t dapls_ib_release (void); void dapli_thread(void *arg); --- 221,283 ---- * ibv_get_cq_event - Return 0 & ibv_cq/context, int * ibv_poll_cq - Return n & ibv_wc, 0 ok, -1 empty, -2 error * ibv_req_notify_cq - Return 0 (void?) * ibv_create_qp - Return ibv_qp, NULL * ibv_modify_qp - Return 0, errno * ibv_destroy_qp - Return 0, errno * ibv_post_send - Return 0, -1 & bad_wr * ibv_post_recv - Return 0, -1 & bad_wr */ ! /* async handler for DTO, CQ, QP, and unafiliated */ ! typedef void (*ib_async_dto_handler_t)( ! IN ib_hca_handle_t ib_hca_handle, ! IN ib_error_record_t *err_code, ! IN void *context); ! ! typedef void (*ib_async_cq_handler_t)( ! IN ib_hca_handle_t ib_hca_handle, ! IN ib_cq_handle_t ib_cq_handle, ! IN ib_error_record_t *err_code, ! IN void *context); ! ! typedef void (*ib_async_qp_handler_t)( ! IN ib_hca_handle_t ib_hca_handle, ! IN ib_qp_handle_t ib_qp_handle, ! IN ib_error_record_t *err_code, ! IN void *context); ! 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_cq_handler_t async_cq_error; ! ib_async_dto_handler_t async_cq; ! ib_async_qp_handler_t async_qp_error; } ib_hca_transport_t; /* provider specfic fields for shared memory support */ typedef uint32_t ib_shm_transport_t; /* prototypes */ int32_t dapls_ib_init (void); int32_t dapls_ib_release (void); void dapli_thread(void *arg); |
From: James L. <jle...@us...> - 2005-10-06 20:59:48
|
Update of /cvsroot/dapl/dapl/udapl/linux In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12876/dapl/udapl/linux Modified Files: dapl_osd.h Log Message: Add PPC64 support for udapl Signed-off-by: Todd Bowman <twb...@gm...> Signed-off-by: James Lentini <jle...@ne...> Index: dapl_osd.h =================================================================== RCS file: /cvsroot/dapl/dapl/udapl/linux/dapl_osd.h,v retrieving revision 1.51 retrieving revision 1.52 diff -C10 -d -r1.51 -r1.52 *** dapl_osd.h 28 Sep 2005 21:53:20 -0000 1.51 --- dapl_osd.h 6 Oct 2005 20:59:37 -0000 1.52 *************** *** 45,65 **** #define _DAPL_OSD_H_ /* * This file is defined for Linux systems only, including it on any * other build will cause an error */ #ifndef __linux__ #error UNDEFINED OS TYPE #endif /* __linux__ */ ! #if !defined (__i386__) && !defined (__ia64__) && !defined(__x86_64__) #error UNDEFINED ARCH #endif #include <dat/udat.h> #include <assert.h> #include <errno.h> #include <pthread.h> #include <semaphore.h> #include <stdint.h> --- 45,65 ---- #define _DAPL_OSD_H_ /* * This file is defined for Linux systems only, including it on any * other build will cause an error */ #ifndef __linux__ #error UNDEFINED OS TYPE #endif /* __linux__ */ ! #if !defined (__i386__) && !defined (__ia64__) && !defined(__x86_64__) && !defined(__PPC64__) #error UNDEFINED ARCH #endif #include <dat/udat.h> #include <assert.h> #include <errno.h> #include <pthread.h> #include <semaphore.h> #include <stdint.h> *************** *** 74,94 **** #include "dapl_debug.h" /* * Include files for setting up a network name */ #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <ctype.h> ! #ifdef __ia64__ #include <asm/atomic.h> #include <asm/system.h> #endif /* Useful debug definitions */ #ifndef STATIC #define STATIC static #endif /* STATIC */ #ifndef _INLINE_ #define _INLINE_ __inline__ --- 74,94 ---- #include "dapl_debug.h" /* * Include files for setting up a network name */ #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <ctype.h> ! #if defined(__ia64__) || defined(__PPC64__) #include <asm/atomic.h> #include <asm/system.h> #endif /* Useful debug definitions */ #ifndef STATIC #define STATIC static #endif /* STATIC */ #ifndef _INLINE_ #define _INLINE_ __inline__ *************** *** 157,176 **** --- 157,178 ---- { #ifdef __ia64__ DAT_COUNT old_value; # if !defined(REDHAT_EL4) && (OS_RELEASE >= LINUX_VERSION(2,6)) IA64_FETCHADD(old_value,v,1,4,rel); # else IA64_FETCHADD(old_value,v,1,4); # endif + #elif defined(__PPC64__) + atomic_inc((atomic_t *) v); #else /* !__ia64__ */ __asm__ __volatile__ ( "lock;" "incl %0" :"=m" (*v) :"m" (*v)); #endif return; } *************** *** 185,204 **** --- 187,209 ---- { #ifdef __ia64__ DAT_COUNT old_value; # if !defined(REDHAT_EL4) && (OS_RELEASE >= LINUX_VERSION(2,6)) IA64_FETCHADD(old_value,v,-1,4,rel); # else IA64_FETCHADD(old_value,v,-1,4); # endif + #elif defined (__PPC64__) + atomic_dec((atomic_t *)v); + #else /* !__ia64__ */ __asm__ __volatile__ ( "lock;" "decl %0" :"=m" (*v) :"m" (*v)); #endif return; } *************** *** 226,246 **** /* * Use the Pentium compare and exchange instruction */ #ifdef __ia64__ #ifdef REDHAT_EL4 current_value = ia64_cmpxchg("acq",v,match_value,new_value,4); #else current_value = ia64_cmpxchg(acq,v,match_value,new_value,4); ! #endif #else __asm__ __volatile__ ( "lock; cmpxchgl %1, %2" : "=a" (current_value) : "q" (new_value), "m" (*v), "0" (match_value) : "memory"); #endif return current_value; } --- 231,265 ---- /* * Use the Pentium compare and exchange instruction */ #ifdef __ia64__ #ifdef REDHAT_EL4 current_value = ia64_cmpxchg("acq",v,match_value,new_value,4); #else current_value = ia64_cmpxchg(acq,v,match_value,new_value,4); ! #endif /* __ia64__ */ ! #elif defined(__PPC64__) ! __asm__ __volatile__ ( ! EIEIO_ON_SMP ! "1: lwarx %0,0,%2 # __cmpxchg_u64\n\ ! cmpd 0,%0,%3\n\ ! bne- 2f\n\ ! stwcx. %4,0,%2\n\ ! bne- 1b" ! ISYNC_ON_SMP ! "\n\ ! 2:" ! : "=&r" (current_value), "=m" (*v) ! : "r" (v), "r" (match_value), "r" (new_value), "m" (*v) ! : "cc", "memory"); #else __asm__ __volatile__ ( "lock; cmpxchgl %1, %2" : "=a" (current_value) : "q" (new_value), "m" (*v), "0" (match_value) : "memory"); #endif return current_value; } |
From: James L. <jle...@us...> - 2005-10-06 20:59:45
|
Update of /cvsroot/dapl/test/dapltest/mdep/linux In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12876/test/dapltest/mdep/linux Modified Files: dapl_mdep_user.c dapl_mdep_user.h Log Message: Add PPC64 support for udapl Signed-off-by: Todd Bowman <twb...@gm...> Signed-off-by: James Lentini <jle...@ne...> Index: dapl_mdep_user.c =================================================================== RCS file: /cvsroot/dapl/test/dapltest/mdep/linux/dapl_mdep_user.c,v retrieving revision 1.8 retrieving revision 1.9 diff -C10 -d -r1.8 -r1.9 *** dapl_mdep_user.c 24 Mar 2005 05:58:39 -0000 1.8 --- dapl_mdep_user.c 6 Oct 2005 20:59:37 -0000 1.9 *************** *** 179,199 **** --- 179,203 ---- struct tms ts; clock_t t = times (&ts); return (unsigned long) ((DAT_UINT64) t * 1000 / CLK_TCK); } double DT_Mdep_GetCpuMhz ( void ) { #define DT_CPU_MHZ_BUFFER_SIZE 128 + #if defined (__PPC64__) + #define DT_CPU_MHZ_MHZ "clock" + #else #define DT_CPU_MHZ_MHZ "cpu MHz" + #endif #define DT_CPU_MHZ_DELIMITER ":" FILE *fp; char buffer[DT_CPU_MHZ_BUFFER_SIZE]; char *mhz_str; fp = fopen ("/proc/cpuinfo", "r"); if ( NULL == fp ) { perror ("fopen of /proc/cpuinfo failed"); Index: dapl_mdep_user.h =================================================================== RCS file: /cvsroot/dapl/test/dapltest/mdep/linux/dapl_mdep_user.h,v retrieving revision 1.11 retrieving revision 1.12 diff -C10 -d -r1.11 -r1.12 *** dapl_mdep_user.h 24 Mar 2005 05:58:39 -0000 1.11 --- dapl_mdep_user.h 6 Oct 2005 20:59:37 -0000 1.12 *************** *** 122,142 **** __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); return x; #else #ifdef __ia64__ unsigned long x; x = get_cycles (); return x; #else ! #error "Non-Pentium Linux - unimplemented" #endif #endif } /* * Define long format types to be used in *printf format strings. We * use the C string constant concatenation ability to define 64 bit * formats, which unfortunatly are non standard in the C compiler * world. E.g. %llx for gcc, %I64x for Windows */ --- 122,152 ---- __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); return x; #else #ifdef __ia64__ unsigned long x; x = get_cycles (); return x; #else ! #if defined(__PPC64__) ! unsigned int tbl, tbu0, tbu1; ! do { ! __asm__ __volatile__ ("mftbu %0" : "=r"(tbu0)); ! __asm__ __volatile__ ("mftb %0" : "=r"(tbl)); ! __asm__ __volatile__ ("mftbu %0" : "=r"(tbu1)); ! } while (tbu0 != tbu1); ! return (((unsigned long long)tbu0) << 32) | tbl; ! #else ! #error "Non-Pentium and Non-PPC Linux - unimplemented" ! #endif #endif #endif } /* * Define long format types to be used in *printf format strings. We * use the C string constant concatenation ability to define 64 bit * formats, which unfortunatly are non standard in the C compiler * world. E.g. %llx for gcc, %I64x for Windows */ |
From: James L. <jle...@us...> - 2005-10-03 14:48:09
|
Update of /cvsroot/dapl/dapl/udapl In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19852/dapl/udapl Modified Files: Makefile 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: Makefile =================================================================== RCS file: /cvsroot/dapl/dapl/udapl/Makefile,v retrieving revision 1.68 retrieving revision 1.69 diff -C10 -d -r1.68 -r1.69 *** Makefile 29 Sep 2005 19:46:39 -0000 1.68 --- Makefile 3 Oct 2005 14:47:51 -0000 1.69 *************** *** 130,150 **** CFLAGS += -I$(OPENIB_KERNEL_DIR)/ulp/dapl_srv CFLAGS += -I$(OPENIB_USER_DIR)/driver/infinihost/include endif # # OpenIB provider # ifeq ($(VERBS),openib) PROVIDER = $(TOPDIR)/../openib CFLAGS += -DOPENIB ! #CFLAGS += -DCQ_WAIT_OBJECT uncomment when fixed CFLAGS += -I/usr/local/include/infiniband endif # # If an implementation supports CM and DTO completions on the same EVD # then DAPL_MERGE_CM_DTO should be set # CFLAGS += -DDAPL_MERGE_CM_DTO=1 # # If an implementation supports Shared Memory, enable --- 130,150 ---- CFLAGS += -I$(OPENIB_KERNEL_DIR)/ulp/dapl_srv CFLAGS += -I$(OPENIB_USER_DIR)/driver/infinihost/include endif # # OpenIB provider # ifeq ($(VERBS),openib) PROVIDER = $(TOPDIR)/../openib CFLAGS += -DOPENIB ! CFLAGS += -DCQ_WAIT_OBJECT CFLAGS += -I/usr/local/include/infiniband endif # # If an implementation supports CM and DTO completions on the same EVD # then DAPL_MERGE_CM_DTO should be set # CFLAGS += -DDAPL_MERGE_CM_DTO=1 # # If an implementation supports Shared Memory, enable |
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; |
From: James L. <jle...@us...> - 2005-09-29 19:46:47
|
Update of /cvsroot/dapl/dapl/udapl In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32288/dapl/udapl Modified Files: Makefile Log Message: Ported OpenIB updates. Signed-off-by: James Lentini <jle...@ne...> Index: Makefile =================================================================== RCS file: /cvsroot/dapl/dapl/udapl/Makefile,v retrieving revision 1.67 retrieving revision 1.68 diff -C10 -d -r1.67 -r1.68 *** Makefile 28 Sep 2005 21:53:20 -0000 1.67 --- Makefile 29 Sep 2005 19:46:39 -0000 1.68 *************** *** 70,90 **** # CFLAGS definition # # The makefile will build for multiple providers, but each provider # must have a set of compiler definitions that include, but are not # limited to: # # PROVIDER Directory of provider sources # CFLAGS Compile time flags for build # ! CFLAGS = -O2 $(CPPFLAGS) -D$(OS_VENDOR) -DOS_VERSION=$(OSRELEASE) -DDAPL_DBG # # dummy provider # ifeq ($(VERBS),dummy) PROVIDER = $(TOPDIR)/../dummy CFLAGS += -DDAPL_ATS -DDUMMY endif # --- 70,94 ---- # CFLAGS definition # # The makefile will build for multiple providers, but each provider # must have a set of compiler definitions that include, but are not # limited to: # # PROVIDER Directory of provider sources # CFLAGS Compile time flags for build # ! CFLAGS = -O2 $(CPPFLAGS) -DOS_VERSION=$(OSRELEASE) -DDAPL_DBG ! ! ifdef OS_VENDOR ! CFLAGS += -D$(OS_VENDOR) ! endif # # dummy provider # ifeq ($(VERBS),dummy) PROVIDER = $(TOPDIR)/../dummy CFLAGS += -DDAPL_ATS -DDUMMY endif # |
From: James L. <jle...@us...> - 2005-09-28 21:53:32
|
Update of /cvsroot/dapl/dapl/udapl In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1826/dapl/udapl Modified Files: Makefile dapl_cno_free.c Log Message: Ported OpenIB updates. Signed-off-by: James Lentini <jle...@ne...> Index: Makefile =================================================================== RCS file: /cvsroot/dapl/dapl/udapl/Makefile,v retrieving revision 1.66 retrieving revision 1.67 diff -C10 -d -r1.66 -r1.67 *** Makefile 20 Sep 2005 16:37:40 -0000 1.66 --- Makefile 28 Sep 2005 21:53:20 -0000 1.67 *************** *** 53,83 **** OSRELEASE=$(shell expr `uname -r | cut -f1 -d.` \* 65536 + `uname -r | cut -f2 -d.`) # # Set up the default provider # ifndef $VERBS VERBS=openib endif # # CFLAGS definition # # The makefile will build for multiple providers, but each provider # must have a set of compiler definitions that include, but are not # limited to: # # PROVIDER Directory of provider sources # CFLAGS Compile time flags for build # ! CFLAGS = -O2 $(CPPFLAGS) -DOS_VERSION=$(OSRELEASE) -DDAPL_DBG # # dummy provider # ifeq ($(VERBS),dummy) PROVIDER = $(TOPDIR)/../dummy CFLAGS += -DDAPL_ATS -DDUMMY endif # --- 53,90 ---- OSRELEASE=$(shell expr `uname -r | cut -f1 -d.` \* 65536 + `uname -r | cut -f2 -d.`) # # Set up the default provider # ifndef $VERBS VERBS=openib endif # + # Set an OS Vendor + # + # OS_VENDOR = REDHAT_EL4 + # OS_VENDOR = SuSE + # + + # # CFLAGS definition # # The makefile will build for multiple providers, but each provider # must have a set of compiler definitions that include, but are not # limited to: # # PROVIDER Directory of provider sources # CFLAGS Compile time flags for build # ! CFLAGS = -O2 $(CPPFLAGS) -D$(OS_VENDOR) -DOS_VERSION=$(OSRELEASE) -DDAPL_DBG # # dummy provider # ifeq ($(VERBS),dummy) PROVIDER = $(TOPDIR)/../dummy CFLAGS += -DDAPL_ATS -DDUMMY endif # *************** *** 148,185 **** CFLAGS += -I$(PROVIDER) CFLAGS += -I../udapl/linux CFLAGS += -I../common CFLAGS += -Wall CFLAGS += -Wstrict-prototypes CFLAGS += -Wmissing-prototypes CFLAGS += -Wmissing-declarations CFLAGS += --no-strict-aliasing CFLAGS += -Werror CFLAGS += -g3 ifdef GPROF CFLAGS += -pg endif - ifeq (${MACH},x86_64) - CFLAGS += -fPIC - endif - LD = ld # # LDFLAGS definition # LDFLAGS = -shared LDFLAGS += -lpthread LDFLAGS += -init dapl_init LDFLAGS += -fini dapl_fini AR = ar # # ARFLAGS definition # ARFLAGS = r # # To build with JNI verbs: make VERBS=jni [default] # To build with Mellanox verbs: make VERBS=mellanox --- 155,193 ---- CFLAGS += -I$(PROVIDER) CFLAGS += -I../udapl/linux CFLAGS += -I../common CFLAGS += -Wall CFLAGS += -Wstrict-prototypes CFLAGS += -Wmissing-prototypes CFLAGS += -Wmissing-declarations CFLAGS += --no-strict-aliasing CFLAGS += -Werror CFLAGS += -g3 + CFLAGS += -fPIC ifdef GPROF CFLAGS += -pg endif LD = ld # # LDFLAGS definition # LDFLAGS = -shared LDFLAGS += -lpthread LDFLAGS += -init dapl_init LDFLAGS += -fini dapl_fini + ifeq ($(OS_VENDOR),SuSE) + LDFLAGS += -lgcc_s + endif + AR = ar # # ARFLAGS definition # ARFLAGS = r # # To build with JNI verbs: make VERBS=jni [default] # To build with Mellanox verbs: make VERBS=mellanox Index: dapl_cno_free.c =================================================================== RCS file: /cvsroot/dapl/dapl/udapl/dapl_cno_free.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C10 -d -r1.4 -r1.5 *** dapl_cno_free.c 24 Mar 2005 05:58:09 -0000 1.4 --- dapl_cno_free.c 28 Sep 2005 21:53:20 -0000 1.5 *************** *** 70,90 **** dat_status = DAT_SUCCESS; cno_ptr = (DAPL_CNO *)cno_handle; if (DAPL_BAD_HANDLE (cno_handle, DAPL_MAGIC_CNO)) { dat_status = DAT_ERROR (DAT_INVALID_HANDLE,DAT_INVALID_HANDLE_CNO); goto bail; } ! if (cno_ptr->cno_ref_count != 0 || cno_ptr->cno_waiters != 0) { dat_status = DAT_ERROR (DAT_INVALID_STATE,DAT_INVALID_STATE_CNO_IN_USE); goto bail; } dapl_ia_unlink_cno (cno_ptr->header.owner_ia, cno_ptr); dapl_cno_dealloc (cno_ptr); bail: --- 70,90 ---- dat_status = DAT_SUCCESS; cno_ptr = (DAPL_CNO *)cno_handle; if (DAPL_BAD_HANDLE (cno_handle, DAPL_MAGIC_CNO)) { dat_status = DAT_ERROR (DAT_INVALID_HANDLE,DAT_INVALID_HANDLE_CNO); goto bail; } ! if (dapl_os_atomic_read(&cno_ptr->cno_ref_count) != 0 || cno_ptr->cno_waiters != 0) { dat_status = DAT_ERROR (DAT_INVALID_STATE,DAT_INVALID_STATE_CNO_IN_USE); goto bail; } dapl_ia_unlink_cno (cno_ptr->header.owner_ia, cno_ptr); dapl_cno_dealloc (cno_ptr); bail: |
From: James L. <jle...@us...> - 2005-09-28 21:53:27
|
Update of /cvsroot/dapl/dapl/udapl/linux In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1826/dapl/udapl/linux Modified Files: dapl_osd.h Log Message: Ported OpenIB updates. Signed-off-by: James Lentini <jle...@ne...> Index: dapl_osd.h =================================================================== RCS file: /cvsroot/dapl/dapl/udapl/linux/dapl_osd.h,v retrieving revision 1.50 retrieving revision 1.51 diff -C10 -d -r1.50 -r1.51 *** dapl_osd.h 24 Mar 2005 05:58:09 -0000 1.50 --- dapl_osd.h 28 Sep 2005 21:53:20 -0000 1.51 *************** *** 79,99 **** #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <ctype.h> #ifdef __ia64__ #include <asm/atomic.h> #include <asm/system.h> #endif - /* Useful debug definitions */ #ifndef STATIC #define STATIC static #endif /* STATIC */ #ifndef _INLINE_ #define _INLINE_ __inline__ #endif /* _INLINE_ */ #define LINUX_VERSION(a,b) (((a) << 16) + (b)) --- 79,98 ---- *************** *** 152,176 **** * and it occurs in local memory. */ STATIC _INLINE_ void dapl_os_atomic_inc ( INOUT DAPL_ATOMIC *v) { #ifdef __ia64__ DAT_COUNT old_value; ! #if OS_VERSION >= LINUX_VERSION(2,6) ! IA64_FETCHADD (old_value,v,1,4,rel); ! #else ! IA64_FETCHADD (old_value,v,1,4); ! #endif #else /* !__ia64__ */ __asm__ __volatile__ ( "lock;" "incl %0" :"=m" (*v) :"m" (*v)); #endif return; } --- 151,175 ---- * and it occurs in local memory. */ STATIC _INLINE_ void dapl_os_atomic_inc ( INOUT DAPL_ATOMIC *v) { #ifdef __ia64__ DAT_COUNT old_value; ! # if !defined(REDHAT_EL4) && (OS_RELEASE >= LINUX_VERSION(2,6)) ! IA64_FETCHADD(old_value,v,1,4,rel); ! # else ! IA64_FETCHADD(old_value,v,1,4); ! # endif #else /* !__ia64__ */ __asm__ __volatile__ ( "lock;" "incl %0" :"=m" (*v) :"m" (*v)); #endif return; } *************** *** 180,204 **** * decrement the current value of '*v'. No return value is required. */ STATIC _INLINE_ void dapl_os_atomic_dec ( INOUT DAPL_ATOMIC *v) { #ifdef __ia64__ DAT_COUNT old_value; ! #if OS_VERSION >= LINUX_VERSION(2,6) ! IA64_FETCHADD (old_value,v,-1,4,rel); ! #else ! IA64_FETCHADD (old_value,v,-1,4); ! #endif #else /* !__ia64__ */ __asm__ __volatile__ ( "lock;" "decl %0" :"=m" (*v) :"m" (*v)); #endif return; } --- 179,203 ---- * decrement the current value of '*v'. No return value is required. */ STATIC _INLINE_ void dapl_os_atomic_dec ( INOUT DAPL_ATOMIC *v) { #ifdef __ia64__ DAT_COUNT old_value; ! # if !defined(REDHAT_EL4) && (OS_RELEASE >= LINUX_VERSION(2,6)) ! IA64_FETCHADD(old_value,v,-1,4,rel); ! # else ! IA64_FETCHADD(old_value,v,-1,4); ! # endif #else /* !__ia64__ */ __asm__ __volatile__ ( "lock;" "decl %0" :"=m" (*v) :"m" (*v)); #endif return; } *************** *** 223,245 **** IN DAT_COUNT match_value, IN DAT_COUNT new_value ) { DAT_COUNT current_value; /* * Use the Pentium compare and exchange instruction */ #ifdef __ia64__ ! ! current_value = ia64_cmpxchg("acq",v,match_value,new_value,4); ! #else __asm__ __volatile__ ( "lock; cmpxchgl %1, %2" : "=a" (current_value) : "q" (new_value), "m" (*v), "0" (match_value) : "memory"); #endif return current_value; } --- 222,246 ---- IN DAT_COUNT match_value, IN DAT_COUNT new_value ) { DAT_COUNT current_value; /* * Use the Pentium compare and exchange instruction */ #ifdef __ia64__ ! #ifdef REDHAT_EL4 ! current_value = ia64_cmpxchg("acq",v,match_value,new_value,4); ! #else ! current_value = ia64_cmpxchg(acq,v,match_value,new_value,4); ! #endif #else __asm__ __volatile__ ( "lock; cmpxchgl %1, %2" : "=a" (current_value) : "q" (new_value), "m" (*v), "0" (match_value) : "memory"); #endif return current_value; } |
From: James L. <jle...@us...> - 2005-09-28 21:53:27
|
Update of /cvsroot/dapl/dapl/common In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1826/dapl/common Modified Files: dapl_evd_free.c Log Message: Ported OpenIB updates. Signed-off-by: James Lentini <jle...@ne...> Index: dapl_evd_free.c =================================================================== RCS file: /cvsroot/dapl/dapl/common/dapl_evd_free.c,v retrieving revision 1.17 retrieving revision 1.18 diff -C10 -d -r1.17 -r1.18 *** dapl_evd_free.c 24 Mar 2005 05:58:02 -0000 1.17 --- dapl_evd_free.c 28 Sep 2005 21:53:19 -0000 1.18 *************** *** 109,129 **** dat_status = DAT_ERROR (DAT_INVALID_STATE, DAT_INVALID_STATE_EVD_IN_USE); goto bail; } dapl_ia_unlink_cno (cno_ptr->header.owner_ia, cno_ptr); dapl_cno_dealloc (cno_ptr); } #else if (cno_ptr != NULL) { ! if (cno_ptr->cno_ref_count == 0 && cno_ptr->cno_waiters > 0) { /* * Last reference on the CNO, trigger a notice. See * uDAPL 1.1 spec 6.3.2.3 */ dapl_cno_trigger (cno_ptr, NULL); } } #endif /* defined(__KDAPL__) */ --- 109,129 ---- dat_status = DAT_ERROR (DAT_INVALID_STATE, DAT_INVALID_STATE_EVD_IN_USE); goto bail; } dapl_ia_unlink_cno (cno_ptr->header.owner_ia, cno_ptr); dapl_cno_dealloc (cno_ptr); } #else if (cno_ptr != NULL) { ! if (dapl_os_atomic_read(&cno_ptr->cno_ref_count) == 0 && cno_ptr->cno_waiters > 0) { /* * Last reference on the CNO, trigger a notice. See * uDAPL 1.1 spec 6.3.2.3 */ dapl_cno_trigger (cno_ptr, NULL); } } #endif /* defined(__KDAPL__) */ |
From: James L. <jle...@us...> - 2005-09-20 16:37:48
|
Update of /cvsroot/dapl/dapl/udapl In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30692 Modified Files: Makefile Log Message: Change order of UDAPL_SRCS to be more logical. Signed-off-by: James Lentini <jle...@ne...> Index: Makefile =================================================================== RCS file: /cvsroot/dapl/dapl/udapl/Makefile,v retrieving revision 1.65 retrieving revision 1.66 diff -C10 -d -r1.65 -r1.66 *** Makefile 20 Sep 2005 16:31:46 -0000 1.65 --- Makefile 20 Sep 2005 16:37:40 -0000 1.66 *************** *** 247,268 **** dapl_evd_query.c \ dapl_cno_create.c \ dapl_cno_modify_agent.c \ dapl_cno_free.c \ dapl_cno_wait.c \ dapl_cno_query.c \ dapl_lmr_create.c \ dapl_evd_wait.c \ dapl_evd_disable.c \ dapl_evd_enable.c \ - dapl_evd_set_unwaitable.c \ dapl_evd_modify_cno.c \ dapl_evd_clear_unwaitable.c COMMON_SRCS = dapl_cookie.c \ dapl_cr_accept.c \ dapl_cr_query.c \ dapl_cr_reject.c \ dapl_cr_util.c \ dapl_cr_callback.c \ dapl_cr_handoff.c \ dapl_ep_connect.c \ --- 247,268 ---- dapl_evd_query.c \ dapl_cno_create.c \ dapl_cno_modify_agent.c \ dapl_cno_free.c \ dapl_cno_wait.c \ dapl_cno_query.c \ dapl_lmr_create.c \ dapl_evd_wait.c \ dapl_evd_disable.c \ dapl_evd_enable.c \ dapl_evd_modify_cno.c \ + dapl_evd_set_unwaitable.c \ dapl_evd_clear_unwaitable.c COMMON_SRCS = dapl_cookie.c \ dapl_cr_accept.c \ dapl_cr_query.c \ dapl_cr_reject.c \ dapl_cr_util.c \ dapl_cr_callback.c \ dapl_cr_handoff.c \ dapl_ep_connect.c \ |