From: sleybo Date: Tue, 28 Nov 2006 18:32:06 +0000 (+0000) Subject: [IBAL] add ref count to ioc X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=beb9ac08e00064a6c4e3b479b2882786d82b02bc;p=~shefty%2Frdma-win.git [IBAL] add ref count to ioc git-svn-id: svn://openib.tc.cornell.edu/gen1@553 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- diff --git a/trunk/core/al/kernel/al_ioc_pnp.c b/trunk/core/al/kernel/al_ioc_pnp.c index cf720090..343a0fd3 100644 --- a/trunk/core/al/kernel/al_ioc_pnp.c +++ b/trunk/core/al/kernel/al_ioc_pnp.c @@ -272,6 +272,7 @@ typedef struct _iou_ioc ib_ioc_profile_t profile; uint8_t num_valid_entries; ib_svc_entry_t *p_svc_entries; + atomic32_t ref_cnt; } iou_ioc_t; #pragma warning(default:4324) @@ -1052,13 +1053,15 @@ __get_ioc( p_ioc = PARENT_STRUCT( PARENT_STRUCT( p_item, cl_map_item_t, pool_item ), iou_ioc_t, map_item ); + + CL_ASSERT( !p_ioc->ref_cnt ); CL_ASSERT( !(ioc_slot >> 8) ); p_ioc->slot = (uint8_t)ioc_slot; p_ioc->profile = *p_profile; p_ioc->num_valid_entries = 0; p_ioc->p_svc_entries = p_svc_entries; - + cl_atomic_inc( &p_ioc->ref_cnt ); return p_ioc; } @@ -1068,12 +1071,14 @@ __put_ioc( IN ioc_pnp_mgr_t* const p_ioc_mgr, IN iou_ioc_t* const p_ioc ) { - CL_ASSERT( p_ioc->p_svc_entries ); - cl_free( p_ioc->p_svc_entries ); + if( cl_atomic_dec( &p_ioc->ref_cnt ) == 0 ) + { + cl_free( p_ioc->p_svc_entries ); - cl_spinlock_acquire( &p_ioc_mgr->ioc_pool_lock ); - cl_qpool_put( &p_ioc_mgr->ioc_pool, &p_ioc->map_item.pool_item ); - cl_spinlock_release( &p_ioc_mgr->ioc_pool_lock ); + cl_spinlock_acquire( &p_ioc_mgr->ioc_pool_lock ); + cl_qpool_put( &p_ioc_mgr->ioc_pool, &p_ioc->map_item.pool_item ); + cl_spinlock_release( &p_ioc_mgr->ioc_pool_lock ); + } } @@ -1096,9 +1101,12 @@ __put_ioc_map( p_ioc = PARENT_STRUCT( PARENT_STRUCT( p_item, cl_map_item_t, pool_item ), iou_ioc_t, map_item ); - - cl_free( p_ioc->p_svc_entries ); - cl_qlist_insert_head( &list, &p_item->pool_item.list_item ); + + if( cl_atomic_dec( &p_ioc->ref_cnt ) == 0 ) + { + cl_free( p_ioc->p_svc_entries ); + cl_qlist_insert_head( &list, &p_item->pool_item.list_item ); + } p_item = cl_qmap_head( p_ioc_map ); } cl_spinlock_acquire( &p_ioc_mgr->ioc_pool_lock ); @@ -2479,6 +2487,7 @@ __query_svc_entries( p_mad->p_next = p_mad_list; p_mad_list = p_mad; + cl_atomic_inc( &p_ioc->ref_cnt ); cl_atomic_inc( &p_results->p_svc->query_cnt ); } } @@ -2502,6 +2511,8 @@ __query_svc_entries( { p_mad_list = p_mad->p_next; p_mad->p_next = NULL; + p_ioc = (iou_ioc_t* __ptr64)p_mad->context2; + cl_atomic_dec( &p_ioc->ref_cnt ); ib_put_mad( p_mad ); if( !cl_atomic_dec( &p_results->p_svc->query_cnt ) && status == IB_SUCCESS ) @@ -3297,3 +3308,5 @@ ioc_pnp_process_dereg( AL_EXIT( AL_DBG_PNP ); } + +