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 ); }
al_mad_pool.c.patch
Description: al_mad_pool.c.patch
_______________________________________________ ofw mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw
