From: ftillier Date: Fri, 24 Feb 2006 01:22:47 +0000 (+0000) Subject: [IPoIB] Abort broadcast MC group join if port rate is lower than X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=640db273b7c607551b0e53437d42639a854641e1;p=~shefty%2Frdma-win.git [IPoIB] Abort broadcast MC group join if port rate is lower than existing broadcast group and log an event to the system log. Also expanded error logging to the system log. git-svn-id: svn://openib.tc.cornell.edu/gen1@219 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- diff --git a/trunk/ulp/ipoib/kernel/ipoib_log.mc b/trunk/ulp/ipoib/kernel/ipoib_log.mc index 7f7c8a81..9676ff29 100644 --- a/trunk/ulp/ipoib/kernel/ipoib_log.mc +++ b/trunk/ulp/ipoib/kernel/ipoib_log.mc @@ -128,3 +128,158 @@ Language=English %2: Driver Initialized succesfully. . +MessageId=0x0041 +Facility=IPoIB +Severity=Error +SymbolicName=EVENT_IPOIB_OPEN_CA +Language=English +%2: Failed to open Channel Adapter. +. + +MessageId=0x0042 +Facility=IPoIB +Severity=Error +SymbolicName=EVENT_IPOIB_ALLOC_PD +Language=English +%2: Failed to allocate Protection Domain. +. + +MessageId=0x0043 +Facility=IPoIB +Severity=Error +SymbolicName=EVENT_IPOIB_CREATE_RECV_CQ +Language=English +%2: Failed to create receive Completion Queue. +. + +MessageId=0x0044 +Facility=IPoIB +Severity=Error +SymbolicName=EVENT_IPOIB_CREATE_SEND_CQ +Language=English +%2: Failed to create send Completion Queue. +. + +MessageId=0x0045 +Facility=IPoIB +Severity=Error +SymbolicName=EVENT_IPOIB_CREATE_QP +Language=English +%2: Failed to create Queue Pair. +. + +MessageId=0x0046 +Facility=IPoIB +Severity=Error +SymbolicName=EVENT_IPOIB_QUERY_QP +Language=English +%2: Failed to get Queue Pair number. +. + +MessageId=0x0047 +Facility=IPoIB +Severity=Error +SymbolicName=EVENT_IPOIB_REG_PHYS +Language=English +%2: Failed to create DMA Memory Region. +. + +MessageId=0x0048 +Facility=IPoIB +Severity=Error +SymbolicName=EVENT_IPOIB_RECV_POOL +Language=English +%2: Failed to create receive descriptor pool. +. + +MessageId=0x0049 +Facility=IPoIB +Severity=Error +SymbolicName=EVENT_IPOIB_RECV_PKT_POOL +Language=English +%2: Failed to create NDIS_PACKET pool for receive indications. +. + +MessageId=0x004A +Facility=IPoIB +Severity=Error +SymbolicName=EVENT_IPOIB_RECV_BUF_POOL +Language=English +%2: Failed to create NDIS_BUFFER pool for receive indications. +. + +MessageId=0x004B +Facility=IPoIB +Severity=Error +SymbolicName=EVENT_IPOIB_SEND_PKT_POOL +Language=English +%2: Failed to create NDIS_PACKET pool for send processing. +. + +MessageId=0x004C +Facility=IPoIB +Severity=Error +SymbolicName=EVENT_IPOIB_SEND_BUF_POOL +Language=English +%2: Failed to create NDIS_BUFFER pool for send processing. +. + +MessageId=0x004D +Facility=IPoIB +Severity=Error +SymbolicName=EVENT_IPOIB_RECV_PKT_ARRAY +Language=English +%2: Failed to allocate receive indication array. +. + +MessageId=0x004E +Facility=IPoIB +Severity=Error +SymbolicName=EVENT_IPOIB_PORT_INFO_TIMEOUT +Language=English +%2: Subnet Administrator query for port information timed out. +Make sure the SA is functioning properly. Increasing the number +of retries and retry timeout adapter parameters may solve the +issue. +. + +MessageId=0x004F +Facility=IPoIB +Severity=Error +SymbolicName=EVENT_IPOIB_PORT_INFO_REJECT +Language=English +%2: Subnet Administrator failed the query for port information. +Make sure the SA is functioning properly and compatible. +. + +MessageId=0x0050 +Facility=IPoIB +Severity=Error +SymbolicName=EVENT_IPOIB_QUERY_PORT_INFO +Language=English +%2: Subnet Administrator query for port information failed. +. + +MessageId=0x0055 +Facility=IPoIB +Severity=Error +SymbolicName=EVENT_IPOIB_BCAST_GET +Language=English +%2: Subnet Administrator failed query for broadcast group information. +. + +MessageId=0x0056 +Facility=IPoIB +Severity=Error +SymbolicName=EVENT_IPOIB_BCAST_JOIN +Language=English +%2: Subnet Administrator failed request to joing broadcast group. +. + +MessageId=0x0057 +Facility=IPoIB +Severity=Error +SymbolicName=EVENT_IPOIB_BCAST_RATE +Language=English +%2: The local port rate is too slow for the existing broadcast MC group. +. diff --git a/trunk/ulp/ipoib/kernel/ipoib_port.c b/trunk/ulp/ipoib/kernel/ipoib_port.c index 756cc9a1..54f905c8 100644 --- a/trunk/ulp/ipoib/kernel/ipoib_port.c +++ b/trunk/ulp/ipoib/kernel/ipoib_port.c @@ -48,7 +48,7 @@ * request that specifies an MGID. The ESM returns every McMemberRecord * instead. */ -#define PR_102801 +//#define PR_102801 /* Amount of physical memory to register. */ @@ -132,6 +132,12 @@ static ib_api_status_t __ib_mgr_activate( IN ipoib_port_t* const p_port ); +static void +__ib_mgr_set_rate( + IN ipoib_port_t* const p_port, + IN const uint8_t link_width, + IN const uint8_t link_speed ); + /****************************************************************************** * * Buffer manager operations. @@ -747,6 +753,8 @@ __ib_mgr_init( NULL, p_port, &p_port->ib_mgr.h_ca ); if( status != IB_SUCCESS ) { + NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, + EVENT_IPOIB_OPEN_CA, 1, status ); IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR, ("ib_open_ca returned %s\n", p_port->p_adapter->p_ifc->get_err_str( status )) ); @@ -758,6 +766,8 @@ __ib_mgr_init( p_port->ib_mgr.h_ca, IB_PDT_UD, p_port, &p_port->ib_mgr.h_pd ); if( status != IB_SUCCESS ) { + NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, + EVENT_IPOIB_ALLOC_PD, 1, status ); IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR, ("ib_alloc_pd returned %s\n", p_port->p_adapter->p_ifc->get_err_str( status )) ); @@ -774,6 +784,8 @@ __ib_mgr_init( __cq_event, &p_port->ib_mgr.h_recv_cq ); if( status != IB_SUCCESS ) { + NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, + EVENT_IPOIB_CREATE_RECV_CQ, 1, status ); IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR, ("ib_create_cq returned %s.\n", p_port->p_adapter->p_ifc->get_err_str( status )) ); @@ -789,6 +801,8 @@ __ib_mgr_init( __cq_event, &p_port->ib_mgr.h_send_cq ); if( status != IB_SUCCESS ) { + NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, + EVENT_IPOIB_CREATE_SEND_CQ, 1, status ); IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR, ("ib_create_cq returned %s.\n", p_port->p_adapter->p_ifc->get_err_str( status )) ); @@ -811,6 +825,8 @@ __ib_mgr_init( __qp_event, &p_port->ib_mgr.h_qp ); if( status != IB_SUCCESS ) { + NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, + EVENT_IPOIB_CREATE_QP, 1, status ); IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR, ("ib_create_qp returned %s\n", p_port->p_adapter->p_ifc->get_err_str( status )) ); @@ -821,6 +837,8 @@ __ib_mgr_init( p_port->ib_mgr.h_qp, &qp_attr ); if( status != IB_SUCCESS ) { + NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, + EVENT_IPOIB_QUERY_QP, 1, status ); IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR, ("ib_query_qp returned %s\n", p_port->p_adapter->p_ifc->get_err_str( status )) ); @@ -843,6 +861,8 @@ __ib_mgr_init( &p_port->ib_mgr.lkey, &rkey, &p_port->ib_mgr.h_mr ); if( status != IB_SUCCESS ) { + NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, + EVENT_IPOIB_REG_PHYS, 1, status ); IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR, ("ib_reg_phys returned %s\n", p_port->p_adapter->p_ifc->get_err_str( status )) ); @@ -926,6 +946,8 @@ __buf_mgr_init( #endif /* IPOIB_INLINE_RECV */ if( cl_status != CL_SUCCESS ) { + NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, + EVENT_IPOIB_RECV_POOL, 1, cl_status ); IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR, ("cl_qpool_init for recvs returned %s\n", cl_status_text[cl_status]) ); @@ -937,6 +959,8 @@ __buf_mgr_init( p_params->rq_depth, PROTOCOL_RESERVED_SIZE_IN_PACKET ); if( ndis_status != NDIS_STATUS_SUCCESS ) { + NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, + EVENT_IPOIB_RECV_PKT_POOL, 1, ndis_status ); IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR, ("NdisAllocatePacketPool returned %08X\n", ndis_status) ); return IB_INSUFFICIENT_RESOURCES; @@ -946,6 +970,8 @@ __buf_mgr_init( p_params->rq_depth ); if( ndis_status != NDIS_STATUS_SUCCESS ) { + NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, + EVENT_IPOIB_RECV_BUF_POOL, 1, ndis_status ); IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR, ("NdisAllocateBufferPool returned %08X\n", ndis_status) ); return IB_INSUFFICIENT_RESOURCES; @@ -956,6 +982,8 @@ __buf_mgr_init( 1, PROTOCOL_RESERVED_SIZE_IN_PACKET ); if( ndis_status != NDIS_STATUS_SUCCESS ) { + NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, + EVENT_IPOIB_SEND_PKT_POOL, 1, ndis_status ); IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR, ("NdisAllocatePacketPool returned %08X\n", ndis_status) ); return IB_INSUFFICIENT_RESOURCES; @@ -965,6 +993,8 @@ __buf_mgr_init( &p_port->buf_mgr.h_send_buf_pool, 1 ); if( ndis_status != NDIS_STATUS_SUCCESS ) { + NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, + EVENT_IPOIB_SEND_BUF_POOL, 1, ndis_status ); IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR, ("NdisAllocateBufferPool returned %08X\n", ndis_status) ); return IB_INSUFFICIENT_RESOURCES; @@ -1249,6 +1279,8 @@ __recv_mgr_init( sizeof(NDIS_PACKET*) * p_port->p_adapter->params.rq_depth ); if( !p_port->recv_mgr.recv_pkt_array ) { + NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, + EVENT_IPOIB_RECV_PKT_ARRAY, 0 ); IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR, ("cl_malloc for PNDIS_PACKET array failed.\n") ); return IB_INSUFFICIENT_MEMORY; @@ -4436,7 +4468,7 @@ __port_info_cb( ("Received port info: link width = %d.\n", p_port_rec->port_info.link_width_active) ); - ipoib_set_rate( p_port->p_adapter, + __ib_mgr_set_rate( p_port, p_port_rec->port_info.link_width_active, ib_port_info_get_link_speed_active( &p_port_rec->port_info ) ); @@ -4455,9 +4487,22 @@ __port_info_cb( ("Instance destroying - Aborting.\n") ); break; + case IB_TIMEOUT: + NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, + EVENT_IPOIB_PORT_INFO_TIMEOUT, 0 ); + IPOIB_TRACE( IPOIB_DBG_INFO, ("Port info query timed out.\n") ); + break; + + case IB_REMOTE_ERROR: + NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, + EVENT_IPOIB_PORT_INFO_REJECT, 0 ); + IPOIB_TRACE( IPOIB_DBG_INFO, ("Port info query rejected by SA.\n") ); + break; + default: - /* Flag the adapter as hung. */ - p_port->p_adapter->hung = TRUE; + NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, + EVENT_IPOIB_QUERY_PORT_INFO, 1, p_query_rec->status ); + /* Hopefully we'll get an SM change event that will restart things. */ IPOIB_TRACE( IPOIB_DBG_INFO, ("Port info query failed.\n") ); } @@ -4483,7 +4528,7 @@ __port_get_mcast( IPOIB_ENTER( IPOIB_DBG_MCAST ); - info.method = IB_MAD_METHOD_GETTABLE; + info.method = IB_MAD_METHOD_GET; info.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD; info.attr_size = sizeof(ib_member_rec_t); info.comp_mask = IB_MCR_COMPMASK_MGID; @@ -4583,6 +4628,8 @@ __bcast_get_cb( IPOIB_TRACE( IPOIB_DBG_INIT, ("Instance destroying - Aborting.\n") ); default: + NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, + EVENT_IPOIB_BCAST_GET, 1, p_query_rec->status ); /* Flag the adapter as hung. */ p_port->p_adapter->hung = TRUE; } @@ -4608,6 +4655,22 @@ __port_join_bcast( IPOIB_ENTER( IPOIB_DBG_MCAST ); + /* Check that the rate is realizable for our port. */ + if( p_port->ib_mgr.rate < (p_member_rec->rate & 0x3F) ) + { + /* + * The MC group rate is higher than our port's rate. Log an error + * and stop. A port transition will drive the retry. + */ + IPOIB_TRACE( IPOIB_DBG_WARN, + ("Unrealizable join due to rate mismatch.\n") ); + NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, + EVENT_IPOIB_BCAST_RATE, 2, + (uint32_t)(p_member_rec->rate & 0x3F), + (uint32_t)p_port->ib_mgr.rate ); + return; + } + /* Join the broadcast group. */ cl_memclr( &mcast_req, sizeof(mcast_req) ); /* Copy the results of the Get to use as parameters. */ @@ -4729,7 +4792,7 @@ ipoib_port_down( p_port->state = IB_QPS_ERROR; NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, - EVENT_IPOIB_PORT_DOWN, 0); + EVENT_IPOIB_PORT_DOWN, 0 ); if( p_port->ib_mgr.h_query ) { @@ -4810,6 +4873,8 @@ __bcast_cb( } else { + NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, + EVENT_IPOIB_BCAST_JOIN, 1, p_mcast_rec->status ); /* Flag the adapter as hung. */ p_port->p_adapter->hung = TRUE; } @@ -4943,6 +5008,60 @@ __ib_mgr_activate( return IB_SUCCESS; } +static void +__ib_mgr_set_rate( + IN ipoib_port_t* const p_port, + IN const uint8_t link_width, + IN const uint8_t link_speed ) +{ + IPOIB_ENTER( IPOIB_DBG_INIT ); + + /* Set the link speed based on the IB link speed (1x vs 4x, etc). */ + switch( link_width * link_width * link_speed ) + { + case 1: + p_port->ib_mgr.rate = IB_PATH_RECORD_RATE_2_5_GBS; + break; + + case 2: + p_port->ib_mgr.rate = IB_PATH_RECORD_RATE_5_GBS; + break; + + case 4: + p_port->ib_mgr.rate = IB_PATH_RECORD_RATE_10_GBS; + break; + + case 8: + p_port->ib_mgr.rate = IB_PATH_RECORD_RATE_20_GBS; + break; + + case 16: + p_port->ib_mgr.rate = IB_PATH_RECORD_RATE_40_GBS; + break; + + case 64: + p_port->ib_mgr.rate = IB_PATH_RECORD_RATE_30_GBS; + break; + + case 128: + p_port->ib_mgr.rate = IB_PATH_RECORD_RATE_60_GBS; + break; + + case 256: + p_port->ib_mgr.rate = IB_PATH_RECORD_RATE_120_GBS; + break; + + default: + IPOIB_TRACE( IPOIB_DBG_ERROR, + ("Invalid link rate (%d).\n", link_width) ); + p_port->ib_mgr.rate = 0; + } + + ipoib_set_rate( p_port->p_adapter, link_width, link_speed ); + + IPOIB_EXIT( IPOIB_DBG_INIT ); +} + /* Transition to a passive level thread. */ ib_api_status_t diff --git a/trunk/ulp/ipoib/kernel/ipoib_port.h b/trunk/ulp/ipoib/kernel/ipoib_port.h index 8d78ce69..c9c8cc4e 100644 --- a/trunk/ulp/ipoib/kernel/ipoib_port.h +++ b/trunk/ulp/ipoib/kernel/ipoib_port.h @@ -90,6 +90,7 @@ typedef struct _ipoib_ib_mgr ib_mr_handle_t h_mr; net32_t lkey; + uint8_t rate; ib_member_rec_t bcast_rec; } ipoib_ib_mgr_t;