svn commit: r219405 - in head/sys: amd64/amd64 amd64/linux32
arm/arm compat/ia32 compat/linux compat/svr4 i386/i386
i386/ibcs2 i386/linux ia64/ia64 kern mips/mips
powerpc/powerpc sparc64/sparc64 sys
Dmitry Chagin
dchagin at FreeBSD.org
Tue Mar 8 19:01:46 UTC 2011
Author: dchagin
Date: Tue Mar 8 19:01:45 2011
New Revision: 219405
URL: http://svn.freebsd.org/changeset/base/219405
Log:
Extend struct sysvec with new method sv_schedtail, which is used for an
explicit process at fork trampoline path instead of eventhadler(schedtail)
invocation for each child process.
Remove eventhandler(schedtail) code and change linux ABI to use newly added
sysvec method.
While here replace explicit comparing of module sysentvec structure with the
newly created process sysentvec to detect the linux ABI.
Discussed with: kib
MFC after: 2 Week
Modified:
head/sys/amd64/amd64/elf_machdep.c
head/sys/amd64/linux32/linux32_sysvec.c
head/sys/arm/arm/elf_machdep.c
head/sys/compat/ia32/ia32_sysvec.c
head/sys/compat/linux/linux_emul.c
head/sys/compat/linux/linux_emul.h
head/sys/compat/svr4/svr4_sysvec.c
head/sys/i386/i386/elf_machdep.c
head/sys/i386/ibcs2/ibcs2_sysvec.c
head/sys/i386/linux/linux_sysvec.c
head/sys/ia64/ia64/elf_machdep.c
head/sys/kern/imgact_aout.c
head/sys/kern/init_main.c
head/sys/kern/kern_fork.c
head/sys/mips/mips/elf64_machdep.c
head/sys/mips/mips/elf_machdep.c
head/sys/powerpc/powerpc/elf32_machdep.c
head/sys/powerpc/powerpc/elf64_machdep.c
head/sys/sparc64/sparc64/elf_machdep.c
head/sys/sys/eventhandler.h
head/sys/sys/sysent.h
Modified: head/sys/amd64/amd64/elf_machdep.c
==============================================================================
--- head/sys/amd64/amd64/elf_machdep.c Tue Mar 8 18:39:41 2011 (r219404)
+++ head/sys/amd64/amd64/elf_machdep.c Tue Mar 8 19:01:45 2011 (r219405)
@@ -81,6 +81,7 @@ struct sysentvec elf64_freebsd_sysvec =
.sv_syscallnames = syscallnames,
.sv_shared_page_base = SHAREDPAGE,
.sv_shared_page_len = PAGE_SIZE,
+ .sv_schedtail = NULL,
};
INIT_SYSENTVEC(elf64_sysvec, &elf64_freebsd_sysvec);
Modified: head/sys/amd64/linux32/linux32_sysvec.c
==============================================================================
--- head/sys/amd64/linux32/linux32_sysvec.c Tue Mar 8 18:39:41 2011 (r219404)
+++ head/sys/amd64/linux32/linux32_sysvec.c Tue Mar 8 19:01:45 2011 (r219405)
@@ -128,7 +128,6 @@ static void linux32_fixlimit(struct rlim
static boolean_t linux32_trans_osrel(const Elf_Note *note, int32_t *osrel);
static eventhandler_tag linux_exit_tag;
-static eventhandler_tag linux_schedtail_tag;
static eventhandler_tag linux_exec_tag;
/*
@@ -1063,6 +1062,7 @@ struct sysentvec elf_linux_sysvec = {
.sv_set_syscall_retval = cpu_set_syscall_retval,
.sv_fetch_syscall_args = linux32_fetch_syscall_args,
.sv_syscallnames = NULL,
+ .sv_schedtail = linux_schedtail,
};
static char GNU_ABI_VENDOR[] = "GNU";
@@ -1156,8 +1156,6 @@ linux_elf_modevent(module_t mod, int typ
mtx_init(&futex_mtx, "ftllk", NULL, MTX_DEF);
linux_exit_tag = EVENTHANDLER_REGISTER(process_exit,
linux_proc_exit, NULL, 1000);
- linux_schedtail_tag = EVENTHANDLER_REGISTER(schedtail,
- linux_schedtail, NULL, 1000);
linux_exec_tag = EVENTHANDLER_REGISTER(process_exec,
linux_proc_exec, NULL, 1000);
linux_szplatform = roundup(strlen(linux_platform) + 1,
@@ -1189,7 +1187,6 @@ linux_elf_modevent(module_t mod, int typ
sx_destroy(&emul_shared_lock);
mtx_destroy(&futex_mtx);
EVENTHANDLER_DEREGISTER(process_exit, linux_exit_tag);
- EVENTHANDLER_DEREGISTER(schedtail, linux_schedtail_tag);
EVENTHANDLER_DEREGISTER(process_exec, linux_exec_tag);
linux_osd_jail_deregister();
if (bootverbose)
Modified: head/sys/arm/arm/elf_machdep.c
==============================================================================
--- head/sys/arm/arm/elf_machdep.c Tue Mar 8 18:39:41 2011 (r219404)
+++ head/sys/arm/arm/elf_machdep.c Tue Mar 8 19:01:45 2011 (r219405)
@@ -78,6 +78,7 @@ struct sysentvec elf32_freebsd_sysvec =
.sv_set_syscall_retval = cpu_set_syscall_retval,
.sv_fetch_syscall_args = NULL, /* XXXKIB */
.sv_syscallnames = syscallnames,
+ .sv_schedtail = NULL,
};
static Elf32_Brandinfo freebsd_brand_info = {
Modified: head/sys/compat/ia32/ia32_sysvec.c
==============================================================================
--- head/sys/compat/ia32/ia32_sysvec.c Tue Mar 8 18:39:41 2011 (r219404)
+++ head/sys/compat/ia32/ia32_sysvec.c Tue Mar 8 19:01:45 2011 (r219405)
@@ -149,6 +149,7 @@ struct sysentvec ia32_freebsd_sysvec = {
.sv_syscallnames = freebsd32_syscallnames,
.sv_shared_page_base = FREEBSD32_SHAREDPAGE,
.sv_shared_page_len = PAGE_SIZE,
+ .sv_schedtail = NULL,
};
INIT_SYSENTVEC(elf_ia32_sysvec, &ia32_freebsd_sysvec);
Modified: head/sys/compat/linux/linux_emul.c
==============================================================================
--- head/sys/compat/linux/linux_emul.c Tue Mar 8 18:39:41 2011 (r219404)
+++ head/sys/compat/linux/linux_emul.c Tue Mar 8 19:01:45 2011 (r219405)
@@ -300,13 +300,16 @@ linux_proc_exec(void *arg __unused, stru
}
void
-linux_schedtail(void *arg __unused, struct proc *p)
+linux_schedtail(struct thread *td)
{
struct linux_emuldata *em;
+ struct proc *p;
int error = 0;
int *child_set_tid;
- if (__predict_true(p->p_sysent != &elf_linux_sysvec))
+ p = td->td_proc;
+
+ if (SV_PROC_ABI(p) != SV_ABI_LINUX)
return;
/* find the emuldata */
Modified: head/sys/compat/linux/linux_emul.h
==============================================================================
--- head/sys/compat/linux/linux_emul.h Tue Mar 8 18:39:41 2011 (r219404)
+++ head/sys/compat/linux/linux_emul.h Tue Mar 8 19:01:45 2011 (r219405)
@@ -82,7 +82,7 @@ struct linux_emuldata *em_find(struct pr
int linux_proc_init(struct thread *, pid_t, int);
void linux_proc_exit(void *, struct proc *);
-void linux_schedtail(void *, struct proc *);
+void linux_schedtail(struct thread *);
void linux_proc_exec(void *, struct proc *, struct image_params *);
void linux_kill_threads(struct thread *, int);
Modified: head/sys/compat/svr4/svr4_sysvec.c
==============================================================================
--- head/sys/compat/svr4/svr4_sysvec.c Tue Mar 8 18:39:41 2011 (r219404)
+++ head/sys/compat/svr4/svr4_sysvec.c Tue Mar 8 19:01:45 2011 (r219405)
@@ -195,6 +195,7 @@ struct sysentvec svr4_sysvec = {
.sv_set_syscall_retval = cpu_set_syscall_retval,
.sv_fetch_syscall_args = cpu_fetch_syscall_args,
.sv_syscallnames = NULL,
+ .sv_schedtail = NULL,
};
const char svr4_emul_path[] = "/compat/svr4";
Modified: head/sys/i386/i386/elf_machdep.c
==============================================================================
--- head/sys/i386/i386/elf_machdep.c Tue Mar 8 18:39:41 2011 (r219404)
+++ head/sys/i386/i386/elf_machdep.c Tue Mar 8 19:01:45 2011 (r219405)
@@ -78,6 +78,7 @@ struct sysentvec elf32_freebsd_sysvec =
.sv_set_syscall_retval = cpu_set_syscall_retval,
.sv_fetch_syscall_args = cpu_fetch_syscall_args,
.sv_syscallnames = syscallnames,
+ .sv_schedtail = NULL,
};
static Elf32_Brandinfo freebsd_brand_info = {
Modified: head/sys/i386/ibcs2/ibcs2_sysvec.c
==============================================================================
--- head/sys/i386/ibcs2/ibcs2_sysvec.c Tue Mar 8 18:39:41 2011 (r219404)
+++ head/sys/i386/ibcs2/ibcs2_sysvec.c Tue Mar 8 19:01:45 2011 (r219405)
@@ -90,6 +90,7 @@ struct sysentvec ibcs2_svr3_sysvec = {
.sv_set_syscall_retval = cpu_set_syscall_retval,
.sv_fetch_syscall_args = cpu_fetch_syscall_args,
.sv_syscallnames = NULL,
+ .sv_schedtail = NULL,
};
static int
Modified: head/sys/i386/linux/linux_sysvec.c
==============================================================================
--- head/sys/i386/linux/linux_sysvec.c Tue Mar 8 18:39:41 2011 (r219404)
+++ head/sys/i386/linux/linux_sysvec.c Tue Mar 8 19:01:45 2011 (r219405)
@@ -112,7 +112,6 @@ static int linux_szplatform;
const char *linux_platform;
static eventhandler_tag linux_exit_tag;
-static eventhandler_tag linux_schedtail_tag;
static eventhandler_tag linux_exec_tag;
/*
@@ -998,6 +997,7 @@ struct sysentvec linux_sysvec = {
.sv_set_syscall_retval = cpu_set_syscall_retval,
.sv_fetch_syscall_args = linux_fetch_syscall_args,
.sv_syscallnames = NULL,
+ .sv_schedtail = linux_schedtail,
};
struct sysentvec elf_linux_sysvec = {
@@ -1032,6 +1032,7 @@ struct sysentvec elf_linux_sysvec = {
.sv_set_syscall_retval = cpu_set_syscall_retval,
.sv_fetch_syscall_args = linux_fetch_syscall_args,
.sv_syscallnames = NULL,
+ .sv_schedtail = linux_schedtail,
};
static char GNU_ABI_VENDOR[] = "GNU";
@@ -1125,8 +1126,6 @@ linux_elf_modevent(module_t mod, int typ
mtx_init(&futex_mtx, "ftllk", NULL, MTX_DEF);
linux_exit_tag = EVENTHANDLER_REGISTER(process_exit, linux_proc_exit,
NULL, 1000);
- linux_schedtail_tag = EVENTHANDLER_REGISTER(schedtail, linux_schedtail,
- NULL, 1000);
linux_exec_tag = EVENTHANDLER_REGISTER(process_exec, linux_proc_exec,
NULL, 1000);
linux_get_machine(&linux_platform);
@@ -1159,7 +1158,6 @@ linux_elf_modevent(module_t mod, int typ
sx_destroy(&emul_shared_lock);
mtx_destroy(&futex_mtx);
EVENTHANDLER_DEREGISTER(process_exit, linux_exit_tag);
- EVENTHANDLER_DEREGISTER(schedtail, linux_schedtail_tag);
EVENTHANDLER_DEREGISTER(process_exec, linux_exec_tag);
linux_osd_jail_deregister();
if (bootverbose)
Modified: head/sys/ia64/ia64/elf_machdep.c
==============================================================================
--- head/sys/ia64/ia64/elf_machdep.c Tue Mar 8 18:39:41 2011 (r219404)
+++ head/sys/ia64/ia64/elf_machdep.c Tue Mar 8 19:01:45 2011 (r219405)
@@ -85,6 +85,7 @@ struct sysentvec elf64_freebsd_sysvec =
.sv_set_syscall_retval = cpu_set_syscall_retval,
.sv_fetch_syscall_args = cpu_fetch_syscall_args,
.sv_syscallnames = syscallnames,
+ .sv_schedtail = NULL,
};
static Elf64_Brandinfo freebsd_brand_info = {
Modified: head/sys/kern/imgact_aout.c
==============================================================================
--- head/sys/kern/imgact_aout.c Tue Mar 8 18:39:41 2011 (r219404)
+++ head/sys/kern/imgact_aout.c Tue Mar 8 19:01:45 2011 (r219405)
@@ -93,6 +93,7 @@ struct sysentvec aout_sysvec = {
.sv_set_syscall_retval = cpu_set_syscall_retval,
.sv_fetch_syscall_args = cpu_fetch_syscall_args,
.sv_syscallnames = syscallnames,
+ .sv_schedtail = NULL,
};
static int
Modified: head/sys/kern/init_main.c
==============================================================================
--- head/sys/kern/init_main.c Tue Mar 8 18:39:41 2011 (r219404)
+++ head/sys/kern/init_main.c Tue Mar 8 19:01:45 2011 (r219405)
@@ -378,6 +378,7 @@ struct sysentvec null_sysvec = {
.sv_set_syscall_retval = null_set_syscall_retval,
.sv_fetch_syscall_args = null_fetch_syscall_args,
.sv_syscallnames = NULL,
+ .sv_schedtail = NULL,
};
/*
Modified: head/sys/kern/kern_fork.c
==============================================================================
--- head/sys/kern/kern_fork.c Tue Mar 8 18:39:41 2011 (r219404)
+++ head/sys/kern/kern_fork.c Tue Mar 8 19:01:45 2011 (r219405)
@@ -67,6 +67,7 @@ __FBSDID("$FreeBSD$");
#include <sys/unistd.h>
#include <sys/sdt.h>
#include <sys/sx.h>
+#include <sys/sysent.h>
#include <sys/signalvar.h>
#include <security/audit/audit.h>
@@ -895,7 +896,8 @@ fork_exit(void (*callout)(void *, struct
}
mtx_assert(&Giant, MA_NOTOWNED);
- EVENTHANDLER_INVOKE(schedtail, p);
+ if (p->p_sysent->sv_schedtail != NULL)
+ (p->p_sysent->sv_schedtail)(td);
}
/*
Modified: head/sys/mips/mips/elf64_machdep.c
==============================================================================
--- head/sys/mips/mips/elf64_machdep.c Tue Mar 8 18:39:41 2011 (r219404)
+++ head/sys/mips/mips/elf64_machdep.c Tue Mar 8 19:01:45 2011 (r219405)
@@ -82,6 +82,7 @@ struct sysentvec elf64_freebsd_sysvec =
.sv_set_syscall_retval = cpu_set_syscall_retval,
.sv_fetch_syscall_args = NULL, /* XXXKIB */
.sv_syscallnames = NULL,
+ .sv_schedtail = NULL,
};
static Elf64_Brandinfo freebsd_brand_gnutools_info64 = {
Modified: head/sys/mips/mips/elf_machdep.c
==============================================================================
--- head/sys/mips/mips/elf_machdep.c Tue Mar 8 18:39:41 2011 (r219404)
+++ head/sys/mips/mips/elf_machdep.c Tue Mar 8 19:01:45 2011 (r219405)
@@ -82,6 +82,7 @@ struct sysentvec elf64_freebsd_sysvec =
.sv_set_syscall_retval = cpu_set_syscall_retval,
.sv_fetch_syscall_args = NULL, /* XXXKIB */
.sv_syscallnames = syscallnames,
+ .sv_schedtail = NULL,
};
static Elf64_Brandinfo freebsd_brand_info = {
@@ -137,6 +138,7 @@ struct sysentvec elf32_freebsd_sysvec =
.sv_set_syscall_retval = cpu_set_syscall_retval,
.sv_fetch_syscall_args = NULL, /* XXXKIB */
.sv_syscallnames = syscallnames,
+ .sv_schedtail = NULL,
};
static Elf32_Brandinfo freebsd_brand_info = {
Modified: head/sys/powerpc/powerpc/elf32_machdep.c
==============================================================================
--- head/sys/powerpc/powerpc/elf32_machdep.c Tue Mar 8 18:39:41 2011 (r219404)
+++ head/sys/powerpc/powerpc/elf32_machdep.c Tue Mar 8 19:01:45 2011 (r219405)
@@ -106,6 +106,7 @@ struct sysentvec elf32_freebsd_sysvec =
.sv_fetch_syscall_args = cpu_fetch_syscall_args,
.sv_shared_page_base = FREEBSD32_SHAREDPAGE,
.sv_shared_page_len = PAGE_SIZE,
+ .sv_schedtail = NULL,
};
INIT_SYSENTVEC(elf32_sysvec, &elf32_freebsd_sysvec);
Modified: head/sys/powerpc/powerpc/elf64_machdep.c
==============================================================================
--- head/sys/powerpc/powerpc/elf64_machdep.c Tue Mar 8 18:39:41 2011 (r219404)
+++ head/sys/powerpc/powerpc/elf64_machdep.c Tue Mar 8 19:01:45 2011 (r219405)
@@ -82,6 +82,7 @@ struct sysentvec elf64_freebsd_sysvec =
.sv_syscallnames = syscallnames,
.sv_shared_page_base = SHAREDPAGE,
.sv_shared_page_len = PAGE_SIZE,
+ .sv_schedtail = NULL,
};
INIT_SYSENTVEC(elf64_sysvec, &elf64_freebsd_sysvec);
Modified: head/sys/sparc64/sparc64/elf_machdep.c
==============================================================================
--- head/sys/sparc64/sparc64/elf_machdep.c Tue Mar 8 18:39:41 2011 (r219404)
+++ head/sys/sparc64/sparc64/elf_machdep.c Tue Mar 8 19:01:45 2011 (r219405)
@@ -93,6 +93,7 @@ static struct sysentvec elf64_freebsd_sy
.sv_set_syscall_retval = cpu_set_syscall_retval,
.sv_fetch_syscall_args = cpu_fetch_syscall_args,
.sv_syscallnames = syscallnames,
+ .sv_schedtail = NULL,
};
static Elf64_Brandinfo freebsd_brand_info = {
Modified: head/sys/sys/eventhandler.h
==============================================================================
--- head/sys/sys/eventhandler.h Tue Mar 8 18:39:41 2011 (r219404)
+++ head/sys/sys/eventhandler.h Tue Mar 8 19:01:45 2011 (r219405)
@@ -250,6 +250,4 @@ typedef void (*uma_zone_chfn)(void *);
EVENTHANDLER_DECLARE(nmbclusters_change, uma_zone_chfn);
EVENTHANDLER_DECLARE(maxsockets_change, uma_zone_chfn);
-typedef void(*schedtail_fn)(void *, struct proc *);
-EVENTHANDLER_DECLARE(schedtail, schedtail_fn);
#endif /* SYS_EVENTHANDLER_H */
Modified: head/sys/sys/sysent.h
==============================================================================
--- head/sys/sys/sysent.h Tue Mar 8 18:39:41 2011 (r219404)
+++ head/sys/sys/sysent.h Tue Mar 8 19:01:45 2011 (r219405)
@@ -125,6 +125,7 @@ struct sysentvec {
vm_offset_t sv_shared_page_len;
vm_offset_t sv_sigcode_base;
void *sv_shared_page_obj;
+ void (*sv_schedtail)(struct thread *);
};
#define SV_ILP32 0x000100
More information about the svn-src-head
mailing list