This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[RFC PATCH Userspace RCU] Discourage use of pthread_atfork() forcall_rcu handlers
- From: Mathieu Desnoyers <mathieu dot desnoyers at efficios dot com>
- To: "Paul E. McKenney" <paulmck at linux dot vnet dot ibm dot com>,Lai Jiangshan <laijs at cn dot fujitsu dot com>,Alan Stern <stern at rowland dot harvard dot edu>,Stephen Hemminger <shemminger at vyatta dot com>
- Cc: linux-kernel at vger dot kernel dot org, lttng-dev at lists dot lttng dot org,rp at svcs dot cs dot pdx dot edu, libc-alpha at sourceware dot org
- Date: Wed, 26 Dec 2012 12:33:18 -0500
- Subject: [RFC PATCH Userspace RCU] Discourage use of pthread_atfork() forcall_rcu handlers
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.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
---
diff --git a/README b/README
index 83330ea..2d29c1d 100644
--- a/README
+++ b/README
@@ -273,7 +273,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)
--
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com