diff --git a/include/haproxy/pool-t.h b/include/haproxy/pool-t.h index 283cc9ffd..a9234dd3c 100644 --- a/include/haproxy/pool-t.h +++ b/include/haproxy/pool-t.h @@ -45,6 +45,8 @@ struct pool_cache_head { struct list list; /* head of objects in this pool */ unsigned int count; /* number of objects in this pool */ + unsigned int tid; /* thread id, for debugging only */ + struct pool_head *pool; /* assigned pool, for debugging only */ #if defined(DEBUG_POOL_INTEGRITY) ulong fill_pattern; /* pattern used to fill the area on free */ #endif diff --git a/src/pool.c b/src/pool.c index 554d1cbb8..8d9c17fd5 100644 --- a/src/pool.c +++ b/src/pool.c @@ -233,6 +233,8 @@ struct pool_head *create_pool(char *name, unsigned int size, unsigned int flags) /* update per-thread pool cache if necessary */ for (thr = 0; thr < MAX_THREADS; thr++) { LIST_INIT(&pool->cache[thr].list); + pool->cache[thr].tid = thr; + pool->cache[thr].pool = pool; } #endif } @@ -395,7 +397,11 @@ void pool_evict_from_local_caches() * oldest in their own pools, thus their next is the pool's head. */ ph = LIST_NEXT(&item->by_pool, struct pool_cache_head *, list); + BUG_ON(ph->tid != tid); + pool = container_of(ph - tid, struct pool_head, cache); + BUG_ON(pool != ph->pool); + pool_evict_last_items(pool, ph, CONFIG_HAP_POOL_CLUSTER_SIZE); } while (pool_cache_bytes > CONFIG_HAP_POOL_CACHE_SIZE * 7 / 8); }