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

Reply via email to