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;