From 544c2f2d9e3b74336fd81189165eeb1667dfe078 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 17 Aug 2023 09:04:35 +0200 Subject: [PATCH] MINOR: pools: use EBO to wait for unlock during pool_flush() pool_flush() could become a source of contention on the pool's free list if there are many competing thread using that pool. Let's make sure we use EBO and not just a simple CPU relaxation there, to avoid disturbing them. --- src/pool.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/pool.c b/src/pool.c index 341c3b4d86..59b0944bba 100644 --- a/src/pool.c +++ b/src/pool.c @@ -749,10 +749,9 @@ void pool_flush(struct pool_head *pool) for (bucket = 0; bucket < CONFIG_HAP_POOL_BUCKETS; bucket++) { next = pool->buckets[bucket].free_list; do { - while (unlikely(next == POOL_BUSY)) { - __ha_cpu_relax(); - next = _HA_ATOMIC_LOAD(&pool->buckets[bucket].free_list); - } + while (unlikely(next == POOL_BUSY)) + next = (void*)pl_wait_new_long((ulong*)&pool->buckets[bucket].free_list, (ulong)next); + if (next == NULL) break; } while (unlikely((next = _HA_ATOMIC_XCHG(&pool->buckets[bucket].free_list, POOL_BUSY)) == POOL_BUSY)); -- 2.39.5