diff --git a/include/haproxy/activity-t.h b/include/haproxy/activity-t.h index f21f8057c..0f5210f69 100644 --- a/include/haproxy/activity-t.h +++ b/include/haproxy/activity-t.h @@ -48,6 +48,8 @@ enum memprof_method { MEMPROF_METH_CALLOC, MEMPROF_METH_REALLOC, MEMPROF_METH_FREE, + MEMPROF_METH_P_ALLOC, // pool_alloc() + MEMPROF_METH_P_FREE, // pool_free() MEMPROF_METH_METHODS /* count, must be last */ }; diff --git a/src/activity.c b/src/activity.c index c020f24d2..ee5577102 100644 --- a/src/activity.c +++ b/src/activity.c @@ -53,7 +53,7 @@ struct sched_activity sched_activity[256] __attribute__((aligned(64))) = { }; #ifdef USE_MEMORY_PROFILING static const char *const memprof_methods[MEMPROF_METH_METHODS] = { - "unknown", "malloc", "calloc", "realloc", "free", + "unknown", "malloc", "calloc", "realloc", "free", "p_alloc", "p_free", }; /* last one is for hash collisions ("others") and has no caller address */ diff --git a/src/pool.c b/src/pool.c index 973f8a0f2..6f3e41971 100644 --- a/src/pool.c +++ b/src/pool.c @@ -727,6 +727,15 @@ void *__pool_alloc(struct pool_head *pool, unsigned int flags) p = pool_alloc_nocache(pool); if (likely(p)) { +#ifdef USE_MEMORY_PROFILING + if (unlikely(profiling & HA_PROF_MEMORY)) { + struct memprof_stats *bin; + + bin = memprof_get_bin(__builtin_return_address(0), MEMPROF_METH_P_ALLOC); + _HA_ATOMIC_ADD(&bin->alloc_calls, 1); + _HA_ATOMIC_ADD(&bin->alloc_tot, pool->size); + } +#endif if (unlikely(flags & POOL_F_MUST_ZERO)) memset(p, 0, pool->size); else if (unlikely(!(flags & POOL_F_NO_POISON) && (pool_debugging & POOL_DBG_POISON))) @@ -747,6 +756,16 @@ void __pool_free(struct pool_head *pool, void *ptr) POOL_DEBUG_CHECK_MARK(pool, ptr); POOL_DEBUG_RESET_MARK(pool, ptr); +#ifdef USE_MEMORY_PROFILING + if (unlikely(profiling & HA_PROF_MEMORY) && ptr) { + struct memprof_stats *bin; + + bin = memprof_get_bin(__builtin_return_address(0), MEMPROF_METH_P_FREE); + _HA_ATOMIC_ADD(&bin->free_calls, 1); + _HA_ATOMIC_ADD(&bin->free_tot, pool->size); + } +#endif + if (unlikely(pool_debugging & POOL_DBG_NO_CACHE)) { pool_free_nocache(pool, ptr); return;