PERFORCE change 107900 for review
Roman Divacky
rdivacky at FreeBSD.org
Sat Oct 14 08:39:34 PDT 2006
http://perforce.freebsd.org/chv.cgi?CH=107900
Change 107900 by rdivacky at rdivacky_witten on 2006/10/14 15:38:47
Rewritten, yet still panicing version of pdeath_signal.
Affected files ...
.. //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_sysvec.c#3 edit
.. //depot/projects/linuxolator/src/sys/compat/linux/linux_emul.c#9 edit
.. //depot/projects/linuxolator/src/sys/i386/linux/linux_machdep.c#7 edit
.. //depot/projects/linuxolator/src/sys/i386/linux/linux_sysvec.c#3 edit
.. //depot/projects/linuxolator/src/sys/kern/kern_exit.c#5 edit
.. //depot/projects/linuxolator/src/sys/sys/eventhandler.h#3 edit
Differences ...
==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_sysvec.c#3 (text+ko) ====
@@ -129,7 +129,6 @@
static eventhandler_tag linux_exit_tag;
static eventhandler_tag linux_schedtail_tag;
static eventhandler_tag linux_exec_tag;
-static eventhandler_tag linux_reparent_tag;
/*
* Linux syscalls return negative errno's, we do positive and map them
@@ -1088,8 +1087,6 @@
NULL, 1000);
linux_exec_tag = EVENTHANDLER_REGISTER(process_exec, linux_proc_exec,
NULL, 1000);
- linux_reparent_tag = EVENTHANDLER_REGISTER(reparent, linux_reparent,
- NULL, 1000);
if (bootverbose)
printf("Linux ELF exec handler installed\n");
} else
@@ -1117,7 +1114,6 @@
EVENTHANDLER_DEREGISTER(process_exit, linux_exit_tag);
EVENTHANDLER_DEREGISTER(schedtail, linux_schedtail_tag);
EVENTHANDLER_DEREGISTER(process_exec, linux_exec_tag);
- EVENTHANDLER_DEREGISTER(reparent, linux_reparent_tag);
if (bootverbose)
printf("Linux ELF exec handler removed\n");
} else
==== //depot/projects/linuxolator/src/sys/compat/linux/linux_emul.c#9 (text+ko) ====
@@ -152,6 +152,7 @@
int error;
struct thread *td = FIRST_THREAD_IN_PROC(p);
int *child_clear_tid;
+ struct proc *q, *nq;
if (__predict_true(p->p_sysent != &elf_linux_sysvec))
return;
@@ -205,6 +206,24 @@
/* clean the stuff up */
free(em, M_LINUX);
+
+ /* this is a little weird but rewritten from exit1() */
+ sx_xlock(&proctree_lock);
+ q = LIST_FIRST(&p->p_children);
+ for (; q != NULL; q = nq) {
+ nq = LIST_NEXT(q, p_sibling);
+ if (__predict_true(q->p_sysent != &elf_linux_sysvec))
+ break;
+ em = em_find(q, EMUL_UNLOCKED);
+ KASSERT(em != NULL, ("linux_reparent: emuldata not found: %i\n", q->p_pid));
+ if (em->pdeath_signal != 0) {
+ PROC_LOCK(q);
+ psignal(q, em->pdeath_signal);
+ PROC_UNLOCK(q);
+ }
+ EMUL_UNLOCK(&emul_lock);
+ }
+ sx_xunlock(&proctree_lock);
}
/*
@@ -300,22 +319,3 @@
EMUL_UNLOCK(&emul_lock);
return 0;
}
-
-/* p is locked */
-void
-linux_reparent(void *arg __unused, struct proc *p)
-{
- struct linux_emuldata *em;
-
- if (__predict_true(p->p_sysent != &elf_linux_sysvec))
- return;
-
- /* do this only if the parent is exiting */
- if (p->p_pptr->p_flag & P_WEXIT) {
- em = em_find(p, EMUL_UNLOCKED);
- KASSERT(em != NULL, ("linux_reparent: emuldata not found.\n"));
- if (em->pdeath_signal != 0)
- psignal(p, em->pdeath_signal);
- EMUL_UNLOCK(&emul_lock);
- }
-}
==== //depot/projects/linuxolator/src/sys/i386/linux/linux_machdep.c#7 (text+ko) ====
==== //depot/projects/linuxolator/src/sys/i386/linux/linux_sysvec.c#3 (text+ko) ====
@@ -113,7 +113,6 @@
static eventhandler_tag linux_exit_tag;
static eventhandler_tag linux_schedtail_tag;
static eventhandler_tag linux_exec_tag;
-static eventhandler_tag linux_reparent_tag;
/*
* Linux syscalls return negative errno's, we do positive and map them
@@ -928,8 +927,6 @@
NULL, 1000);
linux_exec_tag = EVENTHANDLER_REGISTER(process_exec, linux_proc_exec,
NULL, 1000);
- linux_reparent_tag = EVENTHANDLER_REGISTER(reparent, linux_reparent,
- NULL, 1000);
if (bootverbose)
printf("Linux ELF exec handler installed\n");
} else
@@ -957,7 +954,6 @@
EVENTHANDLER_DEREGISTER(process_exit, linux_exit_tag);
EVENTHANDLER_DEREGISTER(schedtail, linux_schedtail_tag);
EVENTHANDLER_DEREGISTER(process_exec, linux_exec_tag);
- EVENTHANDLER_DEREGISTER(reparent, linux_reparent_tag);
if (bootverbose)
printf("Linux ELF exec handler removed\n");
} else
==== //depot/projects/linuxolator/src/sys/kern/kern_exit.c#5 (text+ko) ====
@@ -897,9 +897,6 @@
if (child->p_pptr == parent)
return;
- /* we want to have old parent accessible via p_pptr */
- EVENTHANDLER_INVOKE(reparent, child);
-
LIST_REMOVE(child, p_sibling);
LIST_INSERT_HEAD(&parent->p_children, child, p_sibling);
child->p_pptr = parent;
==== //depot/projects/linuxolator/src/sys/sys/eventhandler.h#3 (text+ko) ====
@@ -179,6 +179,4 @@
typedef void(*schedtail_fn)(void *, struct proc *);
EVENTHANDLER_DECLARE(schedtail, schedtail_fn);
-typedef void(*reparent_fn)(void *, struct proc *);
-EVENTHANDLER_DECLARE(reparent, reparent_fn);
#endif /* SYS_EVENTHANDLER_H */
More information about the p4-projects
mailing list