Discourage use of pthread_atfork() for call_rcu handlers
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 26 Dec 2012 17:18:06 +0000 (12:18 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 9 Jan 2013 18:08:00 +0000 (13:08 -0500)
Discourage use of glibc pthread_atfork() for call_rcu handlers due to
its inappropriate assumptions about single-threadedness while pthread
atfork handlers are executing. This results in hangs within the glibc
memory allocator.

Reviewed-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
README

diff --git a/README b/README
index 72d92706a95505ba687177e415d84c3e1edd2d5a..d7dde388b453efe8bdf71fe2d015b9ef73466abd 100644 (file)
--- a/README
+++ b/README
@@ -259,7 +259,20 @@ Interaction with fork()
        must invoke call_rcu_before_fork() before the fork() and
        call_rcu_after_fork_parent() after the fork().  The child
        process must invoke call_rcu_after_fork_child().
-       These three APIs are suitable for passing to pthread_atfork().
+       Even though these three APIs are suitable for passing to
+       pthread_atfork(), use of pthread_atfork() is *STRONGLY
+       DISCOURAGED* for programs calling the glibc memory allocator
+       (malloc(), calloc(), free(), ...) within call_rcu callbacks.
+       This is due to limitations in the way glibc memory allocator
+       handles calls to the memory allocator from concurrent threads
+       while the pthread_atfork() handlers are executing.
+       Combining e.g.:
+       * call to free() from callbacks executed within call_rcu worker
+         threads,
+       * executing call_rcu atfork handlers within the glibc pthread
+         atfork mechanism,
+       will sometimes trigger interesting process hangs. This usually
+       hangs on a memory allocator lock within glibc.
 
 Thread Local Storage (TLS)
 
This page took 0.025743 seconds and 4 git commands to generate.