From f7c475df5c0a5868fc1911877befbe6d7c5cf475 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 16 Nov 2022 11:30:04 +0100 Subject: [PATCH] MINOR: pool/debug: create a new pool_alloc_flag() macro This macro just serves as an intermediary for __pool_alloc() and forwards the flag. When DEBUG_MEM_STATS is set, it will be used to collect all pool allocations including those which need to pass an explicit flag. It's now used by b_alloc() which previously couldn't be tracked by DEBUG_MEM_STATS, causing some free() calls to have no corresponding allocations. --- include/haproxy/dynbuf.h | 2 +- include/haproxy/pool.h | 31 ++++++++++++------------------- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/include/haproxy/dynbuf.h b/include/haproxy/dynbuf.h index 5e8ece2f7..45bd4cf8c 100644 --- a/include/haproxy/dynbuf.h +++ b/include/haproxy/dynbuf.h @@ -68,7 +68,7 @@ static inline struct buffer *b_alloc(struct buffer *buf) return buf; *buf = BUF_WANTED; - area = __pool_alloc(pool_head_buffer, POOL_F_NO_POISON); + area = pool_alloc_flag(pool_head_buffer, POOL_F_NO_POISON); if (unlikely(!area)) { activity[tid].buf_wait++; return NULL; diff --git a/include/haproxy/pool.h b/include/haproxy/pool.h index 8fd14b966..b6aa372f4 100644 --- a/include/haproxy/pool.h +++ b/include/haproxy/pool.h @@ -226,6 +226,12 @@ static inline void *pool_get_from_cache(struct pool_head *pool, const void *call #if !defined(DEBUG_MEM_STATS) +/* + * Returns a pointer to an object from pool allocated using + * flags from the POOL_F_* set. + */ +#define pool_alloc_flag(pool, flag) __pool_alloc((pool), (flag)) + /* * Returns a pointer to type taken from the pool or * dynamically allocated. Memory poisonning is performed if enabled. @@ -272,8 +278,9 @@ static inline void *pool_get_from_cache(struct pool_head *pool, const void *call } \ }) -#define pool_alloc(pool) ({ \ +#define pool_alloc_flag(pool, flag) ({ \ struct pool_head *__pool = (pool); \ + uint __flag = (flag); \ size_t __x = __pool->size; \ static struct mem_stats _ __attribute__((used,__section__("mem_stats"),__aligned__(sizeof(void*)))) = { \ .caller = { \ @@ -287,26 +294,12 @@ static inline void *pool_get_from_cache(struct pool_head *pool, const void *call HA_WEAK(__stop_mem_stats); \ _HA_ATOMIC_INC(&_.calls); \ _HA_ATOMIC_ADD(&_.size, __x); \ - __pool_alloc(__pool, 0); \ + __pool_alloc(__pool, __flag); \ }) -#define pool_zalloc(pool) ({ \ - struct pool_head *__pool = (pool); \ - size_t __x = __pool->size; \ - static struct mem_stats _ __attribute__((used,__section__("mem_stats"),__aligned__(sizeof(void*)))) = { \ - .caller = { \ - .file = __FILE__, .line = __LINE__, \ - .what = MEM_STATS_TYPE_P_ALLOC, \ - .func = __func__, \ - }, \ - }; \ - _.extra = __pool; \ - HA_WEAK(__start_mem_stats); \ - HA_WEAK(__stop_mem_stats); \ - _HA_ATOMIC_INC(&_.calls); \ - _HA_ATOMIC_ADD(&_.size, __x); \ - __pool_alloc(__pool, POOL_F_MUST_ZERO); \ -}) +#define pool_alloc(pool) pool_alloc_flag(pool, 0) + +#define pool_zalloc(pool) pool_alloc_flag(pool, POOL_F_MUST_ZERO) #endif /* DEBUG_MEM_STATS */