Tzachi Dar wrote: > Please use TortoiseSVN to apply the patch. Thank you Tzachi. Your patches applied with no problems using TortoiseSVN.
stan. > > Thanks > Tzachi > >> -----Original Message----- >> From: [email protected] >> [mailto:[email protected]] On Behalf Of Smith, Stan >> Sent: Wednesday, February 03, 2010 7:21 PM >> To: Alex Naslednikov; [email protected] >> Subject: Re: [ofw] WWG 1-26-10 minutes - WinOF 2.2 release >> status [PATCH] [IPoIB_NDIS6_CM] >> >> >> Patches do not correctly apply against >> trunk\ulp\ipoib_ndis6_cm or branches\WOF2-2\ulp\ipoib_ndis6_cm. >> I tried applying patches by hand and things got UGLY very quickly. >> >> Please supply patches generated against >> trunk\ulp\ipoib_ndis6_cm\ ASAP as today is my last day at >> work until 2/15. >> >> thank you, >> >> Stan. >> >> Alex Naslednikov wrote: >>> Stan, >>> The patch was revisited. >>> For your covnenience, I am resending it again with the new changes. >>> In spite of the fact that the patch was tested with WHQL NDIS 6.5 >>> MPE test, I highly recommend to run independent test cycle. >>> >>> Index: >>> >> D:/windows/MLNX_WinOF_trunk/ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.cp >>> p >> =================================================================== >>> --- >>> >> D:/windows/MLNX_WinOF_trunk/ulp/ipoib_NDIS6_CM/kernel/ipoib_ad >> apter.cpp >>> (revision 5504) +++ >>> >>> >>> >> D:/windows/MLNX_WinOF_trunk/ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.cp >>> p (revision 5529) @@ -392,6 +392,13 @@ >>> p_adapter->p_ifc->get_err_str( status )) ); return status; } + + + >>> IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, + >>> ("Shutter Init, state = %d\n", p_adapter->ipoib_state) ); + >>> IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV, + >>> ("Shutter Init, state = %d\n", p_adapter->ipoib_state) ); + >>> shutter_init( &p_adapter->recv_shutter ); >>> >>> IPOIB_EXIT( IPOIB_DBG_INIT ); >>> return status; >>> Index: >>> D:/windows/MLNX_WinOF_trunk/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp >>> =================================================================== >>> --- >>> D:/windows/MLNX_WinOF_trunk/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp >>> (revision 5504) +++ >>> >>> >> D:/windows/MLNX_WinOF_trunk/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp >>> (revision 5529) @@ -824,7 +824,21 @@ IPOIB_PRINT( TRACE_LEVEL_ERROR, >>> IPOIB_DBG_OBJ, ("ref type %d ref_cnt %d\n", ref_init, >>> p_port->obj.ref_cnt) ); #endif - + // The port is started as >>> paused and NDIS calls latter to ipoib_restart. We + // shut the >>> recv_shuter for now and alive it on ipoib_restart. + // + >>> + if ( p_adapter->ipoib_state == IPOIB_INIT) { >>> + IPOIB_PRINT( TRACE_LEVEL_INFORMATION, >>> IPOIB_DBG_RECV, + ("Shutter shut, state = %d\n", >>> p_adapter->ipoib_state)); + shutter_shut ( >>> &p_adapter->recv_shutter ); + } >>> + else { >>> + IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_RECV, >>> + ("*****Shutter wasn't shut, state = %d*****\n", >>> p_adapter->ipoib_state)); + } >>> IPOIB_EXIT( IPOIB_DBG_INIT ); >>> return IB_SUCCESS; >>> } >>> @@ -1843,45 +1857,28 @@ >>> return p_port->p_adapter->params.rq_low_watermark - >>> p_port->recv_mgr.depth; } >>> >>> -void >>> -ipoib_return_net_buffer_list( >>> - IN NDIS_HANDLE adapter_context, >>> - IN NET_BUFFER_LIST >>> *p_net_buffer_lists, >>> - IN ULONG >>> return_flags) +inline ULONG __free_received_NBL ( >>> + IN ipoib_port_t *p_port, >>> + IN NET_BUFFER_LIST *p_net_buffer_lists + ) >>> { >>> - ipoib_port_t *p_port; >>> + >>> ipoib_recv_desc_t *p_desc; >>> - NET_BUFFER_LIST >>> *cur_net_buffer_list,*next_net_buffer_list; >>> - int32_t shortage; >>> + NET_BUFFER_LIST *cur_net_buffer_list, >>> *next_net_buffer_list; + LONG >>> NBL_cnt = 0; + >>> >>> - PERF_DECLARE( ReturnPacket ); >>> - PERF_DECLARE( ReturnPutRecv ); >>> - PERF_DECLARE( ReturnRepostRecv ); >>> - PERF_DECLARE( ReturnPreparePkt ); >>> - PERF_DECLARE( ReturnNdisIndicate ); >>> - >>> - IPOIB_ENTER( IPOIB_DBG_RECV ); >>> - >>> - UNUSED_PARAM( return_flags ); >>> - >>> - p_port = ((ipoib_adapter_t*)adapter_context)->p_port; >>> - CL_ASSERT( p_net_buffer_lists ); >>> - >>> - cl_perf_start( ReturnPacket ); >>> - cl_spinlock_acquire( &p_port->recv_lock ); >>> for (cur_net_buffer_list = p_net_buffer_lists; >>> cur_net_buffer_list != NULL; >>> cur_net_buffer_list = next_net_buffer_list) >>> { + ++NBL_cnt; >>> next_net_buffer_list = >>> NET_BUFFER_LIST_NEXT_NBL(cur_net_buffer_list); >>> >>> /* Get the port and descriptor from the >>> NET_BUFFER_LIST. */ CL_ASSERT(p_port == >>> IPOIB_PORT_FROM_NBL( cur_net_buffer_list )); p_desc >>> = IPOIB_RECV_FROM_NBL( cur_net_buffer_list ); - >>> >>> - //TODO: NDIS60, rewrite this block >>> - >>> #if 0 //TODO CM flow >>> if( p_desc->type == PKT_TYPE_CM_UCAST ) >>> { @@ -1916,9 +1913,44 @@ >>> __buf_mgr_put_recv( p_port, p_desc, >>> cur_net_buffer_list ); cl_perf_stop( >>> &p_port->p_adapter->perf, ReturnPutRecv ); } + return >>> NBL_cnt; +} >>> >>> +void >>> +ipoib_return_net_buffer_list( >>> + IN NDIS_HANDLE >>> adapter_context, + IN NET_BUFFER_LIST >>> *p_net_buffer_lists, + >>> IN ULONG >>> return_flags) +{ + ipoib_port_t *p_port; >>> + int32_t shortage; >>> + LONG NBL_cnt = 0; + >>> + PERF_DECLARE( ReturnPacket ); >>> + PERF_DECLARE( ReturnPutRecv ); >>> + PERF_DECLARE( ReturnRepostRecv ); >>> + PERF_DECLARE( ReturnPreparePkt ); >>> + PERF_DECLARE( ReturnNdisIndicate ); >>> >>> + IPOIB_ENTER( IPOIB_DBG_RECV ); >>> >>> + UNUSED_PARAM( return_flags ); >>> + >>> + p_port = ((ipoib_adapter_t*)adapter_context)->p_port; >>> + CL_ASSERT( p_net_buffer_lists ); >>> + if ( !p_port ) { >>> + ASSERT(p_port); >>> + IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, >>> IPOIB_DBG_ERROR, + ("return_NBL callback >>> called when port pointer was already cleared\n") ); + >>> return; + } + >>> + cl_perf_start( ReturnPacket ); >>> + cl_spinlock_acquire( &p_port->recv_lock ); >>> + NBL_cnt = __free_received_NBL( p_port, p_net_buffer_lists >>> ); + + shutter_sub( &p_port->p_adapter->recv_shutter, >>> -NBL_cnt ); + /* Repost buffers to HW */ >>> cl_perf_start( ReturnRepostRecv ); >>> shortage = __recv_mgr_repost( p_port ); @@ -1958,6 +1990,7 >>> @@ cl_qlist_t done_list, bad_list; >>> size_t i; >>> ULONG recv_complete_flags = 0; >>> + BOOLEAN res; >>> >>> PERF_DECLARE( RecvCompBundle ); >>> PERF_DECLARE( RecvCb ); >>> @@ -2069,13 +2102,40 @@ >>> >>> cl_perf_start( RecvNdisIndicate ); >>> >>> - NdisMIndicateReceiveNetBufferLists( >>> - p_port->p_adapter->h_adapter, >>> - p_port->recv_mgr.recv_NBL_array[0], >>> - NDIS_DEFAULT_PORT_NUMBER, >>> - NBL_cnt, >>> - recv_complete_flags); >>> + if (shortage <= 0) { >>> >>> + res = shutter_add( >>> &p_port->p_adapter->recv_shutter, NBL_cnt ); + >>> if (res) { + >>> NdisMIndicateReceiveNetBufferLists( + >>> p_port->p_adapter->h_adapter, + >>> p_port->recv_mgr.recv_NBL_array[0], + >>> NDIS_DEFAULT_PORT_NUMBER, + >>> NBL_cnt, + >> recv_complete_flags); >>> + } >>> + else { >>> + __free_received_NBL (p_port, >>> p_port->recv_mgr.recv_NBL_array[0]); + } + >>> + } else { >>> + >>> + // If shortage >0, we already set the status >>> to NDIS_RECEIVE_FLAGS_RESOURCES + // That is, >>> IPoIB driver regain ownership of the NET_BUFFER_LIST structures >>> immediately + res = shutter_add( >>> &p_port->p_adapter->recv_shutter, 1 ); + if >>> (res) { + NdisMIndicateReceiveNetBufferLists( + >>> p_port->p_adapter->h_adapter, + >>> p_port->recv_mgr.recv_NBL_array[0], + >>> NDIS_DEFAULT_PORT_NUMBER, + >>> NBL_cnt, + >>> recv_complete_flags); + shutter_sub( >>> &p_port->p_adapter->recv_shutter, -1 ); + } + >>> + } + >>> + >>> + >>> cl_perf_stop( &p_port->p_adapter->perf, >>> RecvNdisIndicate ); >>> >>> /* >>> @@ -3243,14 +3303,8 @@ >>> { >>> cl_list_item_t *p_item; >>> ipoib_send_NB_SG *s_buf; >>> - ULONG send_complete_flags = 0; >>> + ULONG send_complete_flags = >>> NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL; >>> >>> - if (KeGetCurrentIrql() == DISPATCH_LEVEL) >>> - { >>> - NDIS_SET_SEND_COMPLETE_FLAG(send_complete_flags, >>> NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL); >>> - } >>> - >>> - 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 ); @@ -3260,13 +3314,10 >>> @@ ASSERT(s_buf->p_port == p_port); >>> ASSERT(s_buf->p_nbl); >>> >>> - >>> + //TODO >>> //__send_complete_net_buffer(s_buf, >>> >>> NDIS_STATUS_RESET_IN_PROGRESS,send_complete_flags,TRUE); >>> __send_complete_net_buffer(s_buf, >>> NDIS_STATUS_FAILURE,send_complete_flags,TRUE); } - - >>> - cl_spinlock_release( &p_port->send_lock ); >>> >>> } >>> >>> @@ -3278,7 +3329,9 @@ >>> //Destroy pending list and put all the send buffers back to >>> pool //The list should be already destroyed at this point >>> ASSERT(p_port->send_mgr.pending_list.count == 0); >>> + cl_spinlock_acquire( &p_port->send_lock ); >>> __pending_list_destroy(p_port); >>> + cl_spinlock_release( &p_port->send_lock ); >>> >>> // Now, destroy the send pool >>> cl_qpool_destroy(&p_port->send_mgr.send_pool); @@ -5299,7 >>> +5352,6 @@ //TODO Tzachid: make an assert here to >>> validate your IRQL ASSERT (KeGetCurrentIrql() == >>> DISPATCH_LEVEL); old_irql = DISPATCH_LEVEL; >>> - NDIS_SET_SEND_COMPLETE_FLAG(send_complete_flags, >>> NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL); } else { >>> NDIS_RAISE_IRQL_TO_DISPATCH(&old_irql); >>> //ASSERT (KeGetCurrentIrql() == PASSIVE_LEVEL); // >>> Happens @@ -7158,6 +7210,7 @@ * object lock since that is >>> the order taken when reposting. */ >>> cl_spinlock_acquire( &p_port->recv_lock ); + >>> cl_spinlock_acquire( &p_port->send_lock ); cl_obj_lock( >>> &p_port->obj ); p_port->state = IB_QPS_ERROR; >>> >>> @@ -7172,6 +7225,7 @@ >>> p_port->ib_mgr.h_query = NULL; >>> } >>> cl_obj_unlock( &p_port->obj ); >>> + cl_spinlock_release( &p_port->send_lock ); >>> cl_spinlock_release( &p_port->recv_lock ); >>> >>> KeWaitForSingleObject( >>> @@ -7670,10 +7724,10 @@ >>> IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, >>> IPOIB_DBG_MCAST ,("Invalid state - Aborting.\n") ); >>> IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT >>> ,("Invalid state - Aborting.\n") ); >>> >>> - //cl_spinlock_acquire(&p_port->send_lock); >>> + cl_spinlock_acquire(&p_port->send_lock); >>> //ipoib_port_resume(p_port , FALSE); >>> __pending_list_destroy( p_port ); >>> - //cl_spinlock_release(&p_port->send_lock); >>> + cl_spinlock_release(&p_port->send_lock); >>> return; } >>> >>> Index: >>> >> D:/windows/MLNX_WinOF_trunk/ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.h >>> =================================================================== >>> --- >>> >> D:/windows/MLNX_WinOF_trunk/ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.h >>> (revision 5504) +++ >>> >> D:/windows/MLNX_WinOF_trunk/ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.h >>> (revision 5529) @@ -47,8 +47,10 @@ #include <ip_packet.h> #include >>> "ip_stats.h" #include "ipoib_stat.h" +#include "shutter.h" >>> >>> >>> + >>> /* >>> * Definitions >>> */ >>> @@ -70,6 +72,7 @@ >>> >>> typedef enum _ipoib_state >>> { >>> + IPOIB_INIT = -1, >>> IPOIB_PAUSED, >>> IPOIB_PAUSING, >>> IPOIB_RUNNING >>> @@ -238,6 +241,9 @@ >>> ULONG n_send_NBL; >>> // number of send NBLs, gotten from NDIS ULONG >>> n_send_NBL_done; // number of send NBLs, completed >>> >>> + // >>> + shutter_t recv_shutter; >>> + >>> } ipoib_adapter_t; >>> /* >>> * FIELDS >>> Index: >>> >> D:/windows/MLNX_WinOF_trunk/ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp >>> =================================================================== >>> --- >>> >> D:/windows/MLNX_WinOF_trunk/ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp >>> (revision 5504) +++ >>> >>> >>> >> D:/windows/MLNX_WinOF_trunk/ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp >>> (revision 5529) @@ -1865,7 +1865,7 @@ >> ("ipoib_create_adapter returned >>> status %d.\n", ib_status ) ); return NDIS_STATUS_FAILURE; } - >>> p_adapter->ipoib_state = IPOIB_PAUSED; + >>> p_adapter->ipoib_state = IPOIB_INIT; >>> >>> status = SetAttributes(p_adapter, h_adapter); >>> if (status != NDIS_STATUS_SUCCESS) { @@ -3111,13 >>> +3111,12 @@ >>> >>> CL_ASSERT( adapter_context ); >>> p_adapter = (ipoib_adapter_t*)adapter_context; >>> - p_port = p_adapter->p_port; >>> >>> cl_obj_lock( &p_adapter->obj ); >>> if( p_adapter->ipoib_state == IPOIB_PAUSING || >>> p_adapter->ipoib_state == IPOIB_PAUSED) { >>> - status = NDIS_STATUS_PAUSED; //NDIS_STATUS_PAUSED; >>> + status = NDIS_STATUS_PAUSED; >>> IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, >>> ("Got send during PAUSE, complete >>> with error \n") ); cl_obj_unlock( &p_adapter->obj >>> ); @@ -3239,9 +3238,21 @@ IN NDIS_HANDLE adapter_context, >>> IN NDIS_SHUTDOWN_ACTION shutdown_action) >>> { >>> - IPOIB_ENTER( IPOIB_DBG_INIT ); >>> - UNUSED_PARAM( adapter_context ); >>> + IPOIB_ENTER( IPOIB_DBG_INIT ) ; >>> UNUSED_PARAM( shutdown_action ); >>> + >>> + ipoib_adapter_t *p_adapter = (ipoib_adapter_t *) >>> adapter_context; + + if (shutdown_action == >>> NdisShutdownPowerOff ) { + ASSERT(KeGetCurrentIrql() >>> == PASSIVE_LEVEL); + // We need to wait only if this >>> is not a blue screen any way + IPOIB_PRINT( >>> TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, + >>> ("Shutter shut, state = %d\n", p_adapter->ipoib_state)); + >>> IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV, + >>> ("Shutter shut, state = %d\n", p_adapter->ipoib_state)); + >>> shutter_shut ( &p_adapter->recv_shutter ); + } + >>> IPOIB_EXIT( IPOIB_DBG_INIT ); >>> } >>> >>> @@ -3941,13 +3952,15 @@ >>> KeReleaseInStackQueuedSpinLock( &hdl ); >>> >>> if (p_adapter->p_port) { >>> - //TODO improve this flow ! >>> - //TODO Be sure we stopped all sends and receives >>> cl_spinlock_acquire( >> &p_adapter->p_port->send_lock ); >>> ipoib_port_resume(p_adapter->p_port,FALSE); >>> cl_spinlock_release( >> &p_adapter->p_port->send_lock ); >>> } >>> - >>> + >>> + IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV, >>> + ("Shutter shut, state = %d\n", >>> p_adapter->ipoib_state)); + shutter_shut ( >>> &p_adapter->recv_shutter ); + >>> KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl ); >>> p_adapter->ipoib_state = IPOIB_PAUSED; >>> KeReleaseInStackQueuedSpinLock( &hdl ); >>> @@ -3978,6 +3991,16 @@ >>> // >>> // Check to see if we need to change any attributes } >>> + >>> + if ( (p_adapter->ipoib_state == IPOIB_PAUSED) || >>> (p_adapter->ipoib_state == IPOIB_INIT) ) { + >>> IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV, + >>> ("Shutter Alive, ipoib_state = %d\n", p_adapter->ipoib_state)); + >>> shutter_alive( &p_adapter->recv_shutter ); + } + else { >>> + IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_RECV, >>> + ("*****Shutter Was not \"Alived\", state = >>> %d*****\n", p_adapter->ipoib_state)); + } >>> >>> KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl ); >>> p_adapter->ipoib_state = IPOIB_RUNNING; >>> >>> -----Original Message----- >>> From: Alex Naslednikov >>> Sent: Wednesday, January 27, 2010 6:52 PM >>> To: 'Smith, Stan'; [email protected] >>> Subject: RE: [ofw] WWG 1-26-10 minutes - WinOF 2.2 release status >>> >>> Hi Stan, >>> I started to test my patch with WHQL tests. >>> It seems that the original problem was resolved, but I have several >>> improvements I hope to complete it by tomorrow (28/12/10) >>> >>> -----Original Message----- >>> From: [email protected] >>> [mailto:[email protected]] On Behalf Of Smith, Stan >>> Sent: Tuesday, January 26, 2010 8:06 PM >>> To: [email protected] >>> Subject: [ofw] WWG 1-26-10 minutes - WinOF 2.2 release status >>> >>> >>> Windows Working Group - Tuesday 1/26 9:00AM PST >>> >>> Attending: >>> >>> Alex Naslednikov - Mellanox >>> John Russo - Qlogic >>> Rupert Dance - Lamprey Networks >>> Stan Smith - Intel >>> >>> =============================================== >>> >>> WinOF 2.2 Status >>> ---------------- >>> >>> Patch 'Release HCA interface when loading of ibal fails' is intended >>> for trunk only as it's a rare occurrence. >>> >>> The IPoIB shutter code addressing IPoIB receiving packets during >>> shutdown will be included in WinOF 2.2 RC3 as soon as the code is >>> pushed into the trunk. Alex will make this a priority as the >>> release of RC3 is waiting on this patch. >>> >>> Sean submitted 2.2 patches for the DAPL provider socket-CM & >>> rdma-CM. >>> >>> Stan's testing of RC2 shows no signs of regression. >>> >>> Mellanox will engage in more QA testing once RC3 is released. >>> >>> IPoIB is tested on Svr 2008 R2 as IPoIB WHQL testing is specifically >>> targeted for Svr 2008 R2 only. >>> >>> =============================================== >>> >>> Delineation of OFED version numbers >>> ----------------------------------- >>> >>> The WWG (Windows Working Group) has voted to change the OFA Windows >>> SW release nomenclature from WinOF to 'OpenFabrics Enterprise >>> Distribution' in order to leverage and strengthen OFA name branding. >>> >>> In those situations where the operating environment context is >>> ambiguous, the Windows version of OFED will be referred to as 'OFED >>> for Windows'. >>> >>> In aligning with the OFED name the question surfaced about how to >>> delineate OFED release versions and 'if' there should be some >>> consolidation of OFED SW release cycles between the Linux and >>> Windows sides of the OFA house. >>> >>> The WWG resolved, with no reserve, that the release cycles and >>> versioning of OFED for Windows remain distinctly separate from the >>> OFED for Linux release cycles and versioning. >>> >>> OpenFabrics Enterprise Distribution for Windows will be formally >>> announced at the Sonoma'10 conference. >>> >>> Changes in the OFED for Windows installer will consist of changing >>> names WinOF --> OFED. The only functional change will be the >>> installation path: %ProgramFiles%\WinOF --> %ProgramFiles%\OFED >>> >>> At the OFA Sonoma workshop the WWG (and anyone else) will meet >>> face-2-face to discuss futures. >>> >>> >>> >>> >>> >>> _______________________________________________ >>> ofw mailing list >>> [email protected] >>> http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw >> >> _______________________________________________ >> ofw mailing list >> [email protected] >> http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw _______________________________________________ ofw mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw
