From: Willy Tarreau Date: Mon, 21 Feb 2022 17:30:25 +0000 (+0100) Subject: MINOR: pools: add a new debugging flag POOL_DBG_COLD_FIRST X-Git-Tag: v2.6-dev2~81 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d3470e1ce8c31e7c20ac5d2b6e93dc777c3842c6;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/include/haproxy/pool-t.h b/include/haproxy/pool-t.h index 37980c6290..a1a9f65306 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 541e0d96bf..1d224241b9 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 7f9c3df5a1..87ab4b65de 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;