Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 21 Mar 2016 06:52:35 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r297141 - head/lib/libthr/thread
Message-ID:  <201603210652.u2L6qZRi058776@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Mon Mar 21 06:52:35 2016
New Revision: 297141
URL: https://svnweb.freebsd.org/changeset/base/297141

Log:
  Lock pshared_lock shared around fork, to ensure that the COW snapshot
  of the pshared hash in child is consistent and can be safely used.
  
  Reported and tested by:	"Oleg V. Nauman" <oleg@opentransfer.com>
  Sponsored by:	The FreeBSD Foundation

Modified:
  head/lib/libthr/thread/thr_fork.c
  head/lib/libthr/thread/thr_init.c
  head/lib/libthr/thread/thr_private.h
  head/lib/libthr/thread/thr_pshared.c

Modified: head/lib/libthr/thread/thr_fork.c
==============================================================================
--- head/lib/libthr/thread/thr_fork.c	Mon Mar 21 06:48:11 2016	(r297140)
+++ head/lib/libthr/thread/thr_fork.c	Mon Mar 21 06:52:35 2016	(r297141)
@@ -168,6 +168,7 @@ __thr_fork(void)
 	if (_thr_isthreaded() != 0) {
 		was_threaded = 1;
 		_malloc_prefork();
+		__thr_pshared_atfork_pre();
 		_rtld_atfork_pre(rtld_locks);
 	} else {
 		was_threaded = 0;
@@ -202,8 +203,10 @@ __thr_fork(void)
 
 		_thr_signal_postfork_child();
 
-		if (was_threaded)
+		if (was_threaded) {
 			_rtld_atfork_post(rtld_locks);
+			__thr_pshared_atfork_post();
+		}
 		_thr_setthreaded(0);
 
 		/* reinitalize library. */
@@ -236,6 +239,7 @@ __thr_fork(void)
 
 		if (was_threaded) {
 			_rtld_atfork_post(rtld_locks);
+			__thr_pshared_atfork_post();
 			_malloc_postfork();
 		}
 

Modified: head/lib/libthr/thread/thr_init.c
==============================================================================
--- head/lib/libthr/thread/thr_init.c	Mon Mar 21 06:48:11 2016	(r297140)
+++ head/lib/libthr/thread/thr_init.c	Mon Mar 21 06:52:35 2016	(r297141)
@@ -445,7 +445,6 @@ init_private(void)
 	_thr_once_init();
 	_thr_spinlock_init();
 	_thr_list_init();
-	__thr_pshared_init();
 	_thr_wake_addr_init();
 	_sleepq_init();
 	_single_thread = NULL;
@@ -456,6 +455,7 @@ init_private(void)
 	 * e.g. after a fork().
 	 */
 	if (init_once == 0) {
+		__thr_pshared_init();
 		/* Find the stack top */
 		mib[0] = CTL_KERN;
 		mib[1] = KERN_USRSTACK;

Modified: head/lib/libthr/thread/thr_private.h
==============================================================================
--- head/lib/libthr/thread/thr_private.h	Mon Mar 21 06:48:11 2016	(r297140)
+++ head/lib/libthr/thread/thr_private.h	Mon Mar 21 06:52:35 2016	(r297141)
@@ -952,6 +952,8 @@ void	_tcb_dtor(struct tcb *);
 void __thr_pshared_init(void) __hidden;
 void *__thr_pshared_offpage(void *key, int doalloc) __hidden;
 void __thr_pshared_destroy(void *key) __hidden;
+void __thr_pshared_atfork_pre(void) __hidden;
+void __thr_pshared_atfork_post(void) __hidden;
 
 __END_DECLS
 

Modified: head/lib/libthr/thread/thr_pshared.c
==============================================================================
--- head/lib/libthr/thread/thr_pshared.c	Mon Mar 21 06:48:11 2016	(r297140)
+++ head/lib/libthr/thread/thr_pshared.c	Mon Mar 21 06:52:35 2016	(r297141)
@@ -252,3 +252,17 @@ __thr_pshared_destroy(void *key)
 	pshared_clean(key, val);
 	pshared_gc(curthread);
 }
+
+void
+__thr_pshared_atfork_pre(void)
+{
+
+	_thr_rwl_rdlock(&pshared_lock);
+}
+
+void
+__thr_pshared_atfork_post(void)
+{
+
+	_thr_rwl_unlock(&pshared_lock);
+}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201603210652.u2L6qZRi058776>