From bb668d69815209bd7f7f4669142191d4b48bcde8 Mon Sep 17 00:00:00 2001 From: Mohit Agrawal Date: Tue, 18 Dec 2018 19:41:42 +0530 Subject: [PATCH 493/493] mem-pool: count allocations done per user-pool Count the active allocations per 'struct mem_pool'. These are the objects that the calling component allocated and free'd in the memory pool for this specific type. Having this count in the statedump will make it easy to find memory leaks. > Updates: #307 > Change-Id: I797fabab86f104e49338c00e449a7d0b0d270004 > Signed-off-by: Niels de Vos > Reviewed-on: https://review.gluster.org/18074 > Smoke: Gluster Build System > CentOS-regression: Gluster Build System > Reviewed-by: Jeff Darcy Change-Id: I2e4375fd59f11288f41a36cad131d794bff19fbb BUG: 1648893 Signed-off-by: Mohit Agrawal Reviewed-on: https://code.engineering.redhat.com/gerrit/158961 Tested-by: RHGS Build Bot Reviewed-by: Sunil Kumar Heggodu Gopala Acharya --- libglusterfs/src/mem-pool.c | 4 ++++ libglusterfs/src/mem-pool.h | 3 ++- libglusterfs/src/statedump.c | 4 ++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/libglusterfs/src/mem-pool.c b/libglusterfs/src/mem-pool.c index 999a83f..d82a371 100644 --- a/libglusterfs/src/mem-pool.c +++ b/libglusterfs/src/mem-pool.c @@ -711,6 +711,7 @@ mem_pool_new_fn (glusterfs_ctx_t *ctx, unsigned long sizeof_type, new->count = count; new->name = name; new->pool = pool; + GF_ATOMIC_INIT (new->active, 0); INIT_LIST_HEAD (&new->owner); LOCK (&ctx->lock); @@ -864,6 +865,8 @@ mem_get (struct mem_pool *mem_pool) retval->pool_list = pool_list; retval->power_of_two = mem_pool->pool->power_of_two; + GF_ATOMIC_INC (mem_pool->active); + return retval + 1; #endif /* GF_DISABLE_MEMPOOL */ } @@ -894,6 +897,7 @@ mem_put (void *ptr) pt_pool = &pool_list->pools[hdr->power_of_two-POOL_SMALLEST]; hdr->magic = GF_MEM_INVALID_MAGIC; + GF_ATOMIC_DEC (hdr->pool->active); (void) pthread_spin_lock (&pool_list->lock); if (!pool_list->poison) { diff --git a/libglusterfs/src/mem-pool.h b/libglusterfs/src/mem-pool.h index 0ebb63b..aa1d045 100644 --- a/libglusterfs/src/mem-pool.h +++ b/libglusterfs/src/mem-pool.h @@ -210,8 +210,9 @@ out: struct mem_pool { /* object size, without pooled_obj_hdr_t */ unsigned long sizeof_type; - unsigned long count; + unsigned long count; /* requested pool size (unused) */ char *name; + gf_atomic_t active; /* current allocations */ struct list_head owner; /* glusterfs_ctx_t->mempool_list */ glusterfs_ctx_t *ctx; /* take ctx->lock when updating owner */ diff --git a/libglusterfs/src/statedump.c b/libglusterfs/src/statedump.c index 4aad014..a04c535 100644 --- a/libglusterfs/src/statedump.c +++ b/libglusterfs/src/statedump.c @@ -400,10 +400,14 @@ gf_proc_dump_mempool_info (glusterfs_ctx_t *ctx) LOCK (&ctx->lock); { list_for_each_entry (pool, &ctx->mempool_list, owner) { + int64_t active = GF_ATOMIC_GET (pool->active); + gf_proc_dump_write ("-----", "-----"); gf_proc_dump_write ("pool-name", "%s", pool->name); + gf_proc_dump_write ("active-count", "%"GF_PRI_ATOMIC, active); gf_proc_dump_write ("sizeof-type", "%lu", pool->sizeof_type); gf_proc_dump_write ("padded-sizeof", "%d", 1 << pool->pool->power_of_two); + gf_proc_dump_write ("size", "%lu", (1 << pool->pool->power_of_two) * active); gf_proc_dump_write ("shared-pool", "%p", pool->pool); } } -- 1.8.3.1