Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 22 Nov 2010 12:42:32 +0200
From:      Kostik Belousov <kostikbel@gmail.com>
To:        Alexander Leidinger <netchild@freebsd.org>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r215664 - in head/sys: compat/linux kern
Message-ID:  <20101122104232.GY2392@deviant.kiev.zoral.com.ua>
In-Reply-To: <20101122111306.16504je0tt7xe5us@webmail.leidinger.net>
References:  <201011220907.oAM970To084256@svn.freebsd.org> <20101122093134.GU2392@deviant.kiev.zoral.com.ua> <20101122111306.16504je0tt7xe5us@webmail.leidinger.net>

next in thread | previous in thread | raw e-mail | index | archive | help

--YYyN6dyDU9bDiN2J
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Mon, Nov 22, 2010 at 11:13:06AM +0100, Alexander Leidinger wrote:
> Quoting Kostik Belousov <kostikbel@gmail.com> (from Mon, 22 Nov 2010 =20
> 11:31:34 +0200):
>=20
> >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.
>=20
>=20
> >>@@ -196,6 +198,12 @@ linux_proc_exit(void *arg __unused, stru
> >> 	} else
> >> 		EMUL_SHARED_WUNLOCK(&emul_shared_lock);
> >>
> >>+	if ((shared_flags & EMUL_SHARED_HASXSTAT) !=3D 0) {
> >>+		PROC_LOCK(p);
> >>+		p->p_xstat =3D 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.
>=20
> Change below.
>=20
> >>+
> >> 	if (child_clear_tid !=3D NULL) {
> >> 		struct linux_sys_futex_args cup;
> >> 		int null =3D 0;
> >>@@ -257,6 +265,9 @@ linux_proc_exec(void *arg __unused, stru
> >> 	if (__predict_false(imgp->sysent =3D=3D &elf_linux_sysvec
> >> 	    && p->p_sysent !=3D &elf_linux_sysvec))
> >> 		linux_proc_init(FIRST_THREAD_IN_PROC(p), p->p_pid, 0);
> >>+	if (__predict_false(p->p_sysent =3D=3D &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) =3D=3D SV_ABI_LINUX)
>=20
> Is this OK for you?
> ---snip---
> Index: compat/linux/linux_emul.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- compat/linux/linux_emul.c   (Revision 215664)
> +++ compat/linux/linux_emul.c   (Arbeitskopie)
> @@ -198,11 +198,8 @@
>         } else
>                 EMUL_SHARED_WUNLOCK(&emul_shared_lock);
>=20
> -       if ((shared_flags & EMUL_SHARED_HASXSTAT) !=3D 0) {
> -               PROC_LOCK(p);
> +       if ((shared_flags & EMUL_SHARED_HASXSTAT) !=3D 0)
>                 p->p_xstat =3D shared_xstat;
> -               PROC_UNLOCK(p);
> -       }
>=20
>         if (child_clear_tid !=3D NULL) {
>                 struct linux_sys_futex_args cup;
> @@ -265,7 +262,8 @@
>         if (__predict_false(imgp->sysent =3D=3D &elf_linux_sysvec
>             && p->p_sysent !=3D &elf_linux_sysvec))
>                 linux_proc_init(FIRST_THREAD_IN_PROC(p), p->p_pid, 0);
> -       if (__predict_false(p->p_sysent =3D=3D &elf_linux_sysvec))
> +       if (__predict_false((p->p_sysent->sv_flags & SV_ABI_MASK) =3D=3D
> +           SV_ABI_LINUX))
>                 /* Kill threads regardless of imgp->sysent value */
>                 linux_kill_threads(FIRST_THREAD_IN_PROC(p), SIGKILL);
>         if (__predict_false(imgp->sysent !=3D &elf_linux_sysvec
> ---snip---
Yes.

>=20
> >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).
>=20
> How critical is this in your opinion (relative to the issue this patch =
=20
> is fixing)? Do you prefer a backout or do you think the probability =20
> that the someone wins the race is low enough?
>=20
> 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 ?

--YYyN6dyDU9bDiN2J
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (FreeBSD)

iEYEARECAAYFAkzqSRcACgkQC3+MBN1Mb4isEACePbwrVD5CTKib0MUfuA+mq5bb
OP4AoPQVUNCtn7peWPyed7S0wXADtaiV
=Xxmt
-----END PGP SIGNATURE-----

--YYyN6dyDU9bDiN2J--



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