Leonid, skip the review/commit. I'm inclined to agree with Sean's timing speculation.
Stan. Hefty, Sean wrote: > From the WDK docs: > > ExInitializeNPagedLookasideList: > Initializes a system spin lock to control allocations from and frees > to the lookaside list in a multiprocessor-safe manner if necessary > > The locking around NPagedLookasidelist should be unnecessary. It's > likely just throwing off the timing enough to make it more difficult > to hit the bug. > >> -----Original Message----- >> From: [email protected] [mailto:ofw- >> [email protected]] On Behalf Of Smith, Stan >> Sent: Tuesday, April 28, 2009 9:18 AM >> To: Leonid Keller >> Cc: [email protected] >> Subject: [ofw] [IBAL] serialize MAD pool access to eliminate POOL >> corruption crash in multi HCA config. >> >> Hello, >> The following patch serializes NPagedLookasideList access which >> eliminates MAD Pool corruption crash on 2nd HCA enable. The generic >> pool memory tag 'dmla' was changed to identify each specific pool - >> finer granularity debug. >> >> Please review for commit. >> >> This patch does not completely solve the 2nd HCA enable problem, >> although it does eliminate the POOL corruption crashes. >> >> Thanks, >> >> Stan. >> >> Signed off by [email protected] >> >> --- C:/Documents and Settings/scsmith/Local >> Settings/Temp/al_mad_pool.c- revBASE.svn000.tmp.c Tue Apr 28 >> 09:07:40 2009 +++ C:/Documents and Settings/scsmith/My >> Documents/openIB- >> windows/SVN/gen1/trunk/core/al/kernel/al_mad_pool.c Tue Apr 28 >> 09:08:42 2009 @@ -140,12 +140,15 @@ >> >> /* Initialize the pool lists. */ >> cl_qlist_init( &h_pool->key_list ); >> + >> ExInitializeNPagedLookasideList( &h_pool->mad_stack, NULL, >> NULL, - 0, sizeof(mad_item_t), 'dmla', 0 ); >> + 0, sizeof(mad_item_t), 'ktsm', 0 ); + >> ExInitializeNPagedLookasideList( &h_pool->mad_send_pool, >> NULL, NULL, - 0, sizeof(mad_send_t), 'dmla', 0 ); >> + 0, sizeof(mad_send_t), 'lpsm', 0 ); + >> ExInitializeNPagedLookasideList( &h_pool->mad_rmpp_pool, >> NULL, NULL, - 0, sizeof(mad_rmpp_t), 'dmla', 0 ); >> + 0, sizeof(mad_rmpp_t), 'pmrm', 0 ); >> >> /* Initialize the pool object. */ >> construct_al_obj( &h_pool->obj, AL_OBJ_TYPE_H_MAD_POOL ); @@ >> -640,8 +643,10 @@ CL_ASSERT( pp_mad_element ); >> >> /* Obtain a MAD item from the stack. */ >> + cl_spinlock_acquire( &pool_key->h_pool->obj.lock ); >> p_mad_item = (mad_item_t*)ExAllocateFromNPagedLookasideList( >> &pool_key->h_pool->mad_stack ); >> + cl_spinlock_release( &pool_key->h_pool->obj.lock ); >> if( !p_mad_item ) return IB_INSUFFICIENT_RESOURCES; >> >> @@ -709,7 +714,9 @@ >> p_mad_element->element.p_next = NULL; >> >> /* Return the MAD element to the pool. */ >> + cl_spinlock_acquire( &pool_key->h_pool->obj.lock ); >> ExFreeToNPagedLookasideList( &pool_key->h_pool->mad_stack, >> p_mad_item ); + cl_spinlock_release( >> &pool_key->h_pool->obj.lock ); >> >> cl_atomic_dec( &pool_key->mad_cnt ); >> deref_al_obj( &pool_key->obj ); >> @@ -731,8 +738,10 @@ >> CL_ASSERT( p_mad_item->pool_key ); >> CL_ASSERT( p_mad_item->pool_key->h_pool ); >> >> + cl_spinlock_acquire( &p_mad_item->pool_key->h_pool->obj.lock >> ); p_mad_send = ExAllocateFromNPagedLookasideList( >> &p_mad_item->pool_key->h_pool->mad_send_pool ); >> + cl_spinlock_release( &p_mad_item->pool_key->h_pool->obj.lock >> ); if( !p_mad_send ) return NULL; >> >> @@ -761,7 +770,9 @@ >> p_mad_send = PARENT_STRUCT( h_mad_send, mad_send_t, mad_send >> ); h_pool = p_mad_send->h_pool; >> >> + cl_spinlock_acquire( &h_pool->obj.lock ); >> ExFreeToNPagedLookasideList( &h_pool->mad_send_pool, >> p_mad_send ); + cl_spinlock_release( &h_pool->obj.lock ); >> deref_al_obj( &h_pool->obj ); >> } >> >> @@ -781,8 +792,10 @@ >> CL_ASSERT( p_mad_item->pool_key ); >> CL_ASSERT( p_mad_item->pool_key->h_pool ); >> >> + cl_spinlock_acquire( &p_mad_item->pool_key->h_pool->obj.lock >> ); p_mad_rmpp = ExAllocateFromNPagedLookasideList( >> &p_mad_item->pool_key->h_pool->mad_rmpp_pool ); >> + cl_spinlock_release( &p_mad_item->pool_key->h_pool->obj.lock >> ); if( !p_mad_rmpp ) return NULL; >> >> @@ -805,7 +818,9 @@ >> >> h_pool = p_mad_rmpp->h_pool; >> >> + cl_spinlock_acquire( &h_pool->obj.lock ); >> ExFreeToNPagedLookasideList( &h_pool->mad_rmpp_pool, >> p_mad_rmpp ); + cl_spinlock_release( &h_pool->obj.lock ); >> deref_al_obj( &h_pool->obj ); >> } _______________________________________________ ofw mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw
