From: Stan Smith <[email protected]> Merge SVN IBAL provider code back into the main git tree.
Signed-off-by: Sean Hefty <[email protected]> --- Actual codng changes were made by Stan. I'm just submitting the patch to update the DAPL git repository. dapl/dirs | 2 dapl/ibal/dapl_ibal_cm.c | 274 ++++++++++++++++++++++-------------- dapl/ibal/dapl_ibal_cq.c | 4 - dapl/ibal/dapl_ibal_dto.h | 10 + dapl/ibal/dapl_ibal_extensions.c | 17 -- dapl/ibal/dapl_ibal_name_service.h | 2 dapl/ibal/dapl_ibal_qp.c | 12 +- dapl/ibal/dapl_ibal_util.c | 63 ++++++++ dapl/ibal/dapl_ibal_util.h | 85 ++++++++++- 9 files changed, 322 insertions(+), 147 deletions(-) diff --git a/dapl/dirs b/dapl/dirs index a091968..6fb48fa 100644 --- a/dapl/dirs +++ b/dapl/dirs @@ -1 +1 @@ -DIRS=udapl udapl_scm +DIRS = ibal ibal-scm diff --git a/dapl/ibal/dapl_ibal_cm.c b/dapl/ibal/dapl_ibal_cm.c index a986430..fe5501a 100644 --- a/dapl/ibal/dapl_ibal_cm.c +++ b/dapl/ibal/dapl_ibal_cm.c @@ -30,6 +30,7 @@ #include "dapl_ibal_util.h" #include "dapl_name_service.h" #include "dapl_ibal_name_service.h" +#include "dapl_cookie.h" #define IB_INFINITE_SERVICE_LEASE 0xFFFFFFFF #define DAPL_ATS_SERVICE_ID ATS_SERVICE_ID //0x10000CE100415453 @@ -78,15 +79,35 @@ dapli_ib_cm_event_str(ib_cm_events_t e) } -static void -dapli_ibal_listen_err_cb ( - IN ib_listen_err_rec_t *p_listen_err_rec ) +#if defined(DAPL_DBG) + +void dapli_print_private_data( char *prefix, const uint8_t *pd, int len ) { - UNUSED_PARAM( p_listen_err_rec ); + int i; + + if ( !pd || len <= 0 ) + return; + + dapl_log ( DAPL_DBG_TYPE_CM, "--> %s: private_data:\n ",prefix); - dapl_dbg_log (DAPL_DBG_TYPE_CM, "--> %s: CM callback listen error\n", - "DiLEcb"); + if (len > IB_MAX_REP_PDATA_SIZE) + { + dapl_log ( DAPL_DBG_TYPE_ERR, + " Private data size(%d) > Max(%d), ignored.\n ", + len,DAPL_MAX_PRIVATE_DATA_SIZE); + len = IB_MAX_REP_PDATA_SIZE; + } + + for ( i = 0 ; i < len; i++ ) + { + dapl_log ( DAPL_DBG_TYPE_CM, "%2x ", pd[i]); + if ( ((i+1) % 20) == 0 ) + dapl_log ( DAPL_DBG_TYPE_CM, "\n "); + } + dapl_log ( DAPL_DBG_TYPE_CM, "\n"); } +#endif + static void dapli_ib_cm_apr_cb ( @@ -110,6 +131,7 @@ dapli_ib_cm_lap_cb ( /* * Connection Disconnect Request callback + * We received a DREQ, return a DREP (disconnect reply). */ static void @@ -124,23 +146,34 @@ dapli_ib_cm_dreq_cb ( ep_ptr = (DAPL_EP * __ptr64) p_cm_dreq_rec->qp_context; - if ( ep_ptr == NULL || - ep_ptr->header.magic == DAPL_MAGIC_INVALID ) + if ( DAPL_BAD_PTR(ep_ptr) ) { dapl_dbg_log (DAPL_DBG_TYPE_ERR, - "--> DiCDcb: EP %lx invalid or FREED\n", ep_ptr); + "--> %s: BAD_PTR EP %lx\n", __FUNCTION__, ep_ptr); + return; + } + if ( ep_ptr->header.magic != DAPL_MAGIC_EP ) + { + if ( ep_ptr->header.magic == DAPL_MAGIC_INVALID ) + return; + + dapl_dbg_log (DAPL_DBG_TYPE_ERR, + "--> %s: EP %p BAD_EP_MAGIC %x != wanted %x\n", + __FUNCTION__, ep_ptr, ep_ptr->header.magic, + DAPL_MAGIC_EP ); return; } + dapl_dbg_log (DAPL_DBG_TYPE_CM, - "--> %s() QP %lx EP %lx state %s sent_discreq %d\n", - __FUNCTION__, ep_ptr->qp_handle, ep_ptr, + "--> %s() EP %p, %s sent_discreq %s\n", + __FUNCTION__,ep_ptr, dapl_get_ep_state_str(ep_ptr->param.ep_state), - ep_ptr->sent_discreq ); + (ep_ptr->sent_discreq == DAT_TRUE ? "TRUE":"FALSE")); dapl_os_lock (&ep_ptr->header.lock); if ( ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECTED /*|| ( ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECT_PENDING - && ep_ptr->sent_discreq == DAT_FALSE)*/ ) + && ep_ptr->sent_discreq == DAT_TRUE)*/ ) { dapl_os_unlock (&ep_ptr->header.lock); dapl_dbg_log (DAPL_DBG_TYPE_CM, @@ -150,19 +183,18 @@ dapli_ib_cm_dreq_cb ( } ep_ptr->param.ep_state = DAT_EP_STATE_DISCONNECT_PENDING; - ep_ptr->recv_discreq = DAT_TRUE; dapl_os_unlock (&ep_ptr->header.lock); - dapl_os_memzero (&cm_drep, sizeof ( ib_cm_drep_t)); + dapl_os_memzero (&cm_drep, sizeof(ib_cm_drep_t)); /* Could fail if we received reply from other side, no need to retry */ - /* Wait for any transaction in process holding reference */ - while ( dapl_os_atomic_read(&ep_ptr->req_count) && bail-- > 0 ) + /* Wait for any send ops in process holding reference */ + while (dapls_cb_pending(&ep_ptr->req_buffer) && bail-- > 0 ) { dapl_dbg_log (DAPL_DBG_TYPE_CM, "--> DiCDcb: WAIT for EP=%lx req_count(%d) != 0\n", - ep_ptr, dapl_os_atomic_read(&ep_ptr->req_count)); + ep_ptr, dapls_cb_pending(&ep_ptr->req_buffer)); dapl_os_sleep_usec (100); } @@ -195,6 +227,7 @@ dapli_ib_cm_dreq_cb ( /* * Connection Disconnect Reply callback + * We sent a DREQ and received a DREP. */ static void @@ -207,16 +240,22 @@ dapli_ib_cm_drep_cb ( ep_ptr = (DAPL_EP * __ptr64) p_cm_drep_rec->qp_context; - if ( !ep_ptr || DAPL_BAD_HANDLE(ep_ptr, DAPL_MAGIC_EP) ) + if (p_cm_drep_rec->cm_status) { dapl_dbg_log (DAPL_DBG_TYPE_CM, + "--> %s: DREP cm_status(%s) EP=%p\n", __FUNCTION__, + ib_get_err_str(p_cm_drep_rec->cm_status), ep_ptr); + } + + if ( DAPL_BAD_HANDLE(ep_ptr, DAPL_MAGIC_EP) ) + { + dapl_dbg_log (DAPL_DBG_TYPE_ERR, "--> %s: BAD EP Handle EP=%lx\n", __FUNCTION__,ep_ptr); return; } dapl_dbg_log (DAPL_DBG_TYPE_CM, - "--> DiCDpcb: QP %lx EP %lx state %s cm_hdl %lx\n", - ep_ptr->qp_handle, ep_ptr, + "--> DiCDpcb: EP %p state %s cm_hdl %p\n",ep_ptr, dapl_get_ep_state_str(ep_ptr->param.ep_state), ep_ptr->cm_handle); @@ -254,6 +293,9 @@ dapli_ib_cm_drep_cb ( } } +/* + * CM reply callback + */ static void dapli_ib_cm_rep_cb ( @@ -268,12 +310,14 @@ dapli_ib_cm_rep_cb ( dapl_os_assert (p_cm_rep_rec != NULL); - dapl_os_memzero (&cm_rtu, sizeof ( ib_cm_rtu_t )); - - dapl_os_assert ( ((DAPL_HEADER * __ptr64) - p_cm_rep_rec->qp_context)->magic == DAPL_MAGIC_EP ); - ep_ptr = (DAPL_EP * __ptr64) p_cm_rep_rec->qp_context; + + if ( DAPL_BAD_HANDLE(ep_ptr, DAPL_MAGIC_EP) ) + { + dapl_dbg_log (DAPL_DBG_TYPE_ERR, "--> %s: EP %lx invalid or FREED\n", + __FUNCTION__, ep_ptr); + return; + } dapl_dbg_log (DAPL_DBG_TYPE_CM, "--> DiCRpcb: EP = %lx local_max_rdma_read_in %d\n", ep_ptr, p_cm_rep_rec->resp_res); @@ -281,6 +325,7 @@ dapli_ib_cm_rep_cb ( p_ca = (dapl_ibal_ca_t *) ep_ptr->header.owner_ia->hca_ptr->ib_hca_handle; + dapl_os_memzero (&cm_rtu, sizeof ( ib_cm_rtu_t )); cm_rtu.pfn_cm_apr_cb = dapli_ib_cm_apr_cb; cm_rtu.pfn_cm_dreq_cb = dapli_ib_cm_dreq_cb; cm_rtu.p_rtu_pdata = NULL; @@ -302,7 +347,7 @@ dapli_ib_cm_rep_cb ( cm_cb_op = IB_CME_CONNECTED; dapl_dbg_log (DAPL_DBG_TYPE_CM, "--> DiCRpcb: EP %lx Connected req_count %d\n", - ep_ptr, dapl_os_atomic_read(&ep_ptr->req_count)); + ep_ptr, dapls_cb_pending(&ep_ptr->req_buffer)); } else { @@ -311,23 +356,10 @@ dapli_ib_cm_rep_cb ( prd_ptr = (DAPL_PRIVATE * __ptr64) p_cm_rep_rec->p_rep_pdata; -#ifdef DAPL_DBG -#if 0 - { - int i; - - dapl_dbg_log ( DAPL_DBG_TYPE_EP, "--> DiCRpcb: private_data: "); - - for ( i = 0 ; i < IB_MAX_REP_PDATA_SIZE ; i++ ) - { - dapl_dbg_log ( DAPL_DBG_TYPE_EP, - "0x%x ", prd_ptr->private_data[i]); - - } - dapl_dbg_log ( DAPL_DBG_TYPE_EP, "\n"); - - } -#endif +#if defined(DAPL_DBG) && 0 + dapli_print_private_data( "DiCRpcb", + prd_ptr->private_data, + IB_MAX_REP_PDATA_SIZE); #endif dapl_evd_connection_callback ( @@ -349,6 +381,13 @@ dapli_ib_cm_rej_cb ( ep_ptr = (DAPL_EP * __ptr64) p_cm_rej_rec->qp_context; + if ( DAPL_BAD_HANDLE(ep_ptr, DAPL_MAGIC_EP) ) + { + dapl_dbg_log (DAPL_DBG_TYPE_ERR, "--> %s: EP %lx invalid or FREED\n", + __FUNCTION__, ep_ptr); + return; + } + dapl_dbg_log (DAPL_DBG_TYPE_CM, "--> DiCRjcb: EP = %lx QP = %lx rej reason = 0x%x\n", ep_ptr,ep_ptr->qp_handle,CL_NTOH16(p_cm_rej_rec->rej_status)); @@ -589,6 +628,13 @@ dapli_ib_cm_rtu_cb ( ep_ptr = (DAPL_EP * __ptr64) p_cm_rtu_rec->qp_context; + if ( DAPL_BAD_HANDLE(ep_ptr, DAPL_MAGIC_EP) ) + { + dapl_dbg_log (DAPL_DBG_TYPE_ERR, "--> %s: EP %lx invalid or FREED\n", + __FUNCTION__, ep_ptr); + return; + } + dapl_dbg_log (DAPL_DBG_TYPE_CM | DAPL_DBG_TYPE_CALLBACK, "--> DiCRucb: EP %lx QP %lx\n", ep_ptr, ep_ptr->qp_handle); @@ -708,8 +754,8 @@ dapls_ib_connect ( IN DAT_EP_HANDLE ep_handle, IN DAT_IA_ADDRESS_PTR remote_ia_address, IN DAT_CONN_QUAL remote_conn_qual, - IN DAT_COUNT prd_size, - IN DAPL_PRIVATE *prd_ptr ) + IN DAT_COUNT private_data_size, + IN DAT_PVOID private_data ) { DAPL_EP *ep_ptr; DAPL_IA *ia_ptr; @@ -874,8 +920,9 @@ dapls_ib_connect ( cm_req.p_alt_path = NULL; cm_req.h_qp = ep_ptr->qp_handle; cm_req.qp_type = IB_QPT_RELIABLE_CONN; - cm_req.p_req_pdata = (uint8_t *) prd_ptr; - cm_req.req_length = (uint8_t)prd_size; + cm_req.p_req_pdata = (uint8_t *) private_data; + cm_req.req_length = (uint8_t) + min(private_data_size,IB_MAX_REQ_PDATA_SIZE); /* cm retry to send this request messages, IB max of 4 bits */ cm_req.max_cm_retries = 15; /* timer outside of call, s/be infinite */ /* qp retry to send any wr */ @@ -886,13 +933,13 @@ dapls_ib_connect ( cm_req.init_depth = (uint8_t)ep_ptr->param.ep_attr.max_rdma_read_out; /* time wait before retrying a pkt after receiving a RNR NAK */ - cm_req.rnr_nak_timeout = 12; /* 163.84ms */ + cm_req.rnr_nak_timeout = IB_RNR_NAK_TIMEOUT; /* * number of time local QP should retry after receiving RNR NACK before * reporting an error */ - cm_req.rnr_retry_cnt = 6; /* 7 is infinite */ + cm_req.rnr_retry_cnt = IB_RNR_RETRY_CNT; cm_req.remote_resp_timeout = 16; /* 250ms */ cm_req.local_resp_timeout = 16; /* 250ms */ @@ -962,13 +1009,11 @@ DAT_RETURN dapls_ib_disconnect ( IN DAPL_EP *ep_ptr, IN DAT_CLOSE_FLAGS disconnect_flags ) { - DAPL_IA *ia_ptr; - ib_api_status_t ib_status; + ib_api_status_t ib_status = IB_SUCCESS; ib_cm_dreq_t cm_dreq; - //UNUSED_PARAM( disconnect_flags ); - dapl_os_assert(ep_ptr); + if ( DAPL_BAD_HANDLE(ep_ptr, DAPL_MAGIC_EP) ) { dapl_dbg_log (DAPL_DBG_TYPE_CM, @@ -982,27 +1027,25 @@ dapls_ib_disconnect ( IN DAPL_EP *ep_ptr, return DAT_SUCCESS; } - dapl_dbg_log (DAPL_DBG_TYPE_CM, "--> %s() DsD: EP %lx QP %lx ep_state %s " - "rx_drq %d tx_drq %d Close %s\n", __FUNCTION__, - ep_ptr, ep_ptr->qp_handle, - dapl_get_ep_state_str (ep_ptr->param.ep_state), + dapl_dbg_log (DAPL_DBG_TYPE_CM, + "--> %s() EP %p %s rx_drq %d tx_drq %d Close %s\n", __FUNCTION__, + ep_ptr, dapl_get_ep_state_str(ep_ptr->param.ep_state), ep_ptr->recv_discreq, ep_ptr->sent_discreq, - (disconnect_flags == DAT_CLOSE_ABRUPT_FLAG - ? "Abrupt":"Graceful")); + (disconnect_flags == DAT_CLOSE_ABRUPT_FLAG ? "Abrupt":"Graceful")); - if ( disconnect_flags == DAT_CLOSE_ABRUPT_FLAG ) { - dapl_ep_legacy_post_disconnect(ep_ptr, disconnect_flags); + if ( disconnect_flags == DAT_CLOSE_ABRUPT_FLAG ) + { + if ( ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECTED ) return DAT_SUCCESS; - } - if ( ep_ptr->param.ep_state != DAT_EP_STATE_CONNECTED ) + if ( ep_ptr->param.ep_state != DAT_EP_STATE_DISCONNECT_PENDING ) { - dapl_dbg_log (DAPL_DBG_TYPE_CM, - "--> DsD: EP %lx NOT connected state %s\n", - ep_ptr, dapl_get_ep_state_str (ep_ptr->param.ep_state)); + dapl_dbg_log(DAPL_DBG_TYPE_CM, + "%s() calling legacy_post_disconnect()\n",__FUNCTION__); + dapl_ep_legacy_post_disconnect(ep_ptr, disconnect_flags); + return DAT_SUCCESS; + } } - ia_ptr = ep_ptr->header.owner_ia; - ib_status = IB_SUCCESS; dapl_os_memzero(&cm_dreq, sizeof(ib_cm_dreq_t)); @@ -1017,19 +1060,32 @@ dapls_ib_disconnect ( IN DAPL_EP *ep_ptr, cm_dreq.p_dreq_pdata = NULL; cm_dreq.flags = IB_FLAGS_SYNC; + /* + * still need to send DREQ (disconnect request)? + */ if ( (ep_ptr->recv_discreq == DAT_FALSE) - && (ep_ptr->sent_discreq == DAT_FALSE) ) + && (ep_ptr->sent_discreq == DAT_FALSE) + && (ep_ptr->qp_state != IB_QPS_RESET) ) { ep_ptr->sent_discreq = DAT_TRUE; - ib_status = ib_cm_dreq ( &cm_dreq ); + /* tolerate INVALID_STATE error as the other side can race ahead and + * generate a DREQ before we do. + */ + if ( ib_status == IB_INVALID_STATE ) + ib_status = IB_SUCCESS; + if (ib_status) + { + dapl_dbg_log(DAPL_DBG_TYPE_ERR, + "%s() EP %p ib_cm_dreq() status %s\n", + __FUNCTION__,ep_ptr,ib_get_err_str(ib_status)); + } + if ( ib_status == IB_SUCCESS ) dapl_dbg_log (DAPL_DBG_TYPE_CM, - "--> DsD: EP %lx QP %lx DREQ SENT status %s\n", - ep_ptr, ep_ptr->qp_handle,ib_get_err_str(ib_status)); + "--> DsD: EP %p DREQ SENT\n", ep_ptr); } - - return dapl_ib_status_convert (ib_status); + return ib_status; } @@ -1127,7 +1183,6 @@ dapls_ib_setup_conn_listener ( ib_status = ib_cm_listen ( dapl_ibal_root.h_al, &cm_listen, - dapli_ibal_listen_err_cb, (void *) sp_ptr, &sp_ptr->cm_srvc_handle ); @@ -1256,8 +1311,22 @@ dapls_ib_reject_connection ( IN dp_ib_cm_handle_t ib_cm_handle, cm_rej.rej_status = IB_REJ_USER_DEFINED; cm_rej.p_ari = (ib_ari_t *)&rej_table[reject_reason]; cm_rej.ari_length = (uint8_t)strlen (rej_table[reject_reason]); - cm_rej.p_rej_pdata = NULL; - cm_rej.rej_length = 0; + + if (private_data_size > + dapls_ib_private_data_size(NULL,DAPL_PDATA_CONN_REJ,NULL)) + { + dapl_dbg_log ( DAPL_DBG_TYPE_ERR, + "--> DsRjC: private_data size(%d) > Max(%d)\n", + private_data_size, IB_MAX_REJ_PDATA_SIZE ); + return DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); + } + + cm_rej.p_rej_pdata = private_data; + cm_rej.rej_length = private_data_size; + +#if defined(DAPL_DBG) && 0 + dapli_print_private_data("DsRjC",private_data,private_data_size); +#endif ib_status = ib_cm_rej ( *ib_cm_handle, &cm_rej); @@ -1269,7 +1338,6 @@ dapls_ib_reject_connection ( IN dp_ib_cm_handle_t ib_cm_handle, } return ( dapl_ib_status_convert ( ib_status ) ); - } @@ -1286,7 +1354,6 @@ dapli_query_qp( ib_qp_handle_t qp_handle, ib_qp_attr_t *qpa ) dapl_dbg_log ( DAPL_DBG_TYPE_ERR,"ib_query_qp(%lx) '%s'\n", qp_handle, ib_get_err_str(ib_status) ); } -#if 1 else { dapl_dbg_log ( DAPL_DBG_TYPE_CM, "--> QP(%lx) state %s " @@ -1297,7 +1364,6 @@ dapli_query_qp( ib_qp_handle_t qp_handle, ib_qp_attr_t *qpa ) qpa->init_depth, qpa->access_ctrl ); } -#endif } #endif @@ -1310,8 +1376,8 @@ dapli_query_qp( ib_qp_handle_t qp_handle, ib_qp_attr_t *qpa ) * Input: * cr_handle * ep_handle - * private_data_size - ignored as DAT layer sets 0 - * private_data - ignored as DAT layer sets NULL + * private_data_size + * private_data * * Output: * none @@ -1326,8 +1392,8 @@ DAT_RETURN dapls_ib_accept_connection ( IN DAT_CR_HANDLE cr_handle, IN DAT_EP_HANDLE ep_handle, - IN DAT_COUNT p_size, - IN DAPL_PRIVATE *prd_ptr ) + IN DAT_COUNT private_data_size, + IN const DAT_PVOID private_data ) { DAPL_CR *cr_ptr; DAPL_EP *ep_ptr; @@ -1414,24 +1480,21 @@ dapls_ib_accept_connection ( cm_rep.h_qp = ep_ptr->qp_handle; cm_rep.qp_type = IB_QPT_RELIABLE_CONN; - cm_rep.p_rep_pdata = (uint8_t *) cr_ptr->private_data; - cm_rep.rep_length = IB_REQ_PDATA_SIZE; - -#if defined(DAPL_DBG) && 0 - { - int i; - - dapl_dbg_log ( DAPL_DBG_TYPE_EP, "--> DsAC: private_data: "); - for ( i = 0 ; i < IB_MAX_REP_PDATA_SIZE ; i++ ) - { - dapl_dbg_log ( DAPL_DBG_TYPE_EP, - "0x%x ", prd_ptr->private_data[i]); + if (private_data_size > IB_MAX_REP_PDATA_SIZE) { + dapl_dbg_log (DAPL_DBG_TYPE_ERR, + "--> DsIBAC: private_data_size(%d) > Max(%d)\n", + private_data_size, IB_MAX_REP_PDATA_SIZE); + return DAT_ERROR(DAT_LENGTH_ERROR, DAT_NO_SUBTYPE); } - dapl_dbg_log ( DAPL_DBG_TYPE_EP, "\n"); + cm_rep.p_rep_pdata = (const uint8_t *)private_data; + cm_rep.rep_length = private_data_size; - } +#if defined(DAPL_DBG) && 0 + dapli_print_private_data( "DsIBAC", + (const uint8_t*)private_data, + private_data_size ); #endif cm_rep.pfn_cm_rej_cb = dapli_ib_cm_rej_cb; @@ -1467,15 +1530,15 @@ dapls_ib_accept_connection ( cm_rep.flags = 0; cm_rep.failover_accepted = IB_FAILOVER_ACCEPT_UNSUPPORTED; cm_rep.target_ack_delay = 14; - cm_rep.rnr_nak_timeout = 12; - cm_rep.rnr_retry_cnt = 6; + cm_rep.rnr_nak_timeout = IB_RNR_NAK_TIMEOUT; + cm_rep.rnr_retry_cnt = IB_RNR_RETRY_CNT; cm_rep.pp_recv_failure = NULL; cm_rep.p_recv_wr = NULL; dapl_dbg_log (DAPL_DBG_TYPE_CM, "--> DsIBAC: cm_rep: acc %x init %d qp_type %x req_count %d\n", cm_rep.access_ctrl, cm_rep.init_depth,cm_rep.qp_type, - dapl_os_atomic_read(&ep_ptr->req_count)); + dapls_cb_pending(&ep_ptr->req_buffer)); ib_status = ib_cm_rep ( *ep_ptr->cm_handle, &cm_rep ); @@ -1681,9 +1744,9 @@ dapls_ib_cr_handoff ( * Return the size of private data given a connection op type * * Input: - * hca_ptr hca pointer, needed for transport type * prd_ptr private data pointer * conn_op connection operation type + * hca_ptr hca pointer, needed for transport type * * If prd_ptr is NULL, this is a query for the max size supported by * the provider, otherwise it is the actual size of the private data @@ -1700,13 +1763,14 @@ dapls_ib_cr_handoff ( */ int dapls_ib_private_data_size ( - IN DAPL_HCA *hca_ptr, IN DAPL_PRIVATE *prd_ptr, - IN DAPL_PDATA_OP conn_op) + IN DAPL_PDATA_OP conn_op, + IN DAPL_HCA *hca_ptr) { int size; UNUSED_PARAM( prd_ptr ); + UNUSED_PARAM( hca_ptr ); switch (conn_op) { diff --git a/dapl/ibal/dapl_ibal_cq.c b/dapl/ibal/dapl_ibal_cq.c index 2ac5814..28de045 100644 --- a/dapl/ibal/dapl_ibal_cq.c +++ b/dapl/ibal/dapl_ibal_cq.c @@ -82,7 +82,9 @@ dapli_ibal_cq_async_error_callback ( IN ib_async_event_rec_t *p_err_rec ) /* maps to dapl_evd_cq_async_error_callback(), context is EVD */ evd_cb->pfn_async_cq_err_cb( (ib_hca_handle_t)p_ca, - (ib_error_record_t*)&p_err_rec->code, evd_ptr); + evd_ptr->ib_cq_handle, + (ib_error_record_t*)&p_err_rec->code, + evd_ptr ); } diff --git a/dapl/ibal/dapl_ibal_dto.h b/dapl/ibal/dapl_ibal_dto.h index 283fd91..4694072 100644 --- a/dapl/ibal/dapl_ibal_dto.h +++ b/dapl/ibal/dapl_ibal_dto.h @@ -146,19 +146,16 @@ dapls_ib_post_recv ( { return DAT_SUCCESS; } - else - { + dapl_dbg_log (DAPL_DBG_TYPE_EP, "--> DsPR: post_recv status %s\n", ib_get_err_str(ib_status)); - /* * Moving QP to error state; */ - ib_status = dapls_modify_qp_state_to_error ( ep_ptr->qp_handle); + (void) dapls_modify_qp_state_to_error ( ep_ptr->qp_handle); ep_ptr->qp_state = IB_QPS_ERROR; return (dapl_ib_status_convert (ib_status)); - } } @@ -185,6 +182,7 @@ dapls_ib_post_send ( if (ep_ptr->param.ep_state != DAT_EP_STATE_CONNECTED) { ib_qp_attr_t qp_attr; + ib_query_qp ( ep_ptr->qp_handle, &qp_attr ); dapl_dbg_log (DAPL_DBG_TYPE_ERR, "--> DsPS: !CONN EP (%p) ep_state=%d " @@ -274,7 +272,7 @@ dapls_ib_post_send ( /* * Moving QP to error state; */ - ib_status = dapls_modify_qp_state_to_error ( ep_ptr->qp_handle); + (void) dapls_modify_qp_state_to_error ( ep_ptr->qp_handle); ep_ptr->qp_state = IB_QPS_ERROR; return (dapl_ib_status_convert (ib_status)); diff --git a/dapl/ibal/dapl_ibal_extensions.c b/dapl/ibal/dapl_ibal_extensions.c index 48c0dfe..b05c0bb 100644 --- a/dapl/ibal/dapl_ibal_extensions.c +++ b/dapl/ibal/dapl_ibal_extensions.c @@ -194,10 +194,7 @@ dapli_post_ext( IN DAT_EP_HANDLE ep_handle, /* * Synchronization ok since this buffer is only used for send * requests, which aren't allowed to race with each other. - * only if completion is expected */ - if (!(DAT_COMPLETION_SUPPRESS_FLAG & flags)) { - dat_status = dapls_dto_cookie_alloc( &ep_ptr->req_buffer, DAPL_DTO_TYPE_EXTENSION, @@ -207,21 +204,13 @@ dapli_post_ext( IN DAT_EP_HANDLE ep_handle, if ( dat_status != DAT_SUCCESS ) { #ifdef DAPL_DBG - dapl_dbg_log(DAPL_DBG_TYPE_ERR, - "%s() cookie alloc faulure %x\n", + dapl_dbg_log(DAPL_DBG_TYPE_ERR,"%s() cookie alloc faulure %x\n", __FUNCTION__,dat_status); #endif goto bail; } /* - * Take reference before posting to avoid race conditions with - * completions - */ - dapl_os_atomic_inc(&ep_ptr->req_count); - } - - /* * Invoke provider specific routine to post DTO */ dat_status = dapls_ib_post_ext_send(ep_ptr, @@ -237,9 +226,6 @@ dapli_post_ext( IN DAT_EP_HANDLE ep_handle, if (dat_status != DAT_SUCCESS) { - if ( cookie != NULL ) - { - dapl_os_atomic_dec(&ep_ptr->req_count); dapls_cookie_dealloc(&ep_ptr->req_buffer, cookie); #ifdef DAPL_DBG dapl_dbg_log(DAPL_DBG_TYPE_ERR, @@ -247,7 +233,6 @@ dapli_post_ext( IN DAT_EP_HANDLE ep_handle, __FUNCTION__,dat_status,__LINE__); #endif } - } bail: return dat_status; diff --git a/dapl/ibal/dapl_ibal_name_service.h b/dapl/ibal/dapl_ibal_name_service.h index e55eead..d322d71 100644 --- a/dapl/ibal/dapl_ibal_name_service.h +++ b/dapl/ibal/dapl_ibal_name_service.h @@ -58,8 +58,6 @@ dapli_ib_sa_query_cb ( IN ib_query_rec_t *p_query_rec ); -//DAT_RETURN dapls_ns_init (void); - #ifdef NO_NAME_SERVICE DAT_RETURN dapls_ns_lookup_address ( diff --git a/dapl/ibal/dapl_ibal_qp.c b/dapl/ibal/dapl_ibal_qp.c index 9f26c82..cc8c394 100644 --- a/dapl/ibal/dapl_ibal_qp.c +++ b/dapl/ibal/dapl_ibal_qp.c @@ -81,7 +81,7 @@ dapli_ib_qp_async_error_cb( IN ib_async_event_rec_t* p_err_rec ) if ((evd_cb == NULL) || (evd_cb->pfn_async_qp_err_cb == NULL)) { dapl_dbg_log (DAPL_DBG_TYPE_ERR, - "--> DiQpAEC: no ERROR cb on %p found \n", p_ca); + "--> DiQpAEC: no ERROR cb on p_ca %p found\n", p_ca); return; } @@ -94,8 +94,9 @@ dapli_ib_qp_async_error_cb( IN ib_async_event_rec_t* p_err_rec ) /* maps to dapl_evd_qp_async_error_callback(), context is EP */ evd_cb->pfn_async_qp_err_cb( (ib_hca_handle_t)p_ca, + ep_ptr->qp_handle, (ib_error_record_t*)&p_err_rec->code, - ep_ptr); + ep_ptr ); } /* @@ -556,9 +557,9 @@ dapls_modify_qp_state_to_rtr ( qp_mod.state.rtr.primary_av.conn.path_mtu = p_port->p_attr->mtu; qp_mod.state.rtr.primary_av.conn.local_ack_timeout = 7; qp_mod.state.rtr.primary_av.conn.seq_err_retry_cnt = 7; - qp_mod.state.rtr.primary_av.conn.rnr_retry_cnt = 7; + qp_mod.state.rtr.primary_av.conn.rnr_retry_cnt = IB_RNR_RETRY_CNT; qp_mod.state.rtr.resp_res = 4; // in-flight RDMAs - qp_mod.state.rtr.rnr_nak_timeout = 7; + qp_mod.state.rtr.rnr_nak_timeout = IB_RNR_NAK_TIMEOUT; ib_status = ib_modify_qp (qp_handle, &qp_mod); @@ -579,7 +580,8 @@ dapls_modify_qp_state_to_rts ( ib_qp_handle_t qp_handle ) qp_mod.req_state = IB_QPS_RTS; qp_mod.state.rts.sq_psn = DAPL_IBAL_START_PSN; qp_mod.state.rts.retry_cnt = 7; - qp_mod.state.rts.rnr_retry_cnt = 6; + qp_mod.state.rts.rnr_retry_cnt = IB_RNR_RETRY_CNT; + qp_mod.state.rtr.rnr_nak_timeout = IB_RNR_NAK_TIMEOUT; qp_mod.state.rts.local_ack_timeout = 7; qp_mod.state.rts.init_depth = 4; diff --git a/dapl/ibal/dapl_ibal_util.c b/dapl/ibal/dapl_ibal_util.c index fe9e3b8..ad4acf0 100644 --- a/dapl/ibal/dapl_ibal_util.c +++ b/dapl/ibal/dapl_ibal_util.c @@ -29,7 +29,7 @@ #include "dapl_ring_buffer_util.h" #ifdef DAT_EXTENSIONS -#include <dat\dat_ib_extensions.h> +#include <dat2\dat_ib_extensions.h> #endif #ifndef NO_NAME_SERVICE @@ -1542,6 +1542,63 @@ dapls_ib_setup_async_callback ( /* + * dapls_ib_query_gid + * + * Query the hca for the gid of the 1st active port. + * + * Input: + * hca_handl hca handle + * ep_attr attribute of the ep + * + * Output: + * none + * + * Returns: + * DAT_SUCCESS + * DAT_INVALID_HANDLE + * DAT_INVALID_PARAMETER + */ + +DAT_RETURN +dapls_ib_query_gid( IN DAPL_HCA *hca_ptr, + IN GID *gid ) +{ + dapl_ibal_ca_t *p_ca; + ib_ca_attr_t *p_hca_attr; + ib_api_status_t ib_status; + ib_hca_port_t port_num; + + p_ca = (dapl_ibal_ca_t *) hca_ptr->ib_hca_handle; + + if (p_ca == NULL) + { + dapl_dbg_log ( DAPL_DBG_TYPE_ERR, + "%s() invalid hca_ptr %p", __FUNCTION__, hca_ptr); + return DAT_INVALID_HANDLE; + } + + ib_status = ib_query_ca ( + p_ca->h_ca, + p_ca->p_ca_attr, + &p_ca->ca_attr_size); + if (ib_status != IB_SUCCESS) + { + dapl_dbg_log ( DAPL_DBG_TYPE_ERR, + "%s() ib_query_ca returned failed status = %s\n", + ib_get_err_str(ib_status)); + return dapl_ib_status_convert (ib_status); + } + + p_hca_attr = p_ca->p_ca_attr; + port_num = hca_ptr->port_num - 1; + + gid->gid_prefix = p_hca_attr->p_port_attr[port_num].p_gid_table->unicast.prefix; + gid->guid = p_hca_attr->p_port_attr[port_num].p_gid_table->unicast.interface_id; + return DAT_SUCCESS; +} + + +/* * dapls_ib_query_hca * * Query the hca attribute @@ -2201,7 +2258,9 @@ static DAT_NAMED_ATTR *ib_attrs = NULL; #define SPEC_ATTR_SIZE( x ) 0 #endif -void dapls_query_provider_specific_attr( IN DAT_PROVIDER_ATTR *attr_ptr ) +void dapls_query_provider_specific_attr( + IN DAPL_IA *ia_ptr, + IN DAT_PROVIDER_ATTR *attr_ptr ) { attr_ptr->num_provider_specific_attr = SPEC_ATTR_SIZE(ib_attrs); attr_ptr->provider_specific_attr = ib_attrs; diff --git a/dapl/ibal/dapl_ibal_util.h b/dapl/ibal/dapl_ibal_util.h index 033bc8d..52dd879 100644 --- a/dapl/ibal/dapl_ibal_util.h +++ b/dapl/ibal/dapl_ibal_util.h @@ -29,7 +29,7 @@ #include <complib/cl_atomic.h> #ifdef DAT_EXTENSIONS -#include <dat\dat_ib_extensions.h> +#include <dat2\dat_ib_extensions.h> #endif /* @@ -62,6 +62,18 @@ typedef void (*ib_async_handler_t)( 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_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 ib_net64_t ib_guid_t; typedef ib_net16_t ib_lid_t; typedef boolean_t ib_bool_t; @@ -112,6 +124,34 @@ typedef struct _ib_hca_name #define IB_MAX_DREQ_PDATA_SIZE 220 #define IB_MAX_DREP_PDATA_SIZE 224 + +/* Resource Not Ready + 1-6 is an actual retry count which is decremented to zero before + an error condition is set. + 7 is 'magic' in that it implies Infinite retry, just keeps trying. +*/ +#define IB_RNR_RETRY_CNT 7 + +/* +IB 1.2 spec, page 331, table 45, RNR NAK timeout encoding (5-bits) + +00000=655.36ms(milliseconds) +00001=0.01ms +00010=0.02ms +00011=0.03ms +00100=0.04ms +00101=0.06ms +00110=0.08ms +00111=0.12ms + +11100=163.84ms 28d +11101=245.76ms 29d +11110=327.68ms 30d +11111=491.52ms 31d +*/ +#define IB_RNR_NAK_TIMEOUT 0 + + typedef void (*dapl_ibal_pfn_destructor_t)( IN void* context ); @@ -164,8 +204,8 @@ typedef struct _dapl_ibal_evd_cb { cl_list_item_t next; // peer CA list ib_async_handler_t pfn_async_err_cb; - ib_async_handler_t pfn_async_qp_err_cb; - ib_async_handler_t pfn_async_cq_err_cb; + ib_async_qp_handler_t pfn_async_qp_err_cb; + ib_async_cq_handler_t pfn_async_cq_err_cb; void *context; } dapl_ibal_evd_cb_t; @@ -370,6 +410,7 @@ struct ib_llist_entry }; #ifdef SOCK_CM + typedef enum { IB_THREAD_INIT, @@ -378,7 +419,22 @@ typedef enum IB_THREAD_EXIT } ib_thread_state_t; -#endif + +typedef enum scm_state +{ + SCM_INIT, + SCM_LISTEN, + SCM_CONN_PENDING, + SCM_ACCEPTING, + SCM_ACCEPTED, + SCM_REJECTED, + SCM_CONNECTED, + SCM_DISCONNECTED, + SCM_DESTROY + +} SCM_STATE; + +#endif /* SOCK_CM */ typedef struct _ib_hca_transport { @@ -409,29 +465,40 @@ typedef uint32_t ib_shm_transport_t; /* CM mappings use SOCKETS */ -/* destination info to exchange until real IB CM shows up */ +/* destination info exchanged between dapl, define wire protocol version */ +#define DSCM_VER 2 + typedef struct _ib_qp_cm { - ib_net32_t qpn; + ib_net16_t ver; + ib_net16_t rej; ib_net16_t lid; ib_net16_t port; + ib_net32_t qpn; ib_net32_t p_size; DAT_SOCK_ADDR6 ia_address; + GID gid; } ib_qp_cm_t; struct ib_cm_handle { struct ib_llist_entry entry; + DAPL_OS_LOCK lock; + SCM_STATE state; int socket; int l_socket; - struct dapl_hca *hca_ptr; - DAT_HANDLE cr; + struct dapl_hca *hca; DAT_HANDLE sp; + DAT_HANDLE cr; + struct dapl_ep *ep; ib_qp_cm_t dst; unsigned char p_data[256]; }; -#endif + +DAT_RETURN dapli_init_sock_cm ( IN DAPL_HCA *hca_ptr ); + +#endif /* SOCK_CM */ /* * Prototype _______________________________________________ general mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general
