Date: Thu, 1 May 2014 13:42:20 +0000 (UTC) From: Dmitry Chagin <dchagin@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r265179 - in user/dchagin/lemul/sys: amd64/linux amd64/linux32 compat/linux Message-ID: <201405011342.s41DgKKZ065266@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: dchagin Date: Thu May 1 13:42:19 2014 New Revision: 265179 URL: http://svnweb.freebsd.org/changeset/base/265179 Log: To fix a panic when in case of transition from linux binary execing to native binary we destroy emuldata thread entry and kern_execve() returns error a bit rewrite linux_execve system call. For now we destroy emuldata thread entry after kern_execve finished, not in event handler. Modified: user/dchagin/lemul/sys/amd64/linux/linux_machdep.c user/dchagin/lemul/sys/amd64/linux32/linux32_machdep.c user/dchagin/lemul/sys/compat/linux/linux_emul.c user/dchagin/lemul/sys/compat/linux/linux_emul.h Modified: user/dchagin/lemul/sys/amd64/linux/linux_machdep.c ============================================================================== --- user/dchagin/lemul/sys/amd64/linux/linux_machdep.c Thu May 1 13:30:14 2014 (r265178) +++ user/dchagin/lemul/sys/amd64/linux/linux_machdep.c Thu May 1 13:42:19 2014 (r265179) @@ -126,7 +126,7 @@ linux_execve(struct thread *td, struct l args->envp); free(path, M_TEMP); if (error == 0) - error = kern_execve(td, &eargs, NULL); + error = linux_common_execve(td, &eargs); return (error); } Modified: user/dchagin/lemul/sys/amd64/linux32/linux32_machdep.c ============================================================================== --- user/dchagin/lemul/sys/amd64/linux32/linux32_machdep.c Thu May 1 13:30:14 2014 (r265178) +++ user/dchagin/lemul/sys/amd64/linux32/linux32_machdep.c Thu May 1 13:42:19 2014 (r265179) @@ -150,7 +150,7 @@ linux_execve(struct thread *td, struct l args->argp, args->envp); free(path, M_TEMP); if (error == 0) - error = kern_execve(td, &eargs, NULL); + error = linux_common_execve(td, &eargs); return (error); } Modified: user/dchagin/lemul/sys/compat/linux/linux_emul.c ============================================================================== --- user/dchagin/lemul/sys/compat/linux/linux_emul.c Thu May 1 13:30:14 2014 (r265178) +++ user/dchagin/lemul/sys/compat/linux/linux_emul.c Thu May 1 13:42:19 2014 (r265179) @@ -158,39 +158,23 @@ linux_proc_init(struct thread *td, struc LIN_SDT_PROBE0(emul, proc_init, return); } -void -linux_proc_exec(void *arg __unused, struct proc *p, struct image_params *imgp) +int +linux_common_execve(struct thread *td, struct image_args *eargs) { - struct thread *td = curthread; struct linux_emuldata *em; + struct proc *p; + int error; - /* - * In a case of execing to linux binary we create linux - * emuldata thread entry. - */ - if (__predict_false((imgp->sysent->sv_flags & SV_ABI_MASK) == - SV_ABI_LINUX)) { - LIN_SDT_PROBE2(emul, proc_exec, entry, p, imgp); - if (SV_PROC_ABI(p) == SV_ABI_LINUX) - linux_proc_init(td, NULL, 0); - else - linux_proc_init(td, td, 0); - } + error = kern_execve(td, eargs, NULL); + if (error) + return (error); + p = td->td_proc; /* * In a case of transition from Linux binary execing to * FreeBSD binary we destroy linux emuldata thread entry. */ - if (__predict_false((imgp->sysent->sv_flags & SV_ABI_MASK) != SV_ABI_LINUX && - SV_PROC_ABI(p) == SV_ABI_LINUX)) { - - /* - * XXX:There's a race because here we assign p->p_emuldata NULL - * but the process is still counted as linux one for a short - * time so some other process might reference it and try to - * access its p->p_emuldata and panicing on a NULL reference. - */ - + if (SV_CURPROC_ABI() != SV_ABI_LINUX) { PROC_LOCK(p); em = em_find(td); KASSERT(em != NULL, ("proc_exec: emuldata not found.\n")); @@ -199,10 +183,30 @@ linux_proc_exec(void *arg __unused, stru free(em, M_TEMP); } + return (0); +} + + +void +linux_proc_exec(void *arg __unused, struct proc *p, struct image_params *imgp) +{ + struct thread *td = curthread; + + /* + * In a case of execing to linux binary we create linux + * emuldata thread entry. + */ if (__predict_false((imgp->sysent->sv_flags & SV_ABI_MASK) == - SV_ABI_LINUX)) + SV_ABI_LINUX)) { + LIN_SDT_PROBE2(emul, proc_exec, entry, p, imgp); + if (SV_PROC_ABI(p) == SV_ABI_LINUX) + linux_proc_init(td, NULL, 0); + else + linux_proc_init(td, td, 0); + LIN_SDT_PROBE0(emul, proc_exec, return); + } } void Modified: user/dchagin/lemul/sys/compat/linux/linux_emul.h ============================================================================== --- user/dchagin/lemul/sys/compat/linux/linux_emul.h Thu May 1 13:30:14 2014 (r265178) +++ user/dchagin/lemul/sys/compat/linux/linux_emul.h Thu May 1 13:42:19 2014 (r265179) @@ -54,6 +54,7 @@ struct linux_emuldata *em_find(struct th #define LINUX_XDEPR_REQUEUEOP 0x00000001 /* uses deprecated futex REQUEUE op*/ +int linux_common_execve(struct thread *, struct image_args *); void linux_proc_init(struct thread *, struct thread *, int); void linux_schedtail(struct thread *); void linux_proc_exec(void *, struct proc *, struct image_params *);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201405011342.s41DgKKZ065266>