From d3470e1ce8c31e7c20ac5d2b6e93dc777c3842c6 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Mon, 21 Feb 2022 18:30:25 +0100 Subject: [PATCH] MINOR: pools: add a new debugging flag POOL_DBG_COLD_FIRST When enabling pools integrity checks, we usually prefer to allocate cold objects first in order to maximize the time the objects spend in the cache. In order to make this configurable at runtime, let's introduce a new debugging flag to control this allocation order. It is currently preset by the DEBUG_POOL_INTEGRITY build-time setting. --- include/haproxy/pool-t.h | 1 + include/haproxy/pool.h | 18 ++++++++++-------- src/pool.c | 3 +++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/include/haproxy/pool-t.h b/include/haproxy/pool-t.h index 37980c629..a1a9f6530 100644 --- a/include/haproxy/pool-t.h +++ b/include/haproxy/pool-t.h @@ -43,6 +43,7 @@ /* pool debugging flags */ #define POOL_DBG_FAIL_ALLOC 0x00000001 // randomly fail memory allocations #define POOL_DBG_DONT_MERGE 0x00000002 // do not merge same-size pools +#define POOL_DBG_COLD_FIRST 0x00000004 // pick cold objects first /* This is the head of a thread-local cache */ diff --git a/include/haproxy/pool.h b/include/haproxy/pool.h index 541e0d96b..1d224241b 100644 --- a/include/haproxy/pool.h +++ b/include/haproxy/pool.h @@ -275,16 +275,18 @@ static inline void *pool_get_from_cache(struct pool_head *pool, const void *call return NULL; } + if (unlikely(pool_debugging & POOL_DBG_COLD_FIRST)) { + /* allocate oldest objects first so as to keep them as long as possible + * in the cache before being reused and maximizing the chance to detect + * an overwrite. + */ + item = LIST_PREV(&ph->list, typeof(item), by_pool); + } else { + /* allocate hottest objects first */ + item = LIST_NEXT(&ph->list, typeof(item), by_pool); + } #if defined(DEBUG_POOL_INTEGRITY) - /* allocate oldest objects first so as to keep them as long as possible - * in the cache before being reused and maximizing the chance to detect - * an overwrite. - */ - item = LIST_PREV(&ph->list, typeof(item), by_pool); pool_check_pattern(ph, item, pool->size); -#else - /* allocate hottest objects first */ - item = LIST_NEXT(&ph->list, typeof(item), by_pool); #endif BUG_ON(&item->by_pool == &ph->list); LIST_DELETE(&item->by_pool); diff --git a/src/pool.c b/src/pool.c index 7f9c3df5a..87ab4b65d 100644 --- a/src/pool.c +++ b/src/pool.c @@ -43,6 +43,9 @@ uint pool_debugging __read_mostly = /* set of POOL_DBG_* flags */ #endif #ifdef DEBUG_DONT_SHARE_POOLS POOL_DBG_DONT_MERGE | +#endif +#ifdef DEBUG_POOL_INTEGRITY + POOL_DBG_COLD_FIRST | #endif 0;