svn commit: r215664 - in head/sys: compat/linux kern
Alexander Leidinger
netchild at FreeBSD.org
Mon Nov 22 10:29:16 UTC 2010
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---
> 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?
Bye,
Alexander.
--
http://www.Leidinger.net Alexander @ Leidinger.net: PGP ID = B0063FE7
http://www.FreeBSD.org netchild @ FreeBSD.org : PGP ID = 72077137
This generation doesn't have emotional baggage.
We have emotional moving vans.
-- Bruce Feirstein
More information about the svn-src-head
mailing list