PERFORCE change 102131 for review
Roman Divacky
rdivacky at FreeBSD.org
Sat Jul 22 11:00:45 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=102131
Change 102131 by rdivacky at rdivacky_witten on 2006/07/22 11:00:20
Change TID handling to be more like linux and less like NetBSD.
Affected files ...
.. //depot/projects/soc2006/rdivacky_linuxolator/compat/linux/linux_futex.c#5 edit
.. //depot/projects/soc2006/rdivacky_linuxolator/i386/linux/linux.h#10 edit
.. //depot/projects/soc2006/rdivacky_linuxolator/i386/linux/linux_machdep.c#21 edit
.. //depot/projects/soc2006/rdivacky_linuxolator/i386/linux/linux_sysvec.c#10 edit
.. //depot/projects/soc2006/rdivacky_linuxolator/kern/kern_fork.c#3 edit
.. //depot/projects/soc2006/rdivacky_linuxolator/kern/subr_trap.c#4 edit
.. //depot/projects/soc2006/rdivacky_linuxolator/sys/eventhandler.h#4 edit
Differences ...
==== //depot/projects/soc2006/rdivacky_linuxolator/compat/linux/linux_futex.c#5 (text+ko) ====
@@ -92,8 +92,8 @@
#ifdef DEBUG
if (ldebug(sys_futex))
+ printf("FUTEX: %x: %i, %i\n", (unsigned int)args->uaddr, args->op, args->val);
#endif
- printf("FUTEX: %x: %i, %i\n", (unsigned int)args->uaddr, args->op, args->val);
switch (args->op) {
case LINUX_FUTEX_WAIT:
==== //depot/projects/soc2006/rdivacky_linuxolator/i386/linux/linux.h#10 (text+ko) ====
@@ -788,8 +788,6 @@
int *child_set_tid; /* in clone(): Child's TID to set on clone */
int *child_clear_tid; /* in clone(): Child's TID to clear on exit */
- int *set_tid; /* in clone(): Own TID to set on clone */
- int *clear_tid; /* Own TID to clear on exit */
SLIST_ENTRY(linux_emuldata) emuldatas;
};
==== //depot/projects/soc2006/rdivacky_linuxolator/i386/linux/linux_machdep.c#21 (text+ko) ====
@@ -70,7 +70,7 @@
static int linux_proc_init(struct thread *, pid_t);
void linux_proc_exit(void *, struct proc *);
-void linux_userret(void *, struct proc *);
+void linux_schedtail(void *, struct proc *);
void linux_proc_exec(void *, struct proc *, struct image_params *);
static struct linux_emuldata *em_find(pid_t pid, int locked);
@@ -312,9 +312,6 @@
linux_fork(struct thread *td, struct linux_fork_args *args)
{
int error;
-#if 0
- struct linux_emuldata *em;
-#endif
#ifdef DEBUG
if (ldebug(fork))
@@ -330,14 +327,6 @@
if (error)
return (error);
-#if 0
- EMUL_RLOCK(&emul_data);
- /* impossible to not find it */
- SLIST_FOREACH(em, &emuldata_head, emuldatas)
- if (em->pid == td->td_retval[0])
- break;
- EMUL_RUNLOCK(&emul_data);
-#endif
return (0);
}
@@ -1093,7 +1082,7 @@
static int
linux_proc_init(struct thread *td, pid_t child)
{
- struct linux_emuldata *em, *p_em;
+ struct linux_emuldata *em;
/* XXX: locking? */
if (child != 0) {
@@ -1118,24 +1107,11 @@
em->child_clear_tid = NULL;
em->child_set_tid = NULL;
- /* SLIST is inefficient - use hash instead */
- /* I hope I rewrote the semantics right */
- if (child != 0) {
- /* find the emuldata for the parent process */
- p_em = em_find(td->td_proc->p_pid, EMUL_LOCKED);
- if (p_em == NULL) {
- em->clear_tid = NULL;
- em->set_tid = NULL;
- } else {
- em->clear_tid = p_em->child_clear_tid;
- em->set_tid = p_em->child_set_tid;
- }
- EMUL_WUNLOCK(&emul_lock);
- } else {
- em->clear_tid = NULL;
- em->set_tid = NULL;
- EMUL_RUNLOCK(&emul_lock);
- }
+ if (child != 0)
+ EMUL_WUNLOCK(&emul_lock);
+ else
+ EMUL_RUNLOCK(&emul_lock);
+
return (0);
}
@@ -1159,18 +1135,20 @@
#endif
return;
}
- if (em->clear_tid != NULL) {
+ if (em->child_clear_tid != NULL) {
struct linux_sys_futex_args cup;
int null = 0;
- error = copyout(&null, em->clear_tid, sizeof(null));
+ error = copyout(&null, em->child_clear_tid, sizeof(null));
if (error) {
EMUL_RUNLOCK(&emul_lock);
return;
}
+ em->child_clear_tid = NULL;
+
/* futexes stuff */
- cup.uaddr = em->clear_tid;
+ cup.uaddr = em->child_clear_tid;
cup.op = LINUX_FUTEX_WAKE;
cup.val = 0x7fffffff; /* Awake everyone */
cup.timeout = NULL;
@@ -1207,6 +1185,7 @@
if (__predict_false(imgp->sysent == &elf32_freebsd_sysvec
&& p->p_sysent == &elf_linux_sysvec)) {
struct linux_emuldata *em;
+ struct thread *td = FIRST_THREAD_IN_PROC(p);
em = em_find(p->p_pid, EMUL_UNLOCKED);
@@ -1231,16 +1210,14 @@
}
void
-linux_userret(void *arg __unused, struct proc *p)
+linux_schedtail(void *arg __unused, struct proc *p)
{
struct linux_emuldata *em;
int error = 0;
- //struct thread *td = FIRST_THREAD_IN_PROC(p);
if (p->p_sysent != &elf_linux_sysvec)
return;
- //printf("XXX: %i\n", p->p_pid);
/* find the emuldata */
em = em_find(p->p_pid, EMUL_UNLOCKED);
@@ -1251,9 +1228,8 @@
return;
}
- if (em->set_tid != NULL) {
- error = copyout(&p->p_pid, em->set_tid, sizeof(p->p_pid));
- }
+ if (em->child_set_tid != NULL)
+ error = copyout(&p->p_pid, em->child_set_tid, sizeof(p->p_pid));
EMUL_RUNLOCK(&emul_lock);
return;
@@ -1275,7 +1251,7 @@
return (0);
}
- em->clear_tid = args->tidptr;
+ em->child_clear_tid = args->tidptr;
td->td_retval[0] = td->td_proc->p_pid;
EMUL_RUNLOCK(&emul_lock);
==== //depot/projects/soc2006/rdivacky_linuxolator/i386/linux/linux_sysvec.c#10 (text+ko) ====
@@ -109,13 +109,13 @@
extern void linux_proc_exit(void *, struct proc *, struct image_params *);
extern void linux_proc_exec(void *, struct proc *, struct image_params *);
-extern void linux_userret(void *, struct proc *);
+extern void linux_schedtail(void *, struct proc *);
extern struct rwlock emul_lock;
extern LIST_HEAD(futex_list, futex) futex_list;
extern struct mtx futex_mtx;
static eventhandler_tag linux_exit_tag;
-static eventhandler_tag linux_userret_tag;
+static eventhandler_tag linux_schedtail_tag;
static eventhandler_tag linux_exec_tag;
/*
@@ -926,7 +926,7 @@
mtx_init(&futex_mtx, "futex protection lock", NULL, MTX_DEF);
linux_exit_tag = EVENTHANDLER_REGISTER(process_exit, linux_proc_exit,
NULL, 1000);
- linux_userret_tag = EVENTHANDLER_REGISTER(userret, linux_userret,
+ linux_schedtail_tag = EVENTHANDLER_REGISTER(schedtail, linux_schedtail,
NULL, 1000);
linux_exec_tag = EVENTHANDLER_REGISTER(process_exec, linux_proc_exec,
NULL, 1000);
@@ -954,7 +954,7 @@
rw_destroy(&emul_lock);
mtx_destroy(&futex_mtx);
EVENTHANDLER_DEREGISTER(process_exit, linux_exit_tag);
- EVENTHANDLER_DEREGISTER(userret, linux_userret_tag);
+ EVENTHANDLER_DEREGISTER(schedtail, linux_schedtail_tag);
EVENTHANDLER_DEREGISTER(process_exec, linux_exec_tag);
break;
default:
==== //depot/projects/soc2006/rdivacky_linuxolator/kern/kern_fork.c#3 (text+ko) ====
@@ -831,6 +831,8 @@
kthread_exit(0);
}
mtx_assert(&Giant, MA_NOTOWNED);
+
+ EVENTHANDLER_INVOKE(schedtail, p);
}
/*
==== //depot/projects/soc2006/rdivacky_linuxolator/kern/subr_trap.c#4 (text+ko) ====
@@ -59,7 +59,6 @@
#include <sys/signalvar.h>
#include <sys/systm.h>
#include <sys/vmmeter.h>
-#include <sys/eventhandler.h>
#ifdef KTRACE
#include <sys/uio.h>
#include <sys/ktrace.h>
@@ -129,8 +128,6 @@
addupc_task(td, TRAPF_PC(frame), td->td_pticks * psratio);
}
- EVENTHANDLER_INVOKE(userret, p);
-
/*
* Let the scheduler adjust our priority etc.
*/
==== //depot/projects/soc2006/rdivacky_linuxolator/sys/eventhandler.h#4 (text+ko) ====
@@ -176,6 +176,6 @@
EVENTHANDLER_DECLARE(nmbclusters_change, uma_zone_chfn);
EVENTHANDLER_DECLARE(maxsockets_change, uma_zone_chfn);
-typedef void(*userret_fn)(void *, struct proc *);
-EVENTHANDLER_DECLARE(userret, userret_fn);
+typedef void(*schedtail_fn)(void *, struct proc *);
+EVENTHANDLER_DECLARE(schedtail, schedtail_fn);
#endif /* SYS_EVENTHANDLER_H */
More information about the p4-projects
mailing list