]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: pools: call pool_alloc_nocache() out of the pool's lock
authorWilly Tarreau <w@1wt.eu>
Thu, 15 Apr 2021 17:38:42 +0000 (19:38 +0200)
committerWilly Tarreau <w@1wt.eu>
Mon, 19 Apr 2021 13:24:33 +0000 (15:24 +0200)
In __pool_alloc(), historically we used to use factor out the
pool's lock between __pool_get_first() and __pool_refill_alloc(),
resulting in real malloc() or mmap() calls being performed under
the pool lock (for platforms using the locked shared pools).

As this is not needed anymore, let's move the call out of the
lock, it may improve allocation patterns on some platforms. This
also makes __pool_alloc() cleaner as we see a first attempt to
allocate from the local cache, then a second from the shared
cache then a reall allocation.

include/haproxy/pool.h

index a62a93b39e332bb4a3192673e137cacf6c362e97..876668763f47721d67fefa2d36567ea53cd8fe51 100644 (file)
@@ -277,11 +277,12 @@ static inline void *__pool_alloc(struct pool_head *pool, unsigned int flags)
 #if !defined(CONFIG_HAP_LOCKLESS_POOLS) && !defined(CONFIG_HAP_NO_GLOBAL_POOLS)
        HA_SPIN_LOCK(POOL_LOCK, &pool->lock);
 #endif
-       if ((p = __pool_get_first(pool)) == NULL)
-               p = pool_alloc_nocache(pool);
+       p = __pool_get_first(pool);
 #if !defined(CONFIG_HAP_LOCKLESS_POOLS) && !defined(CONFIG_HAP_NO_GLOBAL_POOLS)
        HA_SPIN_UNLOCK(POOL_LOCK, &pool->lock);
 #endif
+       if (!p)
+               p = pool_alloc_nocache(pool);
  ret:
        if (p) {
                if (flags & POOL_F_MUST_ZERO)