summaryrefslogtreecommitdiff
path: root/open_issues/fork_deadlock.mdwn
diff options
context:
space:
mode:
authorThomas Schwinge <thomas@codesourcery.com>2013-02-19 22:49:00 +0100
committerThomas Schwinge <thomas@codesourcery.com>2013-02-19 22:49:00 +0100
commit3ec364ce867cd9835cc3394e596cf732e8c22da3 (patch)
tree240f48fab03a272272497a02e42f365357429d08 /open_issues/fork_deadlock.mdwn
parentf77b08096039bdfdb567e2389fbae3b4a49eead2 (diff)
open_issues/fork_deadlock: And again.
Diffstat (limited to 'open_issues/fork_deadlock.mdwn')
-rw-r--r--open_issues/fork_deadlock.mdwn120
1 files changed, 120 insertions, 0 deletions
diff --git a/open_issues/fork_deadlock.mdwn b/open_issues/fork_deadlock.mdwn
index 884ee601..08e53330 100644
--- a/open_issues/fork_deadlock.mdwn
+++ b/open_issues/fork_deadlock.mdwn
@@ -3444,3 +3444,123 @@ This time, it's our own sigstate, not the global one:
(gdb) print _hurd_global_sigstate
$1 = (struct hurd_sigstate *) 0x1219808
+
+
+## 2013-02-19
+
+Reproduced the 2013-02-08 findings with Richard's `2.13-39+hurd.rbraun.6`
+packages (but doesn't seem related to the issues he's working on), which
+includes the hack from the email above, after a GCC build's `make` has been
+running for 14.25 h (so very near the end of the build, darn):
+
+ PID UID PPID PGrp Sess TH Vmem RSS %CPU User System Args
+ 2792 1000 2773 1728 409 2 146M 1.19M 0.0 0:00.20 0:00.80 /bin/dash /home/thomas/tmp/gcc/hurd/master/libatomic/configure --cache-fil
+ 3839 1000 2792 1728 409 2 146M 532K 0.0 0:00.00 0:00.00 /bin/dash /home/thomas/tmp/gcc/hurd/master/libatomic/configure --cache-fil
+ 3841 1000 3839 1728 409 2 146M 272K 95.4 4:13.12 5hrs /bin/dash /home/thomas/tmp/gcc/hurd/master/libatomic/configure --cache-fil
+
+ #0 0x0105a87c in swtch_pri () at /home/rbraun/devel/debian/packages/eglibc/eglibc-2.13/build-tree/hurd-i386-libc/mach/swtch_pri.S:2
+ No locals.
+ #1 0x0105c104 in __spin_lock_solid (lock=0x121d00c) at spin-solid.c:27
+ No locals.
+ #2 0x01070f43 in __spin_lock (__lock=<optimized out>) at ../mach/lock-intern.h:55
+ No locals.
+ #3 _hurd_sigstate_lock (ss=0x121d008) at hurdsig.c:174
+ No locals.
+ #4 0x0110e66c in _hurd_critical_section_unlock (our_lock=<optimized out>) at ../hurd/hurd/signal.h:235
+ No locals.
+ #5 __fork () at ../sysdeps/mach/hurd/fork.c:716
+ env = {{__jmpbuf = {18694132, 18989000, 134637636, 16926072, 16925700, 17883231}, __mask_was_saved = 0, __saved_mask = 4294967295}}
+ pid = 0
+ err = <optimized out>
+ __PRETTY_FUNCTION__ = "__fork"
+ ss = 0x121d008
+ threads = 0x0
+ nthreads = 0
+ stopped = 1
+ i = 6
+ [...]
+ (gdb) frame 5
+ #5 __fork () at ../sysdeps/mach/hurd/fork.c:716
+ warning: Source file is more recent than executable.
+ 716 _hurd_critical_section_unlock (ss);
+ (gdb) list
+ 711 ! symbol_set_end_p (_hurd_fork_locks, p);
+ 712 ++p)
+ 713 __mutex_unlock (*p);
+ 714 }
+ 715
+ 716 _hurd_critical_section_unlock (ss);
+ 717
+ 718 return err ? __hurd_fail (err) : pid;
+ 719 }
+ 720 libc_hidden_def (__fork)
+ (gdb) frame 4
+ #4 0x0110e66c in _hurd_critical_section_unlock (our_lock=<optimized out>) at ../hurd/hurd/signal.h:235
+ warning: Source file is more recent than executable.
+ 235 _hurd_sigstate_lock (ss);
+ (gdb) list
+ 230 else
+ 231 {
+ 232 /* It was us who acquired the critical section lock. Unlock it. */
+ 233 struct hurd_sigstate *ss = (struct hurd_sigstate *) our_lock;
+ 234 sigset_t pending;
+ 235 _hurd_sigstate_lock (ss);
+ 236 __spin_unlock (&ss->critical_section_lock);
+ 237 pending = _hurd_sigstate_pending(ss) & ~ss->blocked;
+ 238 _hurd_sigstate_unlock (ss);
+ 239 if (! __sigisemptyset (&pending))
+ (gdb) frame 3
+ #3 _hurd_sigstate_lock (ss=0x121d008) at hurdsig.c:174
+ warning: Source file is more recent than executable.
+ 174 __spin_lock (&ss->lock);
+ (gdb) list
+ 169 void
+ 170 _hurd_sigstate_lock (struct hurd_sigstate *ss)
+ 171 {
+ 172 if (sigstate_is_global_rcv (ss))
+ 173 __spin_lock (&_hurd_global_sigstate->lock);
+ 174 __spin_lock (&ss->lock);
+ 175 }
+ 176 void
+ 177 _hurd_sigstate_unlock (struct hurd_sigstate *ss)
+ 178 {
+ (gdb) print _hurd_global_sigstate
+ $1 = (struct hurd_sigstate *) 0x121d808
+ (gdb) print *_hurd_global_sigstate
+ $2 = {critical_section_lock = 0, lock = 1, thread = 0, next = 0x0, blocked = 4294967295, pending = 0, actions = {{__sigaction_handler = {
+ sa_handler = 0, sa_sigaction = 0}, sa_mask = 0, sa_flags = 2}, {__sigaction_handler = {sa_handler = 0, sa_sigaction = 0},
+ sa_mask = 4294967295, sa_flags = 0}, {__sigaction_handler = {sa_handler = 0, sa_sigaction = 0}, sa_mask = 4294967295, sa_flags = 0}, {
+ __sigaction_handler = {sa_handler = 0, sa_sigaction = 0}, sa_mask = 4294967295, sa_flags = 0}, {__sigaction_handler = {sa_handler = 0,
+ sa_sigaction = 0}, sa_mask = 0, sa_flags = 2}, {__sigaction_handler = {sa_handler = 0, sa_sigaction = 0}, sa_mask = 0, sa_flags = 2}, {
+ __sigaction_handler = {sa_handler = 0, sa_sigaction = 0}, sa_mask = 0, sa_flags = 2}, {__sigaction_handler = {sa_handler = 0,
+ sa_sigaction = 0}, sa_mask = 0, sa_flags = 2}, {__sigaction_handler = {sa_handler = 0, sa_sigaction = 0}, sa_mask = 0, sa_flags = 2}, {
+ __sigaction_handler = {sa_handler = 0, sa_sigaction = 0}, sa_mask = 0, sa_flags = 2}, {__sigaction_handler = {sa_handler = 0,
+ sa_sigaction = 0}, sa_mask = 0, sa_flags = 2}, {__sigaction_handler = {sa_handler = 0, sa_sigaction = 0}, sa_mask = 0, sa_flags = 2}, {
+ __sigaction_handler = {sa_handler = 0, sa_sigaction = 0}, sa_mask = 0, sa_flags = 2}, {__sigaction_handler = {sa_handler = 0,
+ sa_sigaction = 0}, sa_mask = 4294967295, sa_flags = 0}, {__sigaction_handler = {sa_handler = 0, sa_sigaction = 0}, sa_mask = 0,
+ sa_flags = 2}, {__sigaction_handler = {sa_handler = 0, sa_sigaction = 0}, sa_mask = 4294967295, sa_flags = 0}, {__sigaction_handler = {
+ sa_handler = 0, sa_sigaction = 0}, sa_mask = 0, sa_flags = 2}, {__sigaction_handler = {sa_handler = 0, sa_sigaction = 0}, sa_mask = 0,
+ sa_flags = 2}, {__sigaction_handler = {sa_handler = 0, sa_sigaction = 0}, sa_mask = 0, sa_flags = 2}, {__sigaction_handler = {
+ sa_handler = 0, sa_sigaction = 0}, sa_mask = 0, sa_flags = 2}, {__sigaction_handler = {sa_handler = 0x80564f0,
+ sa_sigaction = 0x80564f0}, sa_mask = 4294967295, sa_flags = 0}, {__sigaction_handler = {sa_handler = 0, sa_sigaction = 0},
+ sa_mask = 0, sa_flags = 2} <repeats 12 times>}, sigaltstack = {ss_sp = 0x0, ss_size = 0, ss_flags = 0}, preemptors = 0x0,
+ pending_data = {{exc = 0, exc_code = 0, exc_subcode = 0, code = 0, error = 0} <repeats 33 times>}, suspended = 0, intr_port = 0,
+ context = 0x0, active_resources = 0x0, cancel = 0, cancel_hook = 0}
+ (gdb) print ss
+ $3 = (struct hurd_sigstate *) 0x121d008
+ (gdb) print *ss
+ $4 = {critical_section_lock = 1, lock = 1, thread = 73, next = 0x1227808, blocked = 0, pending = 0, actions = {{__sigaction_handler = {
+ sa_handler = 0x1, sa_sigaction = 0x1}, sa_mask = 0, sa_flags = 2}, {__sigaction_handler = {sa_handler = 0, sa_sigaction = 0},
+ sa_mask = 0, sa_flags = 2} <repeats 32 times>}, sigaltstack = {ss_sp = 0x0, ss_size = 0, ss_flags = 0}, preemptors = 0x0,
+ pending_data = {{exc = 0, exc_code = 0, exc_subcode = 0, code = 0, error = 0} <repeats 20 times>, {exc = 0, exc_code = 19025712,
+ exc_subcode = 85056, code = 1, error = 17257936}, {exc = 0, exc_code = 0, exc_subcode = 0, code = 0, error = 0} <repeats 12 times>},
+ suspended = 0, intr_port = 0, context = 0x0, active_resources = 0x0, cancel = 0, cancel_hook = 0}
+ (gdb) print ss->next
+ $5 = (struct hurd_sigstate *) 0x1227808
+ (gdb) print *ss->next
+ $6 = {critical_section_lock = 0, lock = 0, thread = 76, next = 0x0, blocked = 0, pending = 0, actions = {{__sigaction_handler = {
+ sa_handler = 0, sa_sigaction = 0}, sa_mask = 0, sa_flags = 2} <repeats 33 times>}, sigaltstack = {ss_sp = 0x0, ss_size = 0,
+ ss_flags = 0}, preemptors = 0x0, pending_data = {{exc = 0, exc_code = 0, exc_subcode = 0, code = 0, error = 0} <repeats 33 times>},
+ suspended = 0, intr_port = 0, context = 0x0, active_resources = 0x0, cancel = 0, cancel_hook = 0}
+
+So again, it's our own sigstate that already is locked, not the global one.