From: Ondřej Surý Date: Tue, 27 Jun 2023 06:26:12 +0000 (+0200) Subject: Call rcu_barrier() five times in the isc__mem_destroy() X-Git-Tag: v9.19.16~14^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c1821ccf920a44d67284be462bb0ca6729235ef1;p=thirdparty%2Fbind9.git Call rcu_barrier() five times in the isc__mem_destroy() Because rcu_barrier() needs to be called as many times as the number of nested call_rcu() calls (call_rcu() calls made from call_rcu thread), and currently there's no mechanism to detect whether there are more call_rcu callbacks scheduled, we simply call the rcu_barrier() multiple times. The overhead is negligible and it prevents rare assertion failures caused by the check for memory leaks in isc__mem_destroy(). --- diff --git a/lib/isc/mem.c b/lib/isc/mem.c index 593b6108904..b03e1122d0b 100644 --- a/lib/isc/mem.c +++ b/lib/isc/mem.c @@ -582,9 +582,25 @@ isc__mem_destroy(isc_mem_t **ctxp FLARG) { /* * wait for asynchronous memory reclamation to complete - * before checking for memory leaks + * before checking for memory leaks. + * + * Because rcu_barrier() needs to be called as many times + * as the number of nested call_rcu() calls (call_rcu() + * calls made from call_rcu thread), and currently there's + * no mechanism to detect whether there are more call_rcu + * callbacks scheduled, we simply call the rcu_barrier() + * multiple times. The overhead is negligible and it + * prevents rare assertion failures caused by the check + * for memory leaks below. + * + * If there's more nested call_rcu() calls than five levels, + * we are doing something horribly wrong... */ rcu_barrier(); + rcu_barrier(); + rcu_barrier(); + rcu_barrier(); + rcu_barrier(); #if ISC_MEM_TRACKLINES if ((ctx->debugging & ISC_MEM_DEBUGTRACE) != 0) {