Address bug https://bugs.linaro.org/show_bug.cgi?id=1480
Signed-off-by: Bill Fischofer <[email protected]> --- platform/linux-generic/include/odp_pool_internal.h | 44 +++++++++++-------- platform/linux-generic/odp_pool.c | 50 +++++++++++----------- 2 files changed, 52 insertions(+), 42 deletions(-) diff --git a/platform/linux-generic/include/odp_pool_internal.h b/platform/linux-generic/include/odp_pool_internal.h index 247a75a..136db2c 100644 --- a/platform/linux-generic/include/odp_pool_internal.h +++ b/platform/linux-generic/include/odp_pool_internal.h @@ -73,6 +73,20 @@ typedef struct local_cache_t { #define POOL_LOCK_INIT(a) odp_spinlock_init(a) #endif +/** + * ODP Pool stats - Maintain some useful stats regarding pool utilization + */ +typedef struct { + odp_atomic_u64_t bufallocs; /**< Count of successful buf allocs */ + odp_atomic_u64_t buffrees; /**< Count of successful buf frees */ + odp_atomic_u64_t blkallocs; /**< Count of successful blk allocs */ + odp_atomic_u64_t blkfrees; /**< Count of successful blk frees */ + odp_atomic_u64_t bufempty; /**< Count of unsuccessful buf allocs */ + odp_atomic_u64_t blkempty; /**< Count of unsuccessful blk allocs */ + odp_atomic_u64_t high_wm_count; /**< Count of high wm conditions */ + odp_atomic_u64_t low_wm_count; /**< Count of low wm conditions */ +} _odp_pool_stats_t; + struct pool_entry_s { #ifdef POOL_USE_TICKETLOCK odp_ticketlock_t lock ODP_ALIGNED_CACHE; @@ -111,14 +125,7 @@ struct pool_entry_s { void *blk_freelist; odp_atomic_u32_t bufcount; odp_atomic_u32_t blkcount; - odp_atomic_u64_t bufallocs; - odp_atomic_u64_t buffrees; - odp_atomic_u64_t blkallocs; - odp_atomic_u64_t blkfrees; - odp_atomic_u64_t bufempty; - odp_atomic_u64_t blkempty; - odp_atomic_u64_t high_wm_count; - odp_atomic_u64_t low_wm_count; + _odp_pool_stats_t poolstats; uint32_t buf_num; uint32_t seg_size; uint32_t blk_size; @@ -153,12 +160,12 @@ static inline void *get_blk(struct pool_entry_s *pool) if (odp_unlikely(myhead == NULL)) { POOL_UNLOCK(&pool->blk_lock); - odp_atomic_inc_u64(&pool->blkempty); + odp_atomic_inc_u64(&pool->poolstats.blkempty); } else { pool->blk_freelist = ((odp_buf_blk_t *)myhead)->next; POOL_UNLOCK(&pool->blk_lock); odp_atomic_dec_u32(&pool->blkcount); - odp_atomic_inc_u64(&pool->blkallocs); + odp_atomic_inc_u64(&pool->poolstats.blkallocs); } return myhead; @@ -174,7 +181,7 @@ static inline void ret_blk(struct pool_entry_s *pool, void *block) POOL_UNLOCK(&pool->blk_lock); odp_atomic_inc_u32(&pool->blkcount); - odp_atomic_inc_u64(&pool->blkfrees); + odp_atomic_inc_u64(&pool->poolstats.blkfrees); } static inline odp_buffer_hdr_t *get_buf(struct pool_entry_s *pool) @@ -186,7 +193,7 @@ static inline odp_buffer_hdr_t *get_buf(struct pool_entry_s *pool) if (odp_unlikely(myhead == NULL)) { POOL_UNLOCK(&pool->buf_lock); - odp_atomic_inc_u64(&pool->bufempty); + odp_atomic_inc_u64(&pool->poolstats.bufempty); } else { pool->buf_freelist = myhead->next; POOL_UNLOCK(&pool->buf_lock); @@ -196,10 +203,10 @@ static inline odp_buffer_hdr_t *get_buf(struct pool_entry_s *pool) /* Check for low watermark condition */ if (bufcount == pool->low_wm && !pool->low_wm_assert) { pool->low_wm_assert = 1; - odp_atomic_inc_u64(&pool->low_wm_count); + odp_atomic_inc_u64(&pool->poolstats.low_wm_count); } - odp_atomic_inc_u64(&pool->bufallocs); + odp_atomic_inc_u64(&pool->poolstats.bufallocs); myhead->allocator = odp_thread_id(); } @@ -229,10 +236,10 @@ static inline void ret_buf(struct pool_entry_s *pool, odp_buffer_hdr_t *buf) /* Check if low watermark condition should be deasserted */ if (bufcount == pool->high_wm && pool->low_wm_assert) { pool->low_wm_assert = 0; - odp_atomic_inc_u64(&pool->high_wm_count); + odp_atomic_inc_u64(&pool->poolstats.high_wm_count); } - odp_atomic_inc_u64(&pool->buffrees); + odp_atomic_inc_u64(&pool->poolstats.buffrees); } static inline void *get_local_buf(local_cache_t *buf_cache, @@ -291,8 +298,9 @@ static inline void flush_cache(local_cache_t *buf_cache, flush_count++; } - odp_atomic_add_u64(&pool->bufallocs, buf_cache->bufallocs); - odp_atomic_add_u64(&pool->buffrees, buf_cache->buffrees - flush_count); + odp_atomic_add_u64(&pool->poolstats.bufallocs, buf_cache->bufallocs); + odp_atomic_add_u64(&pool->poolstats.buffrees, + buf_cache->buffrees - flush_count); buf_cache->buf_freelist = NULL; buf_cache->bufallocs = 0; diff --git a/platform/linux-generic/odp_pool.c b/platform/linux-generic/odp_pool.c index cd2c449..f2bf0c7 100644 --- a/platform/linux-generic/odp_pool.c +++ b/platform/linux-generic/odp_pool.c @@ -89,14 +89,14 @@ int odp_pool_init_global(void) odp_atomic_init_u32(&pool->s.blkcount, 0); /* Initialize pool statistics counters */ - odp_atomic_init_u64(&pool->s.bufallocs, 0); - odp_atomic_init_u64(&pool->s.buffrees, 0); - odp_atomic_init_u64(&pool->s.blkallocs, 0); - odp_atomic_init_u64(&pool->s.blkfrees, 0); - odp_atomic_init_u64(&pool->s.bufempty, 0); - odp_atomic_init_u64(&pool->s.blkempty, 0); - odp_atomic_init_u64(&pool->s.high_wm_count, 0); - odp_atomic_init_u64(&pool->s.low_wm_count, 0); + odp_atomic_init_u64(&pool->s.poolstats.bufallocs, 0); + odp_atomic_init_u64(&pool->s.poolstats.buffrees, 0); + odp_atomic_init_u64(&pool->s.poolstats.blkallocs, 0); + odp_atomic_init_u64(&pool->s.poolstats.blkfrees, 0); + odp_atomic_init_u64(&pool->s.poolstats.bufempty, 0); + odp_atomic_init_u64(&pool->s.poolstats.blkempty, 0); + odp_atomic_init_u64(&pool->s.poolstats.high_wm_count, 0); + odp_atomic_init_u64(&pool->s.poolstats.low_wm_count, 0); } ODP_DBG("\nPool init global\n"); @@ -401,14 +401,14 @@ odp_pool_t odp_pool_create(const char *name, } while (blk >= block_base_addr); /* Initialize pool statistics counters */ - odp_atomic_store_u64(&pool->s.bufallocs, 0); - odp_atomic_store_u64(&pool->s.buffrees, 0); - odp_atomic_store_u64(&pool->s.blkallocs, 0); - odp_atomic_store_u64(&pool->s.blkfrees, 0); - odp_atomic_store_u64(&pool->s.bufempty, 0); - odp_atomic_store_u64(&pool->s.blkempty, 0); - odp_atomic_store_u64(&pool->s.high_wm_count, 0); - odp_atomic_store_u64(&pool->s.low_wm_count, 0); + odp_atomic_store_u64(&pool->s.poolstats.bufallocs, 0); + odp_atomic_store_u64(&pool->s.poolstats.buffrees, 0); + odp_atomic_store_u64(&pool->s.poolstats.blkallocs, 0); + odp_atomic_store_u64(&pool->s.poolstats.blkfrees, 0); + odp_atomic_store_u64(&pool->s.poolstats.bufempty, 0); + odp_atomic_store_u64(&pool->s.poolstats.blkempty, 0); + odp_atomic_store_u64(&pool->s.poolstats.high_wm_count, 0); + odp_atomic_store_u64(&pool->s.poolstats.low_wm_count, 0); /* Reset other pool globals to initial state */ pool->s.low_wm_assert = 0; @@ -586,14 +586,16 @@ void odp_pool_print(odp_pool_t pool_hdl) uint32_t bufcount = odp_atomic_load_u32(&pool->s.bufcount); uint32_t blkcount = odp_atomic_load_u32(&pool->s.blkcount); - uint64_t bufallocs = odp_atomic_load_u64(&pool->s.bufallocs); - uint64_t buffrees = odp_atomic_load_u64(&pool->s.buffrees); - uint64_t blkallocs = odp_atomic_load_u64(&pool->s.blkallocs); - uint64_t blkfrees = odp_atomic_load_u64(&pool->s.blkfrees); - uint64_t bufempty = odp_atomic_load_u64(&pool->s.bufempty); - uint64_t blkempty = odp_atomic_load_u64(&pool->s.blkempty); - uint64_t hiwmct = odp_atomic_load_u64(&pool->s.high_wm_count); - uint64_t lowmct = odp_atomic_load_u64(&pool->s.low_wm_count); + uint64_t bufallocs = odp_atomic_load_u64(&pool->s.poolstats.bufallocs); + uint64_t buffrees = odp_atomic_load_u64(&pool->s.poolstats.buffrees); + uint64_t blkallocs = odp_atomic_load_u64(&pool->s.poolstats.blkallocs); + uint64_t blkfrees = odp_atomic_load_u64(&pool->s.poolstats.blkfrees); + uint64_t bufempty = odp_atomic_load_u64(&pool->s.poolstats.bufempty); + uint64_t blkempty = odp_atomic_load_u64(&pool->s.poolstats.blkempty); + uint64_t hiwmct = + odp_atomic_load_u64(&pool->s.poolstats.high_wm_count); + uint64_t lowmct = + odp_atomic_load_u64(&pool->s.poolstats.low_wm_count); ODP_DBG("Pool info\n"); ODP_DBG("---------\n"); -- 2.1.0 _______________________________________________ lng-odp mailing list [email protected] https://lists.linaro.org/mailman/listinfo/lng-odp
