From owner-svn-src-all@FreeBSD.ORG Tue Mar 8 19:01:46 2011 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 30576106564A; Tue, 8 Mar 2011 19:01:46 +0000 (UTC) (envelope-from dchagin@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 187A38FC17; Tue, 8 Mar 2011 19:01:46 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p28J1kkI083843; Tue, 8 Mar 2011 19:01:46 GMT (envelope-from dchagin@svn.freebsd.org) Received: (from dchagin@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p28J1jjh083821; Tue, 8 Mar 2011 19:01:45 GMT (envelope-from dchagin@svn.freebsd.org) Message-Id: <201103081901.p28J1jjh083821@svn.freebsd.org> From: Dmitry Chagin Date: Tue, 8 Mar 2011 19:01:45 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: 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 X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 08 Mar 2011 19:01:46 -0000 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 #include #include +#include #include #include @@ -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