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
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to