From: David Carlier Date: Thu, 25 Nov 2021 16:14:38 +0000 (+0000) Subject: MEDIUM: pool: support purging jemalloc arenas in trim_all_pools() X-Git-Tag: v2.6-dev1~364 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d450ff636c00da113e6069648e63824245deaad9;p=thirdparty%2Fhaproxy.git MEDIUM: pool: support purging jemalloc arenas in trim_all_pools() In the case of Linux/glibc, falling back to malloc_trim if jemalloc had not been detected beforehand. --- diff --git a/src/pool.c b/src/pool.c index 514a53e12f..1d4f2dfbcc 100644 --- a/src/pool.c +++ b/src/pool.c @@ -48,10 +48,23 @@ static int(*my_mallctl)(const char *, void *, size_t *, void *, size_t) = NULL; /* ask the allocator to trim memory pools */ static void trim_all_pools(void) { + if (my_mallctl) { + unsigned int i, narenas = 0; + size_t len = sizeof(narenas); + + if (my_mallctl("arenas.narenas", &narenas, &len, NULL, 0) == 0) { + for (i = 0; i < narenas; i ++) { + char mib[32] = {0}; + snprintf(mib, sizeof(mib), "arena.%u.purge", i); + (void)my_mallctl(mib, NULL, NULL, NULL, 0); + } + } + } else { #if defined(HA_HAVE_MALLOC_TRIM) - if (using_default_allocator) - malloc_trim(0); + if (using_default_allocator) + malloc_trim(0); #endif + } } /* check if we're using the same allocator as the one that provides