diff options
author | netchild <netchild@FreeBSD.org> | 2007-02-23 22:39:26 +0000 |
---|---|---|
committer | netchild <netchild@FreeBSD.org> | 2007-02-23 22:39:26 +0000 |
commit | 902cc4aebabcbc802991bdb0b03f04e600fd8452 (patch) | |
tree | ee0d5379699a26a3d09a50992f83344be0588450 /sys/compat/linux/linux_emul.c | |
parent | d0c562e57ca3e3905157ccbd79fa4efa843088c3 (diff) | |
download | FreeBSD-src-902cc4aebabcbc802991bdb0b03f04e600fd8452.zip FreeBSD-src-902cc4aebabcbc802991bdb0b03f04e600fd8452.tar.gz |
MFp4 (114193 (i386 part), 114194, 114195, 114200):
- Dont "return" in linux_clone() after we forked the new process in a case
of problems.
- Move the copyout of p2->p_pid outside the emul_lock coverage in
linux_clone().
- Cache the em->pdeath_signal in a local variable and move the copyout
out of the emul_lock coverage.
- Move the free() out of the emul_shared_lock coverage in a preparation
to switch emul_lock to non-sleepable lock (mutex).
Submitted by: rdivacky
Diffstat (limited to 'sys/compat/linux/linux_emul.c')
-rw-r--r-- | sys/compat/linux/linux_emul.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/sys/compat/linux/linux_emul.c b/sys/compat/linux/linux_emul.c index 2a42f70..c2f6db1 100644 --- a/sys/compat/linux/linux_emul.c +++ b/sys/compat/linux/linux_emul.c @@ -186,9 +186,11 @@ linux_proc_exit(void *arg __unused, struct proc *p) LIST_REMOVE(em, threads); em->shared->refs--; - if (em->shared->refs == 0) + if (em->shared->refs == 0) { + EMUL_SHARED_WUNLOCK(&emul_shared_lock); free(em->shared, M_LINUX); - EMUL_SHARED_WUNLOCK(&emul_shared_lock); + } else + EMUL_SHARED_WUNLOCK(&emul_shared_lock); if (child_clear_tid != NULL) { struct linux_sys_futex_args cup; @@ -273,9 +275,11 @@ linux_proc_exec(void *arg __unused, struct proc *p, struct image_params *imgp) PROC_UNLOCK(p); em->shared->refs--; - if (em->shared->refs == 0) + if (em->shared->refs == 0) { + EMUL_SHARED_WUNLOCK(&emul_shared_lock); free(em->shared, M_LINUX); - EMUL_SHARED_WUNLOCK(&emul_shared_lock); + } else + EMUL_SHARED_WUNLOCK(&emul_shared_lock); free(em, M_LINUX); } |