Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Oct 2003 01:00:38 +0300
From:      Alexey Zelkin <phantom@freebsd.org>
To:        threads@freebsd.org
Subject:   libc_r & direct usage of syscalls
Message-ID:  <20031023010038.A71141@phantom.cris.net>

next in thread | raw e-mail | index | archive | help
hi,

Some of you may remember a story about strange problems I had
with native jdk14 and fork() calls.

In few words -- sometimes, in absolutely random order JVM just after
call to fork() function become unusable due to SIGBUS signal storm
(JVM signal handler decided that this signal is not fatal and did not
stop an application).

Today I have completely tracked it down.  Or correctly to say
got a 100% reproducible .java testcase and wrote few more .c testcases in
order to prove my point of view.

JVM is using internally usual stack protection logic.  Every two pages on
borders of stack are protected with mmap().  When something accesses
it SIGBUS is generated and signal handler forces overflowing thread
to rollback some operation until it may safely continue its job.

fork() is special case here.  When fork() is called, child process
is need to reinitialize a libc_r internal state (this job is done by
fork() wrapper located in libc_r/uthread/uthread_fork.c).  One of steps
of reinitialization process is free()'ing of pthreads stacks.  Caveat here
is unchanged protections on stack pages.  Right after some stacks are
free()'ed, malloc internal (struct pginfo *) info got allocated into
protected region and this info being changed we get a big *KABOOM* (i.e.
SIGBUS).

Original code looked like:

[..]

pid = fork();
if (pid == 0) {
	make_pipes();
	close_descriptors();
	execvp();
}

[..]

Signal was arisen exactly while fork() in all cases.

I changed it into:

[..]

pthread_suspend_all_np();
pid = __sys_fork();
if (pid == 0) {
	make_pipes();
	close_descriptors();
	execvp();
}
pthread_resume_all_np();

[..]

Per my overview I should not expect problems with libc_r at -STABLE.  But
I am worrying about -CURRENT (espessially KSE) -- may such hack have
side effects ?

Comments and any input on potential problems is welcome!

PS:  This description maybe useful to somebody who also affected by
     same scenario (stack protections + libc_r's fork()), so I provide
     example of backtrace which is signaling about a problem:

: #0  0xbfbfffa8 in ?? ()
: #1  0x280f7b1d in free (ptr=0x828d000)
:     at /home/phantom/src/lib/libc_r/../libc/stdlib/malloc.c:1096
: #2  0x280b4b57 in _fork ()
:     at /home/phantom/src/lib/libc_r/uthread/uthread_fork.c:154
[..]



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