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.
This commit is contained in:
Willy Tarreau 2022-02-21 18:30:25 +01:00
parent fd8b737e2c
commit d3470e1ce8
3 changed files with 14 additions and 8 deletions

View File

@ -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 */

View File

@ -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);

View File

@ -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;