diff options
author | peter <peter@FreeBSD.org> | 1999-07-01 13:21:46 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 1999-07-01 13:21:46 +0000 |
commit | 6cb5fe6c6bfe3fbe7878f6c055e0deb2ad86d77c (patch) | |
tree | 3d833b579e08cb5e2dc4561ebb531129df5f2eb3 /sys | |
parent | e671ad02ffd3e5dedda4576976c1952f1f8d8fe3 (diff) | |
download | FreeBSD-src-6cb5fe6c6bfe3fbe7878f6c055e0deb2ad86d77c.zip FreeBSD-src-6cb5fe6c6bfe3fbe7878f6c055e0deb2ad86d77c.tar.gz |
Slight reorganization of kernel thread/process creation. Instead of using
SYSINIT_KT() etc (which is a static, compile-time procedure), use a
NetBSD-style kthread_create() interface. kproc_start is still available
as a SYSINIT() hook. This allowed simplification of chunks of the
sysinit code in the process. This kthread_create() is our old kproc_start
internals, with the SYSINIT_KT fork hooks grafted in and tweaked to work
the same as the NetBSD one.
One thing I'd like to do shortly is get rid of nfsiod as a user initiated
process. It makes sense for the nfs client code to create them on the
fly as needed up to a user settable limit. This means that nfsiod
doesn't need to be in /sbin and is always "available". This is a fair bit
easier to do outside of the SYSINIT_KT() framework.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/alpha/alpha/vm_machdep.c | 6 | ||||
-rw-r--r-- | sys/amd64/amd64/vm_machdep.c | 6 | ||||
-rw-r--r-- | sys/conf/files | 1 | ||||
-rw-r--r-- | sys/i386/i386/vm_machdep.c | 6 | ||||
-rw-r--r-- | sys/kern/init_main.c | 110 | ||||
-rw-r--r-- | sys/kern/kern_kthread.c | 100 | ||||
-rw-r--r-- | sys/kern/kern_linker.c | 39 | ||||
-rw-r--r-- | sys/kern/uipc_mbuf.c | 4 | ||||
-rw-r--r-- | sys/kern/vfs_aio.c | 6 | ||||
-rw-r--r-- | sys/kern/vfs_export.c | 7 | ||||
-rw-r--r-- | sys/kern/vfs_subr.c | 7 | ||||
-rw-r--r-- | sys/powerpc/aim/vm_machdep.c | 6 | ||||
-rw-r--r-- | sys/powerpc/powerpc/vm_machdep.c | 6 | ||||
-rw-r--r-- | sys/sys/kernel.h | 66 | ||||
-rw-r--r-- | sys/sys/kthread.h | 50 | ||||
-rw-r--r-- | sys/sys/proc.h | 5 | ||||
-rw-r--r-- | sys/vm/vm_pageout.c | 7 |
17 files changed, 225 insertions, 207 deletions
diff --git a/sys/alpha/alpha/vm_machdep.c b/sys/alpha/alpha/vm_machdep.c index a638794..4abdd94 100644 --- a/sys/alpha/alpha/vm_machdep.c +++ b/sys/alpha/alpha/vm_machdep.c @@ -38,7 +38,7 @@ * * from: @(#)vm_machdep.c 7.3 (Berkeley) 5/13/91 * Utah $Hdr: vm_machdep.c 1.16.1.1 89/06/23$ - * $Id: vm_machdep.c,v 1.15 1999/06/08 16:42:19 dt Exp $ + * $Id: vm_machdep.c,v 1.16 1999/06/10 20:40:59 dt Exp $ */ /* * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. @@ -218,8 +218,8 @@ cpu_fork(p1, p2) void cpu_set_fork_handler(p, func, arg) struct proc *p; - void (*func) __P((const void *)); - const void *arg; + void (*func) __P((void *)); + void *arg; { /* * Note that the trap frame follows the args, so the function diff --git a/sys/amd64/amd64/vm_machdep.c b/sys/amd64/amd64/vm_machdep.c index 0451ccb..e31d48b 100644 --- a/sys/amd64/amd64/vm_machdep.c +++ b/sys/amd64/amd64/vm_machdep.c @@ -38,7 +38,7 @@ * * from: @(#)vm_machdep.c 7.3 (Berkeley) 5/13/91 * Utah $Hdr: vm_machdep.c 1.16.1.1 89/06/23$ - * $Id: vm_machdep.c,v 1.121 1999/04/19 14:14:13 peter Exp $ + * $Id: vm_machdep.c,v 1.122 1999/06/01 18:19:50 jlemon Exp $ */ #include "npx.h" @@ -192,8 +192,8 @@ cpu_fork(p1, p2) void cpu_set_fork_handler(p, func, arg) struct proc *p; - void (*func) __P((const void *)); - const void *arg; + void (*func) __P((void *)); + void *arg; { /* * Note that the trap frame follows the args, so the function diff --git a/sys/conf/files b/sys/conf/files index 37eebf2..46d5557 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -278,6 +278,7 @@ kern/kern_exec.c standard kern/kern_exit.c standard kern/kern_fork.c standard kern/kern_jail.c standard +kern/kern_kthread.c standard kern/kern_ktrace.c standard kern/kern_lock.c standard kern/kern_lockf.c standard diff --git a/sys/i386/i386/vm_machdep.c b/sys/i386/i386/vm_machdep.c index 0451ccb..e31d48b 100644 --- a/sys/i386/i386/vm_machdep.c +++ b/sys/i386/i386/vm_machdep.c @@ -38,7 +38,7 @@ * * from: @(#)vm_machdep.c 7.3 (Berkeley) 5/13/91 * Utah $Hdr: vm_machdep.c 1.16.1.1 89/06/23$ - * $Id: vm_machdep.c,v 1.121 1999/04/19 14:14:13 peter Exp $ + * $Id: vm_machdep.c,v 1.122 1999/06/01 18:19:50 jlemon Exp $ */ #include "npx.h" @@ -192,8 +192,8 @@ cpu_fork(p1, p2) void cpu_set_fork_handler(p, func, arg) struct proc *p; - void (*func) __P((const void *)); - const void *arg; + void (*func) __P((void *)); + void *arg; { /* * Note that the trap frame follows the args, so the function diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c index f988887..bcc7c86 100644 --- a/sys/kern/init_main.c +++ b/sys/kern/init_main.c @@ -39,7 +39,7 @@ * SUCH DAMAGE. * * @(#)init_main.c 8.9 (Berkeley) 1/21/94 - * $Id: init_main.c,v 1.122 1999/05/11 10:08:10 jb Exp $ + * $Id: init_main.c,v 1.123 1999/06/30 15:33:32 peter Exp $ */ #include "opt_devfs.h" @@ -52,6 +52,7 @@ #include <sys/mount.h> #include <sys/sysctl.h> #include <sys/proc.h> +#include <sys/kthread.h> #include <sys/resourcevar.h> #include <sys/signalvar.h> #include <sys/systm.h> @@ -180,7 +181,6 @@ mi_startup(framep) register struct sysinit **sipp; /* system initialization*/ register struct sysinit **xipp; /* interior loop of sort*/ register struct sysinit *save; /* bubble*/ - struct proc *p2; /* * Copy the locore.s frame pointer for proc0, this is forked into @@ -220,28 +220,8 @@ restart: if ((*sipp)->subsystem == SI_SUB_DONE) continue; - switch( (*sipp)->type) { - case SI_TYPE_DEFAULT: - /* no special processing*/ - (*((*sipp)->func))((*sipp)->udata); - break; - - case SI_TYPE_KTHREAD: - /* kernel thread*/ - if (fork1(&proc0, RFMEM|RFFDG|RFPROC, &p2)) - panic("fork kernel thread"); - cpu_set_fork_handler(p2, (*sipp)->func, (*sipp)->udata); - break; - - case SI_TYPE_KPROCESS: - if (fork1(&proc0, RFFDG|RFPROC, &p2)) - panic("fork kernel process"); - cpu_set_fork_handler(p2, (*sipp)->func, (*sipp)->udata); - break; - - default: - panic("init_main: unrecognized init type"); - } + /* Call function */ + (*((*sipp)->func))((*sipp)->udata); /* Check off the one we're just done */ (*sipp)->subsystem = SI_SUB_DONE; @@ -262,42 +242,6 @@ restart: /* - * Start a kernel process. This is called after a fork() call in - * mi_startup() in the file kern/init_main.c. - * - * This function is used to start "internal" daemons. - */ -/* ARGSUSED*/ -void -kproc_start(udata) - const void *udata; -{ - const struct kproc_desc *kp = udata; - struct proc *p = curproc; - -#ifdef DIAGNOSTIC - printf("Start pid=%d <%s>\n",p->p_pid, kp->arg0); -#endif - - /* save a global descriptor, if desired*/ - if( kp->global_procpp != NULL) - *kp->global_procpp = p; - - /* this is a non-swapped system process*/ - p->p_flag |= P_INMEM | P_SYSTEM; - - /* set up arg0 for 'ps', et al*/ - strcpy( p->p_comm, kp->arg0); - - /* call the processes' main()...*/ - (*kp->func)(); - - /* NOTREACHED */ - panic("kproc_start: %s", kp->arg0); -} - - -/* *************************************************************************** **** **** The following SYSINIT's belong elsewhere, but have not yet @@ -551,30 +495,27 @@ SYSINIT(retrofit, SI_SUB_ROOT_FDTAB, SI_ORDER_FIRST, xxx_vfs_root_fdtab, NULL) *************************************************************************** */ -static void kthread_init __P((const void *dummy)); -SYSINIT_KP(init,SI_SUB_KTHREAD_INIT, SI_ORDER_FIRST, kthread_init, NULL) - - extern void prepare_usermode __P((void)); -static void start_init __P((struct proc *p)); +static void create_init __P((const void *dummy)); +static void start_init __P((void *dummy)); +SYSINIT(init,SI_SUB_KTHREAD_INIT, SI_ORDER_FIRST, create_init, NULL) -/* ARGSUSED*/ +/* + * Like kthread_create(), but runs in it's own address space. + */ static void -kthread_init(dummy) - const void *dummy; +create_init(udata) + const void *udata; { - /* Create process 1 (init(8)). */ - start_init(curproc); - - prepare_usermode(); + int error; - /* - * This returns to the fork trampoline, then to user mode. - */ - return; + error = fork1(&proc0, RFFDG | RFPROC, &initproc); + if (error) + panic("cannot fork init: %d\n", error); + initproc->p_flag |= P_INMEM | P_SYSTEM; + cpu_set_fork_handler(initproc, start_init, NULL); } - /* * List of paths to try when searching for "init". */ @@ -591,16 +532,17 @@ SYSCTL_STRING(_kern, OID_AUTO, init_path, CTLFLAG_RD, init_path, 0, ""); * The program is invoked with one argument containing the boot flags. */ static void -start_init(p) - struct proc *p; +start_init(dummy) + void *dummy; { vm_offset_t addr; struct execve_args args; int options, error; char *var, *path, *next, *s; char *ucp, **uap, *arg0, *arg1; + struct proc *p; - initproc = p; + p = curproc; /* * Need just enough stack to hold the faked-up "execve()" arguments. @@ -681,11 +623,13 @@ start_init(p) * Now try to exec the program. If can't for any reason * other than it doesn't exist, complain. * - * Otherwise return to mi_startup() which returns to btext - * which completes the system startup. + * Otherwise, return via the fork trampoline all the way + * to user mode as init! */ - if ((error = execve(p, &args)) == 0) + if ((error = execve(p, &args)) == 0) { + prepare_usermode(); return; + } if (error != ENOENT) printf("exec %.*s: error %d\n", (int)(next - path), path, error); diff --git a/sys/kern/kern_kthread.c b/sys/kern/kern_kthread.c new file mode 100644 index 0000000..8d8ec00 --- /dev/null +++ b/sys/kern/kern_kthread.c @@ -0,0 +1,100 @@ +/* + * Copyright (c) 1999 Peter Wemm <peter@FreeBSD.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/proc.h> +#include <sys/kthread.h> +#include <sys/unistd.h> +#include <sys/wait.h> + +#include <machine/cpu.h> +#include <machine/stdarg.h> + +/* + * Start a kernel process. This is called after a fork() call in + * mi_startup() in the file kern/init_main.c. + * + * This function is used to start "internal" daemons and intended + * to be called from SYSINIT(). + */ +void +kproc_start(udata) + const void *udata; +{ + const struct kproc_desc *kp = udata; + int error; + + error = kthread_create((void (*)(void *))kp->func, NULL, + kp->global_procpp, kp->arg0); + if (error) + panic("kproc_start: %s: error %d", kp->arg0, error); +} + +/* + * Create a kernel process/thread/whatever. It shares it's address space + * with proc0 - ie: kernel only. + */ +int +kthread_create(void (*func)(void *), void *arg, + struct proc **newpp, const char *fmt, ...) +{ + int error; + va_list ap; + struct proc *p2; + + error = fork1(&proc0, RFMEM | RFFDG | RFPROC, &p2); + if (error) + return error; + + /* save a global descriptor, if desired */ + if (newpp != NULL) + *newpp = p2; + + /* this is a non-swapped system process */ + p2->p_flag |= P_INMEM | P_SYSTEM | P_NOCLDWAIT; + PHOLD(p2); + + /* set up arg0 for 'ps', et al */ + va_start(ap, fmt); + vsnprintf(p2->p_comm, sizeof(p2->p_comm), fmt, ap); + va_end(ap); + + /* call the processes' main()... */ + cpu_set_fork_handler(p2, func, arg); + + return 0; +} + +void +kthread_exit(int ecode) +{ + exit1(curproc, W_EXITCODE(ecode, 0)); +} + diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c index ce84271..cc6d337 100644 --- a/sys/kern/kern_linker.c +++ b/sys/kern/kern_linker.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: kern_linker.c,v 1.32 1999/05/08 13:01:56 peter Exp $ + * $Id: kern_linker.c,v 1.33 1999/06/30 15:33:35 peter Exp $ */ #include "opt_ddb.h" @@ -96,7 +96,6 @@ linker_file_sysinit(linker_file_t lf) struct sysinit** sipp; struct sysinit** xipp; struct sysinit* save; - struct proc *p2; const moduledata_t *moddata; int error; @@ -149,29 +148,8 @@ linker_file_sysinit(linker_file_t lf) if ((*sipp)->subsystem == SI_SUB_DUMMY) continue; /* skip dummy task(s)*/ - switch ((*sipp)->type) { - case SI_TYPE_DEFAULT: - /* no special processing*/ - (*((*sipp)->func))((*sipp)->udata); - break; - - case SI_TYPE_KTHREAD: - /* kernel thread*/ - if (fork1(&proc0, RFFDG|RFPROC|RFMEM, &p2)) - panic("fork kernel thread"); - cpu_set_fork_handler(p2, (*sipp)->func, (*sipp)->udata); - break; - - case SI_TYPE_KPROCESS: - /* kernel thread*/ - if (fork1(&proc0, RFFDG|RFPROC, &p2)) - panic("fork kernel process"); - cpu_set_fork_handler(p2, (*sipp)->func, (*sipp)->udata); - break; - - default: - panic ("linker_file_sysinit: unrecognized init type"); - } + /* Call function */ + (*((*sipp)->func))((*sipp)->udata); } } @@ -221,15 +199,8 @@ linker_file_sysuninit(linker_file_t lf) if ((*sipp)->subsystem == SI_SUB_DUMMY) continue; /* skip dummy task(s)*/ - switch ((*sipp)->type) { - case SI_TYPE_DEFAULT: - /* no special processing*/ - (*((*sipp)->func))((*sipp)->udata); - break; - - default: - panic("linker_file_sysuninit: unrecognized uninit type"); - } + /* Call function */ + (*((*sipp)->func))((*sipp)->udata); } } diff --git a/sys/kern/uipc_mbuf.c b/sys/kern/uipc_mbuf.c index 4d1f3e2..d7e0de7 100644 --- a/sys/kern/uipc_mbuf.c +++ b/sys/kern/uipc_mbuf.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)uipc_mbuf.c 8.2 (Berkeley) 1/4/94 - * $Id: uipc_mbuf.c,v 1.38 1999/02/16 10:49:49 dfr Exp $ + * $Id: uipc_mbuf.c,v 1.39 1999/04/12 10:07:15 des Exp $ */ #include <sys/param.h> @@ -178,7 +178,7 @@ static struct kproc_desc mclalloc_kp = { kproc_mclalloc, &mclallocproc }; -SYSINIT_KT(mclallocproc, SI_SUB_KTHREAD_UPDATE, SI_ORDER_ANY, kproc_start, +SYSINIT(mclallocproc, SI_SUB_KTHREAD_UPDATE, SI_ORDER_ANY, kproc_start, &mclalloc_kp); #endif diff --git a/sys/kern/vfs_aio.c b/sys/kern/vfs_aio.c index f1bac7f..4c2132d 100644 --- a/sys/kern/vfs_aio.c +++ b/sys/kern/vfs_aio.c @@ -13,7 +13,7 @@ * bad that happens because of using this software isn't the responsibility * of the author. This software is distributed AS-IS. * - * $Id: vfs_aio.c,v 1.52 1999/06/26 02:46:05 mckusick Exp $ + * $Id: vfs_aio.c,v 1.53 1999/06/30 15:33:36 peter Exp $ */ /* @@ -236,7 +236,7 @@ static int aio_aqueue(struct proc *p, struct aiocb *job, int type) ; static void aio_physwakeup(struct buf *bp); static int aio_fphysio(struct proc *p, struct aiocblist *aiocbe, int type); static int aio_qphysio(struct proc *p, struct aiocblist *iocb); -static void aio_daemon(const void *uproc); +static void aio_daemon(void *uproc); SYSINIT(aio, SI_SUB_VFS, SI_ORDER_ANY, aio_onceonly, NULL); @@ -598,7 +598,7 @@ aio_process(struct aiocblist *aiocbe) * but the setup (and address space mgmt) is done in this routine. */ static void -aio_daemon(const void *uproc) +aio_daemon(void *uproc) { int s; struct aioproclist *aiop; diff --git a/sys/kern/vfs_export.c b/sys/kern/vfs_export.c index 2a94962..579d214 100644 --- a/sys/kern/vfs_export.c +++ b/sys/kern/vfs_export.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)vfs_subr.c 8.31 (Berkeley) 5/26/95 - * $Id: vfs_subr.c,v 1.202 1999/06/16 23:27:32 mckusick Exp $ + * $Id: vfs_subr.c,v 1.203 1999/06/26 02:46:10 mckusick Exp $ */ /* @@ -50,6 +50,7 @@ #include <sys/fcntl.h> #include <sys/kernel.h> #include <sys/proc.h> +#include <sys/kthread.h> #include <sys/malloc.h> #include <sys/mount.h> #include <sys/socket.h> @@ -907,12 +908,12 @@ vn_syncer_add_to_worklist(struct vnode *vp, int delay) struct proc *updateproc; static void sched_sync __P((void)); -static const struct kproc_desc up_kp = { +static struct kproc_desc up_kp = { "syncer", sched_sync, &updateproc }; -SYSINIT_KT(syncer, SI_SUB_KTHREAD_UPDATE, SI_ORDER_FIRST, kproc_start, &up_kp) +SYSINIT(syncer, SI_SUB_KTHREAD_UPDATE, SI_ORDER_FIRST, kproc_start, &up_kp) /* * System filesystem synchronizer daemon. diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index 2a94962..579d214 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)vfs_subr.c 8.31 (Berkeley) 5/26/95 - * $Id: vfs_subr.c,v 1.202 1999/06/16 23:27:32 mckusick Exp $ + * $Id: vfs_subr.c,v 1.203 1999/06/26 02:46:10 mckusick Exp $ */ /* @@ -50,6 +50,7 @@ #include <sys/fcntl.h> #include <sys/kernel.h> #include <sys/proc.h> +#include <sys/kthread.h> #include <sys/malloc.h> #include <sys/mount.h> #include <sys/socket.h> @@ -907,12 +908,12 @@ vn_syncer_add_to_worklist(struct vnode *vp, int delay) struct proc *updateproc; static void sched_sync __P((void)); -static const struct kproc_desc up_kp = { +static struct kproc_desc up_kp = { "syncer", sched_sync, &updateproc }; -SYSINIT_KT(syncer, SI_SUB_KTHREAD_UPDATE, SI_ORDER_FIRST, kproc_start, &up_kp) +SYSINIT(syncer, SI_SUB_KTHREAD_UPDATE, SI_ORDER_FIRST, kproc_start, &up_kp) /* * System filesystem synchronizer daemon. diff --git a/sys/powerpc/aim/vm_machdep.c b/sys/powerpc/aim/vm_machdep.c index a638794..4abdd94 100644 --- a/sys/powerpc/aim/vm_machdep.c +++ b/sys/powerpc/aim/vm_machdep.c @@ -38,7 +38,7 @@ * * from: @(#)vm_machdep.c 7.3 (Berkeley) 5/13/91 * Utah $Hdr: vm_machdep.c 1.16.1.1 89/06/23$ - * $Id: vm_machdep.c,v 1.15 1999/06/08 16:42:19 dt Exp $ + * $Id: vm_machdep.c,v 1.16 1999/06/10 20:40:59 dt Exp $ */ /* * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. @@ -218,8 +218,8 @@ cpu_fork(p1, p2) void cpu_set_fork_handler(p, func, arg) struct proc *p; - void (*func) __P((const void *)); - const void *arg; + void (*func) __P((void *)); + void *arg; { /* * Note that the trap frame follows the args, so the function diff --git a/sys/powerpc/powerpc/vm_machdep.c b/sys/powerpc/powerpc/vm_machdep.c index a638794..4abdd94 100644 --- a/sys/powerpc/powerpc/vm_machdep.c +++ b/sys/powerpc/powerpc/vm_machdep.c @@ -38,7 +38,7 @@ * * from: @(#)vm_machdep.c 7.3 (Berkeley) 5/13/91 * Utah $Hdr: vm_machdep.c 1.16.1.1 89/06/23$ - * $Id: vm_machdep.c,v 1.15 1999/06/08 16:42:19 dt Exp $ + * $Id: vm_machdep.c,v 1.16 1999/06/10 20:40:59 dt Exp $ */ /* * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. @@ -218,8 +218,8 @@ cpu_fork(p1, p2) void cpu_set_fork_handler(p, func, arg) struct proc *p; - void (*func) __P((const void *)); - const void *arg; + void (*func) __P((void *)); + void *arg; { /* * Note that the trap frame follows the args, so the function diff --git a/sys/sys/kernel.h b/sys/sys/kernel.h index 24a0a6a..e483763 100644 --- a/sys/sys/kernel.h +++ b/sys/sys/kernel.h @@ -39,7 +39,7 @@ * SUCH DAMAGE. * * @(#)kernel.h 8.3 (Berkeley) 1/21/94 - * $Id: kernel.h,v 1.54 1999/04/17 08:36:06 peter Exp $ + * $Id: kernel.h,v 1.55 1999/05/06 13:42:25 peter Exp $ */ #ifndef _SYS_KERNEL_H_ @@ -162,18 +162,6 @@ enum sysinit_elem_order { /* - * System initialization call types; currently two are supported... one - * to do a simple function call and one to cause a process to be started - * by the kernel on the callers behalf. - */ -typedef enum sysinit_elem_type { - SI_TYPE_DEFAULT = 0x00000000, /* No special processing*/ - SI_TYPE_KTHREAD = 0x00000001, /* start kernel thread*/ - SI_TYPE_KPROCESS = 0x00000002 /* start kernel process*/ -} si_elem_t; - - -/* * A system initialization call instance * * At the moment there is one instance of sysinit. We probably do not @@ -204,7 +192,6 @@ struct sysinit { unsigned int order; /* init order within subsystem*/ sysinit_cfunc_t func; /* function */ const void *udata; /* multiplexer/argument */ - si_elem_t type; /* sysinit_elem_type*/ }; /* @@ -224,13 +211,13 @@ struct sysinit { subsystem, \ order, \ func, \ - ident, \ - SI_TYPE_DEFAULT \ + ident \ }; \ DATA_SET(sysinit_set,uniquifier ## _sys_init); #define SYSINIT(uniquifier, subsystem, order, func, ident) \ - C_SYSINIT(uniquifier, subsystem, order, (sysinit_cfunc_t)(sysinit_nfunc_t)func, (void *)ident) + C_SYSINIT(uniquifier, subsystem, order, \ + (sysinit_cfunc_t)(sysinit_nfunc_t)func, (void *)ident) /* * Called on module unload: no special processing @@ -239,52 +226,15 @@ struct sysinit { static struct sysinit uniquifier ## _sys_uninit = { \ subsystem, \ order, \ - func, \ - ident, \ - SI_TYPE_DEFAULT \ + func, \ + ident \ }; \ DATA_SET(sysuninit_set,uniquifier ## _sys_uninit) #define SYSUNINIT(uniquifier, subsystem, order, func, ident) \ - C_SYSUNINIT(uniquifier, subsystem, order, (sysinit_cfunc_t)(sysinit_nfunc_t)func, (void *)ident) - -/* - * Call 'fork()' before calling '(*func)(ident)'; - * for making a kernel 'thread' (or builtin process.) - */ -#define SYSINIT_KT(uniquifier, subsystem, order, func, ident) \ - static struct sysinit uniquifier ## _sys_init = { \ - subsystem, \ - order, \ - func, \ - ident, \ - SI_TYPE_KTHREAD \ - }; \ - DATA_SET(sysinit_set,uniquifier ## _sys_init); - -#define SYSINIT_KP(uniquifier, subsystem, order, func, ident) \ - static struct sysinit uniquifier ## _sys_init = { \ - subsystem, \ - order, \ - func, \ - ident, \ - SI_TYPE_KPROCESS \ - }; \ - DATA_SET(sysinit_set,uniquifier ## _sys_init); - - -/* - * A kernel process descriptor; used to start "internal" daemons - * - * Note: global_procpp may be NULL for no global save area - */ -struct kproc_desc { - char *arg0; /* arg 0 (for 'ps' listing)*/ - void (*func) __P((void)); /* "main" for kernel process*/ - struct proc **global_procpp; /* ptr to proc ptr save area*/ -}; + C_SYSUNINIT(uniquifier, subsystem, order, \ + (sysinit_cfunc_t)(sysinit_nfunc_t)func, (void *)ident) -void kproc_start __P((const void *udata)); void sysinit_add __P((struct sysinit **set)); /* diff --git a/sys/sys/kthread.h b/sys/sys/kthread.h new file mode 100644 index 0000000..afea3c6 --- /dev/null +++ b/sys/sys/kthread.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 1999 Peter Wemm <peter@FreeBSD.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _SYS_KTHREAD_H_ +#define _SYS_KTHREAD_H_ + +struct proc; + +/* + * A kernel process descriptor; used to start "internal" daemons + * + * Note: global_procpp may be NULL for no global save area + */ +struct kproc_desc { + char *arg0; /* arg 0 (for 'ps' listing) */ + void (*func) __P((void)); /* "main" for kernel process */ + struct proc **global_procpp; /* ptr to proc ptr save area */ +}; + +void kproc_start __P((const void *)); +int kthread_create __P((void (*)(void *), void *, struct proc **, + const char *, ...)) __printflike(4, 5); +void kthread_exit __P((int)) __dead2; + +#endif diff --git a/sys/sys/proc.h b/sys/sys/proc.h index dfe1251..8bc3147 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)proc.h 8.15 (Berkeley) 5/19/95 - * $Id: proc.h,v 1.82 1999/06/28 09:14:18 peter Exp $ + * $Id: proc.h,v 1.83 1999/06/30 15:33:41 peter Exp $ */ #ifndef _SYS_PROC_H_ @@ -398,8 +398,7 @@ void wakeup_one __P((void *chan)); void cpu_exit __P((struct proc *)) __dead2; void exit1 __P((struct proc *, int)) __dead2; void cpu_fork __P((struct proc *, struct proc *)); -void cpu_set_fork_handler __P((struct proc *, void (*pc)(const void *), - const void *)); +void cpu_set_fork_handler __P((struct proc *, void (*)(void *), void *)); int fork1 __P((struct proc *, int, struct proc **)); int trace_req __P((struct proc *)); void cpu_wait __P((struct proc *)); diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c index a564863..414c922 100644 --- a/sys/vm/vm_pageout.c +++ b/sys/vm/vm_pageout.c @@ -65,7 +65,7 @@ * any improvements or extensions that they make and grant Carnegie the * rights to redistribute these changes. * - * $Id: vm_pageout.c,v 1.141 1999/04/23 20:29:57 dt Exp $ + * $Id: vm_pageout.c,v 1.142 1999/06/26 14:56:58 peter Exp $ */ /* @@ -77,6 +77,7 @@ #include <sys/systm.h> #include <sys/kernel.h> #include <sys/proc.h> +#include <sys/kthread.h> #include <sys/resourcevar.h> #include <sys/signalvar.h> #include <sys/vnode.h> @@ -111,7 +112,7 @@ static struct kproc_desc page_kp = { vm_pageout, &pageproc }; -SYSINIT_KT(pagedaemon, SI_SUB_KTHREAD_PAGE, SI_ORDER_FIRST, kproc_start, &page_kp) +SYSINIT(pagedaemon, SI_SUB_KTHREAD_PAGE, SI_ORDER_FIRST, kproc_start, &page_kp) #if !defined(NO_SWAPPING) /* the kernel process "vm_daemon"*/ @@ -123,7 +124,7 @@ static struct kproc_desc vm_kp = { vm_daemon, &vmproc }; -SYSINIT_KT(vmdaemon, SI_SUB_KTHREAD_VM, SI_ORDER_FIRST, kproc_start, &vm_kp) +SYSINIT(vmdaemon, SI_SUB_KTHREAD_VM, SI_ORDER_FIRST, kproc_start, &vm_kp) #endif |