From d5a0aaf4be1d22f497b340a8925b237587b9d1bb Mon Sep 17 00:00:00 2001 From: sleybo Date: Mon, 19 Feb 2007 15:41:15 +0000 Subject: [PATCH] [IPOIB] bug fix: free pending list in ipoib_port_down check the port state in port_send and port_resume git-svn-id: svn://openib.tc.cornell.edu/gen1@596 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- trunk/ulp/ipoib/kernel/ipoib_port.c | 62 ++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 10 deletions(-) diff --git a/trunk/ulp/ipoib/kernel/ipoib_port.c b/trunk/ulp/ipoib/kernel/ipoib_port.c index 29b299a7..25a37016 100644 --- a/trunk/ulp/ipoib/kernel/ipoib_port.c +++ b/trunk/ulp/ipoib/kernel/ipoib_port.c @@ -2625,15 +2625,14 @@ __send_mgr_construct( } -static void -__send_mgr_destroy( +static void +__pending_list_destroy( IN ipoib_port_t* const p_port ) { cl_list_item_t *p_item; NDIS_PACKET *p_packet; - - IPOIB_ENTER( IPOIB_DBG_SEND ); - + + cl_spinlock_acquire( &p_port->send_lock ); /* Complete any pending packets. */ for( p_item = cl_qlist_remove_head( &p_port->send_mgr.pending_list ); p_item != cl_qlist_end( &p_port->send_mgr.pending_list ); @@ -2643,6 +2642,15 @@ __send_mgr_destroy( NdisMSendComplete( p_port->p_adapter->h_adapter, p_packet, NDIS_STATUS_RESET_IN_PROGRESS ); } + cl_spinlock_release( &p_port->send_lock ); +} + +static void +__send_mgr_destroy( + IN ipoib_port_t* const p_port ) +{ + IPOIB_ENTER( IPOIB_DBG_SEND ); + __pending_list_destroy(p_port); IPOIB_EXIT( IPOIB_DBG_SEND ); } @@ -3633,6 +3641,27 @@ ipoib_port_send( IPOIB_ENTER( IPOIB_DBG_SEND ); + + cl_obj_lock( &p_port->obj ); + if( p_port->state != IB_QPS_RTS ) + { + cl_obj_unlock( &p_port->obj ); + for( i = 0; i < num_packets; ++i ) + { + ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 ); + /* Complete the packet. */ + NdisMSendComplete( p_port->p_adapter->h_adapter, + p_packet_array[i], NDIS_STATUS_ADAPTER_NOT_READY ); + + } + + IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND, + ("Invalid state - Aborting.\n") ); + return; + } + cl_obj_unlock( &p_port->obj ); + + cl_spinlock_acquire( &p_port->send_lock ); for( i = 0; i < num_packets; i++ ) { @@ -3736,6 +3765,17 @@ ipoib_port_resume( IPOIB_ENTER( IPOIB_DBG_SEND ); + + cl_obj_lock( &p_port->obj ); + if( p_port->state != IB_QPS_RTS ) + { + IPOIB_PRINT_EXIT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND, + ("Invalid state - Aborting.\n") ); + cl_obj_unlock( &p_port->obj ); + return; + } + cl_obj_unlock( &p_port->obj ); + cl_spinlock_acquire( &p_port->send_lock ); for( p_item = cl_qlist_head( &p_port->send_mgr.pending_list ); @@ -3745,7 +3785,7 @@ ipoib_port_resume( /* Check the send queue and pend the request if not empty. */ if( p_port->send_mgr.depth == p_port->p_adapter->params.sq_depth ) { - IPOIB_PRINT_EXIT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND, + IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND, ("No available WQEs.\n") ); break; } @@ -4130,7 +4170,7 @@ __endpt_mgr_reset_all( KeSetEvent( &p_port->leave_mcast_event, EVENT_INCREMENT, FALSE ); } - IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,("p_port->mcast_cnt = %d\n", p_port->mcast_cnt - local_exist)); + IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("p_port->mcast_cnt = %d\n", p_port->mcast_cnt - local_exist)); /* Destroy all multicast endpoints now that we have released the lock. */ while( cl_qlist_count( &mc_list ) ) @@ -5138,6 +5178,8 @@ ipoib_port_down( KeWaitForSingleObject( &p_port->leave_mcast_event, Executive, KernelMode, FALSE, NULL ); + + __pending_list_destroy(p_port); cl_obj_lock( &p_port->p_adapter->obj ); ipoib_dereg_addrs( p_port->p_adapter ); @@ -5579,7 +5621,7 @@ ipoib_leave_mcast_cb( p_port = (ipoib_port_t* __ptr64)context; - IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,("p_port->mcast_cnt = %d\n", p_port->mcast_cnt)); + IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_MCAST,("p_port->mcast_cnt = %d\n", p_port->mcast_cnt)); ipoib_port_deref( p_port, ref_leave_mcast); cl_atomic_dec( &p_port->mcast_cnt); @@ -5590,7 +5632,7 @@ ipoib_leave_mcast_cb( } IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, - ("Leav mcast callback deref ipoib_port \n") ); + ("Leave mcast callback deref ipoib_port \n") ); IPOIB_EXIT( IPOIB_DBG_MCAST ); } @@ -5609,7 +5651,7 @@ __leave_error_mcast_cb( ipoib_port_deref( p_port, ref_leave_mcast); IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, - ("Leav mcast callback deref ipoib_port \n") ); + ("Leave mcast callback deref ipoib_port \n") ); IPOIB_EXIT( IPOIB_DBG_MCAST ); } -- 2.41.0