summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1999-07-01 13:21:46 +0000
committerpeter <peter@FreeBSD.org>1999-07-01 13:21:46 +0000
commit6cb5fe6c6bfe3fbe7878f6c055e0deb2ad86d77c (patch)
tree3d833b579e08cb5e2dc4561ebb531129df5f2eb3
parente671ad02ffd3e5dedda4576976c1952f1f8d8fe3 (diff)
downloadFreeBSD-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.
-rw-r--r--sys/alpha/alpha/vm_machdep.c6
-rw-r--r--sys/amd64/amd64/vm_machdep.c6
-rw-r--r--sys/conf/files1
-rw-r--r--sys/i386/i386/vm_machdep.c6
-rw-r--r--sys/kern/init_main.c110
-rw-r--r--sys/kern/kern_kthread.c100
-rw-r--r--sys/kern/kern_linker.c39
-rw-r--r--sys/kern/uipc_mbuf.c4
-rw-r--r--sys/kern/vfs_aio.c6
-rw-r--r--sys/kern/vfs_export.c7
-rw-r--r--sys/kern/vfs_subr.c7
-rw-r--r--sys/powerpc/aim/vm_machdep.c6
-rw-r--r--sys/powerpc/powerpc/vm_machdep.c6
-rw-r--r--sys/sys/kernel.h66
-rw-r--r--sys/sys/kthread.h50
-rw-r--r--sys/sys/proc.h5
-rw-r--r--sys/vm/vm_pageout.c7
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
OpenPOWER on IntegriCloud