From 41b074183bad2e44f1003091ea3c1485317e106e Mon Sep 17 00:00:00 2001 From: stansmith Date: Fri, 2 May 2008 22:46:41 +0000 Subject: [PATCH] [DAPL] reconstitute changes that were omitted by WDK changes svn 1091 vs. 1101. git-svn-id: svn://openib.tc.cornell.edu/gen1@1116 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- trunk/ulp/dapl/dapl/common/dapl_ep_free.c | 1 - trunk/ulp/dapl/dapl/common/dapl_evd_dequeue.c | 5 +- trunk/ulp/dapl/dapl/ibal/dapl_ibal_cm.c | 33 +++-- trunk/ulp/dapl/dapl/ibal/dapl_ibal_dto.h | 127 +++++++++--------- trunk/ulp/dapl/dapl/ibal/dapl_ibal_qp.c | 9 +- trunk/ulp/dapl/dapl/ibal/dapl_ibal_util.h | 31 ++++- trunk/ulp/dapl/test/udapl/dapltest/SOURCES | 8 +- .../ulp/dapl/test/udapl/dapltest/dapltest.rc | 14 +- 8 files changed, 133 insertions(+), 95 deletions(-) diff --git a/trunk/ulp/dapl/dapl/common/dapl_ep_free.c b/trunk/ulp/dapl/dapl/common/dapl_ep_free.c index b6c206f7..0f4ff677 100644 --- a/trunk/ulp/dapl/dapl/common/dapl_ep_free.c +++ b/trunk/ulp/dapl/dapl/common/dapl_ep_free.c @@ -191,7 +191,6 @@ dapl_ep_free ( bail: return dat_status; - } /* diff --git a/trunk/ulp/dapl/dapl/common/dapl_evd_dequeue.c b/trunk/ulp/dapl/dapl/common/dapl_evd_dequeue.c index bc67cab6..91ec67fc 100644 --- a/trunk/ulp/dapl/dapl/common/dapl_evd_dequeue.c +++ b/trunk/ulp/dapl/dapl/common/dapl_evd_dequeue.c @@ -115,12 +115,11 @@ DAT_RETURN dapl_evd_dequeue ( * This keeps events in order if dat_evd_wait() has copied events * from CQ to EVD. */ - local_event = (DAT_EVENT *)dapls_rbuf_remove (&evd_ptr->pending_event_queue); + local_event = (DAT_EVENT *)dapls_rbuf_remove(&evd_ptr->pending_event_queue); if (local_event != NULL) { *event = *local_event; - dat_status = dapls_rbuf_add (&evd_ptr->free_event_queue, - local_event); + dat_status = dapls_rbuf_add (&evd_ptr->free_event_queue, local_event); DAPL_CNTR(DCNT_EVD_DEQUEUE_FOUND); } else if (evd_ptr->ib_cq_handle != IB_INVALID_HANDLE) diff --git a/trunk/ulp/dapl/dapl/ibal/dapl_ibal_cm.c b/trunk/ulp/dapl/dapl/ibal/dapl_ibal_cm.c index 68bb42a5..06a603a0 100644 --- a/trunk/ulp/dapl/dapl/ibal/dapl_ibal_cm.c +++ b/trunk/ulp/dapl/dapl/ibal/dapl_ibal_cm.c @@ -1269,13 +1269,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; /* dapl_ibal_util.h */ /* * 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 */ @@ -1343,14 +1343,10 @@ DAT_RETURN IN DAPL_EP *ep_ptr, IN DAT_CLOSE_FLAGS disconnect_flags) { - DAPL_IA *ia_ptr; - ib_api_status_t ib_status; - ib_cm_dreq_t cm_dreq; + ib_api_status_t ib_status = IB_SUCCESS; + ib_cm_dreq_t cm_dreq; - UNUSED_PARAM( disconnect_flags ); - - ia_ptr = ep_ptr->header.owner_ia; - ib_status = IB_SUCCESS; + UNUSED_PARAM( disconnect_flags ); dapl_os_memzero(&cm_dreq, sizeof(ib_cm_dreq_t)); @@ -1376,8 +1372,18 @@ DAT_RETURN ep_ptr->sent_discreq = DAT_TRUE; ib_status = ib_cm_dreq ( &cm_dreq ); - dapl_dbg_log (DAPL_DBG_TYPE_CM,"--> DsD: EP=%p QP= %p DREQ SENT status =%s\n", - ep_ptr, ep_ptr->qp_handle,ib_get_err_str(ib_status)); + /* 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, + "--> DsD: EP=%p QP= %p DREQ SEND status %s\n", + ep_ptr, ep_ptr->qp_handle,ib_get_err_str(ib_status)); + } } return dapl_ib_status_convert (ib_status); } @@ -1736,8 +1742,9 @@ 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; + /* see dapl_ibal_util.h for IB_RNR_XXX */; + cm_rep.rnr_nak_timeout = IB_RNR_NAK_TIMEOUT; + cm_rep.rnr_retry_cnt = IB_RNR_RETRY_CNT; cm_rep.p_recv_wr = NULL; cm_rep.pp_recv_failure = NULL; diff --git a/trunk/ulp/dapl/dapl/ibal/dapl_ibal_dto.h b/trunk/ulp/dapl/dapl/ibal/dapl_ibal_dto.h index 5724235b..5b7bd9bd 100644 --- a/trunk/ulp/dapl/dapl/ibal/dapl_ibal_dto.h +++ b/trunk/ulp/dapl/dapl/ibal/dapl_ibal_dto.h @@ -42,13 +42,13 @@ dapls_ib_cq_late_alloc ( */ STATIC _INLINE_ DAT_RETURN dapls_ib_post_recv ( - IN DAPL_EP *ep_ptr, + IN DAPL_EP *ep_ptr, IN DAPL_COOKIE *cookie, IN DAT_COUNT num_segments, IN DAT_LMR_TRIPLET *local_iov) { ib_api_status_t ib_status; - ib_recv_wr_t recv_wr, *failed_wr_p; + ib_recv_wr_t recv_wr, *failed_wr_p; ib_local_ds_t ds_array[DAPL_DEFAULT_DS_ENTRIES], *ds_array_p; DAT_COUNT i, total_len; @@ -64,31 +64,30 @@ dapls_ib_post_recv ( { ds_array_p = dapl_os_alloc( num_segments * sizeof(ib_local_ds_t) ); } - recv_wr.ds_array = ds_array_p; + recv_wr.ds_array = ds_array_p; if (NULL == ds_array_p) { return (DAT_INSUFFICIENT_RESOURCES); } - total_len = 0; + total_len = 0; for (i = 0; i < num_segments; i++, ds_array_p++) { - ds_array_p->length = (uint32_t)local_iov[i].segment_length; - ds_array_p->lkey = local_iov[i].lmr_context; - ds_array_p->vaddr = local_iov[i].virtual_address; - total_len += ds_array_p->length; + ds_array_p->length = (uint32_t)local_iov[i].segment_length; + ds_array_p->lkey = local_iov[i].lmr_context; + ds_array_p->vaddr = local_iov[i].virtual_address; + total_len += ds_array_p->length; } if (cookie != NULL) { - cookie->val.dto.size = total_len; - - dapl_dbg_log (DAPL_DBG_TYPE_EP, "--> DsPR: EP = %p QP = %p cookie= %p, num_seg= %d\n", - ep_ptr, ep_ptr->qp_handle, cookie, num_segments); + cookie->val.dto.size = total_len; + dapl_dbg_log (DAPL_DBG_TYPE_EP, + "--> DsPR: EP = %p QP = %p cookie= %p, num_seg= %d\n", + ep_ptr, ep_ptr->qp_handle, cookie, num_segments); } - recv_wr.p_next = NULL; ib_status = ib_post_recv( ep_ptr->qp_handle, &recv_wr, &failed_wr_p ); @@ -98,21 +97,19 @@ dapls_ib_post_recv ( if (IB_SUCCESS == ib_status) { - return DAT_SUCCESS; + 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); - ep_ptr->qp_state = IB_QPS_ERROR; + dapl_dbg_log (DAPL_DBG_TYPE_DTO_COMP_ERR, + "--> DsPR: post_recv status %s\n", + ib_get_err_str(ib_status)); + /* + * Moving QP to error state; + */ + (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)); - } } @@ -123,15 +120,15 @@ dapls_ib_post_recv ( */ 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 num_segments, - IN DAT_LMR_TRIPLET *local_iov, - IN const DAT_RMR_TRIPLET *remote_iov, - IN DAT_COMPLETION_FLAGS completion_flags) + IN DAPL_EP *ep_ptr, + IN ib_send_op_type_t op_type, + IN DAPL_COOKIE *cookie, + IN DAT_COUNT num_segments, + IN DAT_LMR_TRIPLET *local_iov, + IN const DAT_RMR_TRIPLET *remote_iov, + IN DAT_COMPLETION_FLAGS completion_flags ) { - ib_api_status_t ib_status; + ib_api_status_t ib_status; ib_send_wr_t send_wr, *failed_wr_p; ib_local_ds_t ds_array[DAPL_DEFAULT_DS_ENTRIES], *ds_array_p; DAT_COUNT i, total_len; @@ -139,14 +136,17 @@ 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 QP_state=%d\n", + dapl_dbg_log (DAPL_DBG_TYPE_ERR, + "--> DsPS: !CONN EP (%p) ep_state=%d QP_state=%d\n", ep_ptr, ep_ptr->param.ep_state, qp_attr.state ); - return ( DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_EP_DISCONNECTED ) ); + return(DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_EP_DISCONNECTED)); } dapl_os_memzero (&send_wr, sizeof(ib_send_wr_t)); + send_wr.wr_type = op_type; send_wr.num_ds = num_segments; @@ -158,35 +158,36 @@ dapls_ib_post_send ( { ds_array_p = dapl_os_alloc( num_segments * sizeof(ib_local_ds_t) ); } - send_wr.ds_array = ds_array_p; + send_wr.ds_array = ds_array_p; if (NULL == ds_array_p) { - return (DAT_INSUFFICIENT_RESOURCES); + return (DAT_INSUFFICIENT_RESOURCES); } - total_len = 0; + total_len = 0; for (i = 0; i < num_segments; i++, ds_array_p++) { - ds_array_p->length = (uint32_t)local_iov[i].segment_length; - ds_array_p->lkey = local_iov[i].lmr_context; - ds_array_p->vaddr = local_iov[i].virtual_address; - total_len += ds_array_p->length; + ds_array_p->length = (uint32_t)local_iov[i].segment_length; + ds_array_p->lkey = local_iov[i].lmr_context; + ds_array_p->vaddr = local_iov[i].virtual_address; + total_len += ds_array_p->length; } + /* NULL cookie is OK if no Completion event is requested */ if (cookie != NULL) { - cookie->val.dto.size = total_len; + dapl_os_assert( cookie->ep == ep_ptr ); + cookie->val.dto.size = total_len; - dapl_dbg_log (DAPL_DBG_TYPE_EP, - "--> DsPS: EVD=%p EP=%p QP=%p type=%d, sg=%d ln=%d, ck=%p 0x" F64x "\n", + dapl_dbg_log (DAPL_DBG_TYPE_EP, "--> DsPS: EVD=%p EP=%p QP=%p type=%d " + "sg=%d ln=%d ck=%p 0x" F64x "\n", ep_ptr->param.request_evd_handle, ep_ptr, ep_ptr->qp_handle, op_type, num_segments, total_len, cookie, cookie->val.dto.cookie.as_64 ); } - - send_wr.wr_id = (DAT_UINT64)cookie; + send_wr.wr_id = (DAT_UINT64)cookie; /* RC for now */ if (total_len > 0) @@ -195,14 +196,14 @@ dapls_ib_post_send ( send_wr.remote_ops.rkey = remote_iov->rmr_context; } - send_wr.send_opt = 0; + send_wr.send_opt = 0; - send_wr.send_opt |= (DAT_COMPLETION_BARRIER_FENCE_FLAG & - completion_flags) ? IB_SEND_OPT_FENCE : 0; - send_wr.send_opt |= (DAT_COMPLETION_SUPPRESS_FLAG & - completion_flags) ? 0 : IB_SEND_OPT_SIGNALED; - send_wr.send_opt |= (DAT_COMPLETION_SOLICITED_WAIT_FLAG & - completion_flags) ? IB_SEND_OPT_SOLICITED : 0; + send_wr.send_opt |= (DAT_COMPLETION_BARRIER_FENCE_FLAG & + completion_flags) ? IB_SEND_OPT_FENCE : 0; + send_wr.send_opt |= (DAT_COMPLETION_SUPPRESS_FLAG & + completion_flags) ? 0 : IB_SEND_OPT_SIGNALED; + send_wr.send_opt |= (DAT_COMPLETION_SOLICITED_WAIT_FLAG & + completion_flags) ? IB_SEND_OPT_SOLICITED : 0; dapl_dbg_log (DAPL_DBG_TYPE_EP, "--> DsPS: EP=%p QP=%p send_opt=0x%x," "rem_addr=%p, rem_rkey=0x%x completion_flags=0x%x\n", @@ -222,21 +223,19 @@ dapls_ib_post_send ( if (IB_SUCCESS == ib_status) { - return DAT_SUCCESS; + return DAT_SUCCESS; } - else - { - dapl_dbg_log (DAPL_DBG_TYPE_EP, "--> DsPS: EP=%p post_send status = %s\n", - ep_ptr, ib_get_err_str(ib_status)); - /* - * Moving QP to error state; - */ - ib_status = dapls_modify_qp_state_to_error ( ep_ptr->qp_handle); - ep_ptr->qp_state = IB_QPS_ERROR; + dapl_dbg_log (DAPL_DBG_TYPE_DTO_COMP_ERR, + "--> DsPS: EP=%p post_send status %s\n", + ep_ptr, ib_get_err_str(ib_status)); + /* + * Moving QP to error state; + */ + (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/trunk/ulp/dapl/dapl/ibal/dapl_ibal_qp.c b/trunk/ulp/dapl/dapl/ibal/dapl_ibal_qp.c index afbe51e0..90db767e 100644 --- a/trunk/ulp/dapl/dapl/ibal/dapl_ibal_qp.c +++ b/trunk/ulp/dapl/dapl/ibal/dapl_ibal_qp.c @@ -541,7 +541,7 @@ dapls_modify_qp_state_to_rtr ( qp_mod.state.rtr.rq_psn = DAPL_IBAL_START_PSN; qp_mod.state.rtr.dest_qp = dest_qp; qp_mod.state.rtr.resp_res = 7; - qp_mod.state.rtr.rnr_nak_timeout = 7; + qp_mod.state.rtr.rnr_nak_timeout = IB_RNR_NAK_TIMEOUT; qp_mod.state.rtr.primary_av.sl = 0; qp_mod.state.rtr.primary_av.dlid = dest_lid; qp_mod.state.rtr.primary_av.port_num = p_port->p_attr->port_num; @@ -549,7 +549,7 @@ dapls_modify_qp_state_to_rtr ( qp_mod.state.rtr.primary_av.path_bits = 0; qp_mod.state.rtr.primary_av.static_rate = IB_PATH_RECORD_RATE_10_GBS; qp_mod.state.rtr.primary_av.conn.path_mtu = p_port->p_attr->mtu; - 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.primary_av.conn.local_ack_timeout = 7; qp_mod.state.rtr.primary_av.conn.seq_err_retry_cnt = 7; @@ -575,8 +575,9 @@ dapls_modify_qp_state_to_rts ( 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_nak_timeout = 7; + /* see dapl_ibal_util.h for IB_RNR_XXX */ + qp_mod.state.rts.rnr_retry_cnt = IB_RNR_RETRY_CNT; + qp_mod.state.rts.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/trunk/ulp/dapl/dapl/ibal/dapl_ibal_util.h b/trunk/ulp/dapl/dapl/ibal/dapl_ibal_util.h index 337748f1..a0c3e803 100644 --- a/trunk/ulp/dapl/dapl/ibal/dapl_ibal_util.h +++ b/trunk/ulp/dapl/dapl/ibal/dapl_ibal_util.h @@ -35,8 +35,8 @@ dapl_ib_status_convert ( * Typedefs to map IBAL types to more generic 'ib' types */ typedef ib_net64_t IB_HCA_NAME; -typedef ib_listen_handle_t ib_cm_srvc_handle_t ; -typedef ib_ca_handle_t ib_hca_handle_t; +typedef ib_listen_handle_t ib_cm_srvc_handle_t; +typedef ib_ca_handle_t ib_hca_handle_t; typedef DAT_PVOID ib_cqd_handle_t; typedef ib_async_event_rec_t ib_error_record_t; typedef ib_wr_type_t ib_send_op_type_t; @@ -102,6 +102,32 @@ 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 ); @@ -366,7 +392,6 @@ extern ib_api_status_t dapls_modify_qp_state_to_rts ( ib_qp_handle_t); - extern void dapli_ibal_ca_async_error_callback( IN ib_async_event_rec_t* p_err_rec ); diff --git a/trunk/ulp/dapl/test/udapl/dapltest/SOURCES b/trunk/ulp/dapl/test/udapl/dapltest/SOURCES index 4c563272..58285780 100644 --- a/trunk/ulp/dapl/test/udapl/dapltest/SOURCES +++ b/trunk/ulp/dapl/test/udapl/dapltest/SOURCES @@ -1,4 +1,8 @@ +!if $(FREEBUILD) TARGETNAME=dapltest +!else +TARGETNAME=dapltestd +!endif TARGETPATH=..\..\..\..\..\bin\user\obj$(BUILD_ALT_DIR) TARGETTYPE=PROGRAM UMTYPE=console @@ -54,10 +58,12 @@ RCOPTIONS=/I..\..\..\..\..\inc; USER_C_FLAGS=$(USER_C_FLAGS) -DDYNAMIC_DAT_LOADING !if $(FREEBUILD) USER_C_FLAGS=$(USER_C_FLAGS) -DDAT_DLL_NAME=\"dat.dll\" +DATLIB=dat.lib !else USER_C_FLAGS=$(USER_C_FLAGS) -DDAT_DLL_NAME=\"datd.dll\" +DATLIB=datd.lib !endif -TARGETLIBS=$(SDK_LIB_PATH)\ws2_32.lib +TARGETLIBS=$(TARGETPATH)\*\$(DATLIB) $(SDK_LIB_PATH)\ws2_32.lib MSC_WARNING_LEVEL= /W3 diff --git a/trunk/ulp/dapl/test/udapl/dapltest/dapltest.rc b/trunk/ulp/dapl/test/udapl/dapltest/dapltest.rc index cf5770bc..230df9f7 100644 --- a/trunk/ulp/dapl/test/udapl/dapltest/dapltest.rc +++ b/trunk/ulp/dapl/test/udapl/dapltest/dapltest.rc @@ -32,16 +32,18 @@ #include -#define VER_FILETYPE VFT_APP -#define VER_FILESUBTYPE VFT2_UNKNOWN +#define VER_FILETYPE VFT_APP +#define VER_FILESUBTYPE VFT2_UNKNOWN #if DBG -#define VER_FILEDESCRIPTION_STR "DAPL/DAT[1.1] test Application (Debug)" +#define VER_FILEDESCRIPTION_STR "DAPL/DAT[1.1] test application (Debug)" +#define VER_INTERNALNAME_STR "dapltestd.exe" +#define VER_ORIGINALFILENAME_STR "dapltestd.exe" #else -#define VER_FILEDESCRIPTION_STR "DAPL/DAT[1.1] test Application" -#endif - +#define VER_FILEDESCRIPTION_STR "DAPL/DAT[1.1] test application" #define VER_INTERNALNAME_STR "dapltest.exe" #define VER_ORIGINALFILENAME_STR "dapltest.exe" +#endif #include + -- 2.41.0