From 3b5cfb28e1549a4f67cda6a1d336817f71e7f491 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 21 Nov 2024 11:27:52 +0100 Subject: [PATCH] MINOR: activity/memprofile: offer a function to unregister stale info There's actually a problem with memprofiles: the pool pointer is stored in ->info but some pools are replaced during startup, such as the trash pool, leaving a dangling pointer there. Let's complete the API with a new function memprof_remove_stale_info() that will remove all stale references to this info pointer. It's also present when USE_MEMORY_PROFILING is not set so as to ease the job on callers. (cherry picked from commit 859341c1ec583c586ef36db0b63cd84f3843bfab) Signed-off-by: Christopher Faulet --- include/haproxy/activity.h | 6 ++++++ src/activity.c | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/include/haproxy/activity.h b/include/haproxy/activity.h index dbc8ec3..e6cb09b 100644 --- a/include/haproxy/activity.h +++ b/include/haproxy/activity.h @@ -35,6 +35,12 @@ struct sched_activity *sched_activity_entry(struct sched_activity *array, const #ifdef USE_MEMORY_PROFILING struct memprof_stats *memprof_get_bin(const void *ra, enum memprof_method meth); +void memprof_remove_stale_info(const void *info); +#else +static inline void memprof_remove_stale_info(const void *info) +{ + /* nothing to do */ +} #endif #endif /* _HAPROXY_ACTIVITY_H */ diff --git a/src/activity.c b/src/activity.c index d655088..b6939d9 100644 --- a/src/activity.c +++ b/src/activity.c @@ -324,6 +324,23 @@ void free(void *ptr) _HA_ATOMIC_ADD(&bin->free_tot, size_before); } +/* remove info from entries matching . This needs to be used by callers + * of pool_destroy() so that we don't keep a reference to a dead pool. Nothing + * is done if is NULL. + */ +void memprof_remove_stale_info(const void *info) +{ + int i; + + if (!info) + return; + + for (i = 0; i < MEMPROF_HASH_BUCKETS; i++) { + if (_HA_ATOMIC_LOAD(&memprof_stats[i].info) == info) + _HA_ATOMIC_STORE(&memprof_stats[i].info, NULL); + } +} + #endif // USE_MEMORY_PROFILING /* Updates the current thread's statistics about stolen CPU time. The unit for -- 1.7.10.4