svn commit: r215664 - in head/sys: compat/linux kern
Kostik Belousov
kostikbel at gmail.com
Mon Nov 22 10:42:36 UTC 2010
On Mon, Nov 22, 2010 at 11:13:06AM +0100, Alexander Leidinger wrote:
> Quoting Kostik Belousov <kostikbel at gmail.com> (from Mon, 22 Nov 2010
> 11:31:34 +0200):
>
> >On Mon, Nov 22, 2010 at 09:07:00AM +0000, Alexander Leidinger wrote:
> >>Author: netchild
> >>Date: Mon Nov 22 09:06:59 2010
> >>New Revision: 215664
> >>URL: http://svn.freebsd.org/changeset/base/215664
> >>
> >>Log:
> >> By using the 32-bit Linux version of Sun's Java Development Kit 1.6
> >> on FreeBSD (amd64), invocations of "javac" (or "java") eventually
> >> end with the output of "Killed" and exit code 137.
>
>
> >>@@ -196,6 +198,12 @@ linux_proc_exit(void *arg __unused, stru
> >> } else
> >> EMUL_SHARED_WUNLOCK(&emul_shared_lock);
> >>
> >>+ if ((shared_flags & EMUL_SHARED_HASXSTAT) != 0) {
> >>+ PROC_LOCK(p);
> >>+ p->p_xstat = shared_xstat;
> >>+ PROC_UNLOCK(p);
> >>+ }
> >Why is process lock taken there ? The assignment to u_short inside the
> >properly aligned structure is atomic on all supported architectures, and
> >the thread that should see side-effect of assignment is the same thread
> >that does assignment.
>
> Change below.
>
> >>+
> >> if (child_clear_tid != NULL) {
> >> struct linux_sys_futex_args cup;
> >> int null = 0;
> >>@@ -257,6 +265,9 @@ linux_proc_exec(void *arg __unused, stru
> >> if (__predict_false(imgp->sysent == &elf_linux_sysvec
> >> && p->p_sysent != &elf_linux_sysvec))
> >> linux_proc_init(FIRST_THREAD_IN_PROC(p), p->p_pid, 0);
> >>+ if (__predict_false(p->p_sysent == &elf_linux_sysvec))
> >>+ /* Kill threads regardless of imgp->sysent value */
> >>+ linux_kill_threads(FIRST_THREAD_IN_PROC(p), SIGKILL);
> >This is better expressed by
> > if ((p->p_sysent->sv_flags & SV_ABI_MASK) == SV_ABI_LINUX)
>
> Is this OK for you?
> ---snip---
> Index: compat/linux/linux_emul.c
> ===================================================================
> --- compat/linux/linux_emul.c (Revision 215664)
> +++ compat/linux/linux_emul.c (Arbeitskopie)
> @@ -198,11 +198,8 @@
> } else
> EMUL_SHARED_WUNLOCK(&emul_shared_lock);
>
> - if ((shared_flags & EMUL_SHARED_HASXSTAT) != 0) {
> - PROC_LOCK(p);
> + if ((shared_flags & EMUL_SHARED_HASXSTAT) != 0)
> p->p_xstat = shared_xstat;
> - PROC_UNLOCK(p);
> - }
>
> if (child_clear_tid != NULL) {
> struct linux_sys_futex_args cup;
> @@ -265,7 +262,8 @@
> if (__predict_false(imgp->sysent == &elf_linux_sysvec
> && p->p_sysent != &elf_linux_sysvec))
> linux_proc_init(FIRST_THREAD_IN_PROC(p), p->p_pid, 0);
> - if (__predict_false(p->p_sysent == &elf_linux_sysvec))
> + if (__predict_false((p->p_sysent->sv_flags & SV_ABI_MASK) ==
> + SV_ABI_LINUX))
> /* Kill threads regardless of imgp->sysent value */
> linux_kill_threads(FIRST_THREAD_IN_PROC(p), SIGKILL);
> if (__predict_false(imgp->sysent != &elf_linux_sysvec
> ---snip---
Yes.
>
> >Regardless of this mostly cosmetic issue, this is racy. Other
> >linux thread in the same process might do an execve(3).
> >More, if execve(3) call fails, then you return into the process
> >that lacks all threads except the one that called execve(3).
>
> How critical is this in your opinion (relative to the issue this patch
> is fixing)? Do you prefer a backout or do you think the probability
> that the someone wins the race is low enough?
>
> Do you see a solution for the race?
I did not asked for backout, nor I am asking now.
Most likely, the semantic of linux thread groups cannot be implemented
by only using event handlers that linux.ko hooks now. How linux handles
single-threading when doing execve(2) from multithreaded process ?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 196 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/svn-src-all/attachments/20101122/414e8b7a/attachment.pgp
More information about the svn-src-all
mailing list