summaryrefslogtreecommitdiff
path: root/ChangeLog
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2016-04-14 09:17:02 +0200
committerFlorian Weimer <fweimer@redhat.com>2016-04-14 09:17:02 +0200
commit29d794863cd6e03115d3670707cc873a9965ba92 (patch)
treef5d714f3857f3c2f2468c9f9977fcefc2be75cfb /ChangeLog
parentb49ab5f4503f36dcbf43f821f817da66b2931fe6 (diff)
downloadglibc-29d794863cd6e03115d3670707cc873a9965ba92.tar.gz
malloc: Run fork handler as late as possible [BZ #19431]
Previously, a thread M invoking fork would acquire locks in this order: (M1) malloc arena locks (in the registered fork handler) (M2) libio list lock A thread F invoking flush (NULL) would acquire locks in this order: (F1) libio list lock (F2) individual _IO_FILE locks A thread G running getdelim would use this order: (G1) _IO_FILE lock (G2) malloc arena lock After executing (M1), (F1), (G1), none of the threads can make progress. This commit changes the fork lock order to: (M'1) libio list lock (M'2) malloc arena locks It explicitly encodes the lock order in the implementations of fork, and does not rely on the registration order, thus avoiding the deadlock.
Diffstat (limited to 'ChangeLog')
-rw-r--r--ChangeLog24
1 files changed, 24 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 304171b55c..e143af4062 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,29 @@
2016-04-14 Florian Weimer <fweimer@redhat.com>
+ [BZ #19431]
+ Run the malloc fork handler as late as possible to avoid deadlocks.
+ * malloc/malloc-internal.h: New file.
+ * malloc/malloc.c: Include it.
+ * malloc/arena.c (ATFORK_MEM): Remove.
+ (__malloc_fork_lock_parent): Rename from ptmalloc_lock_all.
+ Update comment.
+ (__malloc_fork_unlock_parent): Rename from ptmalloc_unlock_all.
+ (__malloc_fork_unlock_child): Rename from ptmalloc_unlock_all2.
+ Remove outdated comment.
+ (ptmalloc_init): Do not call thread_atfork. Remove
+ thread_atfork_static.
+ * malloc/tst-malloc-fork-deadlock.c: New file.
+ * Makefile (tests): Add tst-malloc-fork-deadlock.
+ (tst-malloc-fork-deadlock): Link against libpthread.
+ * manual/memory.texi (Aligned Memory Blocks): Update safety
+ annotation comments.
+ * sysdeps/nptl/fork.c (__libc_fork): Call
+ __malloc_fork_lock_parent, __malloc_fork_unlock_parent,
+ __malloc_fork_unlock_child.
+ * sysdeps/mach/hurd/fork.c (__fork): Likewise.
+
+2016-04-14 Florian Weimer <fweimer@redhat.com>
+
[BZ #19613]
Remove union wait.
* bits/waitstatus.h (union wait, w_termsig, w_coredump, w_retcode)