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-all mailing list