[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[glibc] 01/02: hurd-i386/cvs-mallocfork.diff: New patch to fix concurrency



This is an automated email from the git hooks/post-receive script.

sthibault pushed a commit to branch sid
in repository glibc.

commit 462e3c3bdbd68511a97921ad5fdacb66f55fe1c4
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date:   Wed Sep 21 23:51:46 2016 +0000

    hurd-i386/cvs-mallocfork.diff: New patch to fix concurrency
    
    between hurd_malloc and fork, triggered by malloc/tst-malloc-fork-deadlock.
---
 debian/changelog                             |   2 +
 debian/patches/hurd-i386/cvs-mallocfork.diff | 132 +++++++++++++++++++++++++++
 debian/patches/series                        |   1 +
 3 files changed, 135 insertions(+)

diff --git a/debian/changelog b/debian/changelog
index e0bf10a..a558e19 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -7,6 +7,8 @@ glibc (2.24-4) UNRELEASED; urgency=medium
   * hurd-i386/tg-hurdsig-fixes.diff: Fix uninitialized value.
   * hurd-i386/submitted-exec_filename.diff: Add missing includes, fix const
     warning.
+  * hurd-i386/cvs-mallocfork.diff: New patch to fix concurrency between
+    hurd_malloc and fork, triggered by malloc/tst-malloc-fork-deadlock.
 
  -- Aurelien Jarno <aurel32@debian.org>  Sat, 17 Sep 2016 20:03:04 +0200
 
diff --git a/debian/patches/hurd-i386/cvs-mallocfork.diff b/debian/patches/hurd-i386/cvs-mallocfork.diff
new file mode 100644
index 0000000..d59de24
--- /dev/null
+++ b/debian/patches/hurd-i386/cvs-mallocfork.diff
@@ -0,0 +1,132 @@
+commit e67f54ab1a6253dd69cb2c770d785c7eb6d2172c
+Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
+Date:   Thu Sep 22 01:45:48 2016 +0200
+
+    hurdmalloc: Run fork handler as late as possible [BZ #19431]
+    
+    This is the hurd-specific follow-up for
+    29d794863cd6e03115d3670707cc873a9965ba92 : hurdmalloc also needs the
+    same fix
+    
+            * hurd/hurdmalloc.c (malloc_fork_prepare): Rename to
+            _hurd_malloc_fork_prepare.
+            (malloc_fork_parent): Rename to _hurd_malloc_fork_parent.
+            (malloc_fork_child): Rename to _hurd_malloc_fork_child.
+            (_hurd_fork_prepare_hook): Drop malloc_fork_prepare.
+            (_hurd_fork_parent_hook): Drop malloc_fork_parent.
+            (_hurd_fork_child_hook): Drop malloc_fork_child.
+            * hurd/hurdmalloc.h (_hurd_malloc_fork_prepare,
+            _hurd_malloc_fork_parent, _hurd_malloc_fork_child): Add declarations.
+            * sysdeps/mach/hurd/fork.c (__fork): Call __malloc_fork_lock_parent
+            after locking locks (notably hurd_dtable_lock). Call
+            _hurd_malloc_fork_prepare after that. Call _hurd_malloc_fork_parent
+            before __malloc_fork_unlock_parent and _hurd_malloc_fork_child before
+            __malloc_fork_unlock_child.
+
+Index: glibc-2.24/hurd/hurdmalloc.c
+===================================================================
+--- glibc-2.24.orig/hurd/hurdmalloc.c
++++ glibc-2.24/hurd/hurdmalloc.c
+@@ -405,8 +405,8 @@ print_malloc_free_list (void)
+ }
+ #endif	/* DEBUG */
+ 
+-static void
+-malloc_fork_prepare(void)
++void
++_hurd_malloc_fork_prepare(void)
+ /*
+  * Prepare the malloc module for a fork by insuring that no thread is in a
+  * malloc critical section.
+@@ -419,8 +419,8 @@ malloc_fork_prepare(void)
+     }
+ }
+ 
+-static void
+-malloc_fork_parent(void)
++void
++_hurd_malloc_fork_parent(void)
+ /*
+  * Called in the parent process after a fork() to resume normal operation.
+  */
+@@ -432,8 +432,8 @@ malloc_fork_parent(void)
+     }
+ }
+ 
+-static void
+-malloc_fork_child(void)
++void
++_hurd_malloc_fork_child(void)
+ /*
+  * Called in the child process after a fork() to resume normal operation.
+  */
+@@ -446,7 +446,4 @@ malloc_fork_child(void)
+ }
+ 
+ 
+-text_set_element (_hurd_fork_prepare_hook, malloc_fork_prepare);
+-text_set_element (_hurd_fork_parent_hook, malloc_fork_parent);
+-text_set_element (_hurd_fork_child_hook, malloc_fork_child);
+ text_set_element (_hurd_preinit_hook, malloc_init);
+Index: glibc-2.24/hurd/hurdmalloc.h
+===================================================================
+--- glibc-2.24.orig/hurd/hurdmalloc.h
++++ glibc-2.24/hurd/hurdmalloc.h
+@@ -12,6 +12,10 @@ extern void *_hurd_malloc (size_t);
+ extern void *_hurd_realloc (void *, size_t);
+ extern void _hurd_free (void *);
+ 
++extern void _hurd_malloc_fork_prepare (void);
++extern void _hurd_malloc_fork_parent (void);
++extern void _hurd_malloc_fork_child (void);
++
+ #define malloc	_hurd_malloc
+ #define realloc	_hurd_realloc
+ #define free	_hurd_free
+Index: glibc-2.24/sysdeps/mach/hurd/fork.c
+===================================================================
+--- glibc-2.24.orig/sysdeps/mach/hurd/fork.c
++++ glibc-2.24/sysdeps/mach/hurd/fork.c
+@@ -109,12 +109,6 @@ __fork (void)
+       /* Run things that prepare for forking before we create the task.  */
+       RUN_HOOK (_hurd_fork_prepare_hook, ());
+ 
+-      /* Acquire malloc locks.  This needs to come last because fork
+-	 handlers may use malloc, and the libio list lock has an
+-	 indirect malloc dependency as well (via the getdelim
+-	 function).  */
+-      __malloc_fork_lock_parent ();
+-
+       /* Lock things that want to be locked before we fork.  */
+       {
+ 	void *const *p;
+@@ -125,6 +119,13 @@ __fork (void)
+       }
+       __mutex_lock (&_hurd_siglock);
+ 
++      /* Acquire malloc locks.  This needs to come last because fork
++	 handlers may use malloc, and the libio list lock has an
++	 indirect malloc dependency as well (via the getdelim
++	 function).  */
++      __malloc_fork_lock_parent ();
++      _hurd_malloc_fork_prepare ();
++
+       newtask = MACH_PORT_NULL;
+       thread = sigthread = MACH_PORT_NULL;
+       newproc = MACH_PORT_NULL;
+@@ -617,6 +618,7 @@ __fork (void)
+ 	}
+ 
+       /* Release malloc locks.  */
++      _hurd_malloc_fork_parent ();
+       __malloc_fork_unlock_parent ();
+ 
+       /* Run things that want to run in the parent to restore it to
+@@ -688,6 +690,7 @@ __fork (void)
+       __sigemptyset (&ss->pending);
+ 
+       /* Release malloc locks.  */
++      _hurd_malloc_fork_child ();
+       __malloc_fork_unlock_child ();
+ 
+       /* Run things that want to run in the child task to set up.  */
diff --git a/debian/patches/series b/debian/patches/series
index dfeadce..def94a3 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -142,6 +142,7 @@ hurd-i386/tg-eintr.diff
 hurd-i386/git-recvmsg.diff
 hurd-i386/tg-gsync-libc.diff
 hurd-i386/cvs-adjtime-NULL.diff
+hurd-i386/cvs-mallocfork.diff
 
 i386/local-biarch.diff
 i386/local-cmov.diff

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-glibc/glibc.git


Reply to: