xref: /freebsd/share/man/man9/kproc.9 (revision fa9896e082a1046ff4fbc75fcba4d18d1f2efc19)
1d91be65fSJulian Elischer.\" Copyright (c) 2000-2001
2d91be65fSJulian Elischer.\"	The Regents of the University of California.  All rights reserved.
3d91be65fSJulian Elischer.\"
4d91be65fSJulian Elischer.\" All rights reserved.
5d91be65fSJulian Elischer.\"
6d91be65fSJulian Elischer.\" Redistribution and use in source and binary forms, with or without
7d91be65fSJulian Elischer.\" modification, are permitted provided that the following conditions
8d91be65fSJulian Elischer.\" are met:
9d91be65fSJulian Elischer.\" 1. Redistributions of source code must retain the above copyright
10d91be65fSJulian Elischer.\"    notice, this list of conditions and the following disclaimer.
11d91be65fSJulian Elischer.\" 2. Redistributions in binary form must reproduce the above copyright
12d91be65fSJulian Elischer.\"    notice, this list of conditions and the following disclaimer in the
13d91be65fSJulian Elischer.\"    documentation and/or other materials provided with the distribution.
14d91be65fSJulian Elischer.\"
15d91be65fSJulian Elischer.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR
16d91be65fSJulian Elischer.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17d91be65fSJulian Elischer.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18d91be65fSJulian Elischer.\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT,
19d91be65fSJulian Elischer.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20d91be65fSJulian Elischer.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21d91be65fSJulian Elischer.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22d91be65fSJulian Elischer.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23d91be65fSJulian Elischer.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24d91be65fSJulian Elischer.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25d91be65fSJulian Elischer.\"
26d91be65fSJulian Elischer.Dd October 19, 2007
27d91be65fSJulian Elischer.Dt KPROC 9
28d91be65fSJulian Elischer.Os
29d91be65fSJulian Elischer.Sh NAME
30d91be65fSJulian Elischer.Nm kproc_start ,
31d91be65fSJulian Elischer.Nm kproc_shutdown ,
32d91be65fSJulian Elischer.Nm kproc_create ,
33d91be65fSJulian Elischer.Nm kproc_exit ,
34d91be65fSJulian Elischer.Nm kproc_resume ,
35d91be65fSJulian Elischer.Nm kproc_suspend ,
36d91be65fSJulian Elischer.Nm kproc_suspend_check
3739b920ebSJulian Elischer.Nd "kernel processes"
38d91be65fSJulian Elischer.Sh SYNOPSIS
39d91be65fSJulian Elischer.In sys/kthread.h
40d91be65fSJulian Elischer.Ft void
41d91be65fSJulian Elischer.Fn kproc_start "const void *udata"
42d91be65fSJulian Elischer.Ft void
43d91be65fSJulian Elischer.Fn kproc_shutdown "void *arg" "int howto"
44d91be65fSJulian Elischer.Ft int
4539b920ebSJulian Elischer.Fo kproc_create
4639b920ebSJulian Elischer.Fa "void (*func)(void *)" "void *arg" "struct proc **newpp"
4739b920ebSJulian Elischer.Fa "int flags" "int pages"
4839b920ebSJulian Elischer.Fa "const char *fmt" ...
4939b920ebSJulian Elischer.Fc
50d91be65fSJulian Elischer.Ft void
51d91be65fSJulian Elischer.Fn kproc_exit "int ecode"
52d91be65fSJulian Elischer.Ft int
53d91be65fSJulian Elischer.Fn kproc_resume "struct proc *p"
54d91be65fSJulian Elischer.Ft int
55d91be65fSJulian Elischer.Fn kproc_suspend "struct proc *p" "int timo"
56d91be65fSJulian Elischer.Ft void
57d91be65fSJulian Elischer.Fn kproc_suspend_check "struct proc *p"
58c59b9a76SJulian Elischer.Ft int
59c59b9a76SJulian Elischer.Fo kproc_kthread_add
60c59b9a76SJulian Elischer.Fa "void (*func)(void *)" "void *arg"
61c59b9a76SJulian Elischer.Fa "struct proc **procptr" "struct thread **tdptr"
62c59b9a76SJulian Elischer.Fa "int flags" "int pages" "char * procname" "const char *fmt" "..."
63c59b9a76SJulian Elischer.Fc
64d91be65fSJulian Elischer.Sh DESCRIPTION
6558cf5c84SJulian ElischerIn
6658cf5c84SJulian Elischer.Fx 8.0 ,
6758cf5c84SJulian Elischerthe
6858cf5c84SJulian Elischer.Fn kthread* 9
6958cf5c84SJulian Elischerfamily of functions was renamed to be the
7058cf5c84SJulian Elischer.Fn kproc* 9
7158cf5c84SJulian Elischerfamily of functions, as they were misnamed
7258cf5c84SJulian Elischerand actually produced kernel processes.
7358cf5c84SJulian ElischerA new family of
7458cf5c84SJulian Elischer.Em different
7558cf5c84SJulian Elischer.Fn kthread_* 9
7658cf5c84SJulian Elischerfunctions was added to produce
7758cf5c84SJulian Elischer.Em real
7858cf5c84SJulian Elischerkernel
7958cf5c84SJulian Elischer.Em threads .
8058cf5c84SJulian ElischerSee the
8158cf5c84SJulian Elischer.Xr kthread 9
8258cf5c84SJulian Elischerman page for more information on those calls.
8358cf5c84SJulian ElischerAlso note that the
8458cf5c84SJulian Elischer.Fn kproc_kthread_add 9
8558cf5c84SJulian Elischerfunction appears in both pages as its functionality is split.
8658cf5c84SJulian Elischer.Pp
87d91be65fSJulian ElischerThe function
88d91be65fSJulian Elischer.Fn kproc_start
89d91be65fSJulian Elischeris used to start
90d91be65fSJulian Elischer.Dq internal
9139b920ebSJulian Elischerdaemons such as
9239b920ebSJulian Elischer.Nm bufdaemon , pagedaemon , vmdaemon ,
9339b920ebSJulian Elischerand the
9439b920ebSJulian Elischer.Nm syncer
9539b920ebSJulian Elischerand is intended
96d91be65fSJulian Elischerto be called from
97d91be65fSJulian Elischer.Xr SYSINIT 9 .
98d91be65fSJulian ElischerThe
99d91be65fSJulian Elischer.Fa udata
100d91be65fSJulian Elischerargument is actually a pointer to a
10139b920ebSJulian Elischer.Vt "struct kproc_desc"
102d91be65fSJulian Elischerwhich describes the kernel process that should be created:
103d91be65fSJulian Elischer.Bd -literal -offset indent
104d91be65fSJulian Elischerstruct kproc_desc {
105d91be65fSJulian Elischer	char		*arg0;
106d91be65fSJulian Elischer	void		(*func)(void);
107d91be65fSJulian Elischer	struct proc	**global_procpp;
108d91be65fSJulian Elischer};
109d91be65fSJulian Elischer.Ed
110d91be65fSJulian Elischer.Pp
111d91be65fSJulian ElischerThe structure members are used by
112d91be65fSJulian Elischer.Fn kproc_start
113d91be65fSJulian Elischeras follows:
11439b920ebSJulian Elischer.Bl -tag -width ".Va global_procpp" -offset indent
115d91be65fSJulian Elischer.It Va arg0
116d91be65fSJulian ElischerString to be used for the name of the process.
117d91be65fSJulian ElischerThis string will be copied into the
118d91be65fSJulian Elischer.Va p_comm
119d91be65fSJulian Elischermember of the new process'
12039b920ebSJulian Elischer.Vt "struct proc" .
121d91be65fSJulian Elischer.It Va func
122d91be65fSJulian ElischerThe main function for this kernel process to run.
123d91be65fSJulian Elischer.It Va global_procpp
124d91be65fSJulian ElischerA pointer to a
12539b920ebSJulian Elischer.Vt "struct proc"
126d91be65fSJulian Elischerpointer that should be updated to point to the newly created process' process
127d91be65fSJulian Elischerstructure.
128d91be65fSJulian ElischerIf this variable is
129d91be65fSJulian Elischer.Dv NULL ,
130d91be65fSJulian Elischerthen it is ignored.
131d91be65fSJulian Elischer.El
132d91be65fSJulian Elischer.Pp
133d91be65fSJulian ElischerThe
134d91be65fSJulian Elischer.Fn kproc_create
135d91be65fSJulian Elischerfunction is used to create a kernel process.
13639b920ebSJulian ElischerThe new process shares its address space with process 0, the
13739b920ebSJulian Elischer.Nm swapper
13839b920ebSJulian Elischerprocess,
139d91be65fSJulian Elischerand runs in kernel mode only.
140d91be65fSJulian ElischerThe
141d91be65fSJulian Elischer.Fa func
142d91be65fSJulian Elischerargument specifies the function that the process should execute.
143d91be65fSJulian ElischerThe
144d91be65fSJulian Elischer.Fa arg
145d91be65fSJulian Elischerargument is an arbitrary pointer that is passed in as the only argument to
146d91be65fSJulian Elischer.Fa func
147d91be65fSJulian Elischerwhen it is called by the new process.
148d91be65fSJulian ElischerThe
149d91be65fSJulian Elischer.Fa newpp
150d91be65fSJulian Elischerpointer points to a
15139b920ebSJulian Elischer.Vt "struct proc"
152d91be65fSJulian Elischerpointer that is to be updated to point to the newly created process.
153d91be65fSJulian ElischerIf this argument is
154d91be65fSJulian Elischer.Dv NULL ,
155d91be65fSJulian Elischerthen it is ignored.
156d91be65fSJulian ElischerThe
157d91be65fSJulian Elischer.Fa flags
158d91be65fSJulian Elischerargument specifies a set of flags as described in
159d91be65fSJulian Elischer.Xr rfork 2 .
160d91be65fSJulian ElischerThe
161d91be65fSJulian Elischer.Fa pages
162d91be65fSJulian Elischerargument specifies the size of the new kernel process's stack in pages.
163d91be65fSJulian ElischerIf 0 is used, the default kernel stack size is allocated.
164d91be65fSJulian ElischerThe rest of the arguments form a
165d91be65fSJulian Elischer.Xr printf 9
166d91be65fSJulian Elischerargument list that is used to build the name of the new process and is stored
167d91be65fSJulian Elischerin the
168d91be65fSJulian Elischer.Va p_comm
169d91be65fSJulian Elischermember of the new process's
17039b920ebSJulian Elischer.Vt "struct proc" .
171d91be65fSJulian Elischer.Pp
172d91be65fSJulian ElischerThe
173d91be65fSJulian Elischer.Fn kproc_exit
174d91be65fSJulian Elischerfunction is used to terminate kernel processes.
175d91be65fSJulian ElischerIt should be called by the main function of the kernel process rather than
176d91be65fSJulian Elischerletting the main function return to its caller.
177d91be65fSJulian ElischerThe
178d91be65fSJulian Elischer.Fa ecode
179d91be65fSJulian Elischerargument specifies the exit status of the process.
180d91be65fSJulian ElischerWhile exiting, the function
181d91be65fSJulian Elischer.Xr exit1 9
182d91be65fSJulian Elischerwill initiate a call to
183d91be65fSJulian Elischer.Xr wakeup 9
184d91be65fSJulian Elischeron the process handle.
185d91be65fSJulian Elischer.Pp
186d91be65fSJulian ElischerThe
187d91be65fSJulian Elischer.Fn kproc_resume ,
188d91be65fSJulian Elischer.Fn kproc_suspend ,
189d91be65fSJulian Elischerand
190d91be65fSJulian Elischer.Fn kproc_suspend_check
191d91be65fSJulian Elischerfunctions are used to suspend and resume a kernel process.
192d91be65fSJulian ElischerDuring the main loop of its execution, a kernel process that wishes to allow
193d91be65fSJulian Elischeritself to be suspended should call
194d91be65fSJulian Elischer.Fn kproc_suspend_check
195d91be65fSJulian Elischerpassing in
196d91be65fSJulian Elischer.Va curproc
197d91be65fSJulian Elischeras the only argument.
198d91be65fSJulian ElischerThis function checks to see if the kernel process has been asked to suspend.
199d91be65fSJulian ElischerIf it has, it will
200d91be65fSJulian Elischer.Xr tsleep 9
201d91be65fSJulian Elischeruntil it is told to resume.
202d91be65fSJulian ElischerOnce it has been told to resume it will return allowing execution of the
203d91be65fSJulian Elischerkernel process to continue.
204d91be65fSJulian ElischerThe other two functions are used to notify a kernel process of a suspend or
205d91be65fSJulian Elischerresume request.
206d91be65fSJulian ElischerThe
207d91be65fSJulian Elischer.Fa p
208d91be65fSJulian Elischerargument points to the
20939b920ebSJulian Elischer.Vt "struct proc"
210d91be65fSJulian Elischerof the kernel process to suspend or resume.
211d91be65fSJulian ElischerFor
212d91be65fSJulian Elischer.Fn kproc_suspend ,
213d91be65fSJulian Elischerthe
214d91be65fSJulian Elischer.Fa timo
215d91be65fSJulian Elischerargument specifies a timeout to wait for the kernel process to acknowledge the
216d91be65fSJulian Elischersuspend request and suspend itself.
217d91be65fSJulian Elischer.Pp
218d91be65fSJulian ElischerThe
219d91be65fSJulian Elischer.Fn kproc_shutdown
220d91be65fSJulian Elischerfunction is meant to be registered as a shutdown event for kernel processes that
221d91be65fSJulian Elischerneed to be suspended voluntarily during system shutdown so as not to interfere
222d91be65fSJulian Elischerwith system shutdown activities.
223d91be65fSJulian ElischerThe actual suspension of the kernel process is done with
224d91be65fSJulian Elischer.Fn kproc_suspend .
225c59b9a76SJulian Elischer.Pp
226c59b9a76SJulian ElischerThe
227c59b9a76SJulian Elischer.Fn kproc_kthread_add
228c59b9a76SJulian Elischerfunction is much like the
229c59b9a76SJulian Elischer.Fn kproc_create
230c59b9a76SJulian Elischerfunction above except that if the kproc already exists,
231c59b9a76SJulian Elischerthen only a new thread (see
232c59b9a76SJulian Elischer.Xr kthread 9 )
233c59b9a76SJulian Elischeris created on the existing process.
234c59b9a76SJulian ElischerThe
235c59b9a76SJulian Elischer.Fa func
236c59b9a76SJulian Elischerargument specifies the function that the process should execute.
237c59b9a76SJulian ElischerThe
238c59b9a76SJulian Elischer.Fa arg
239c59b9a76SJulian Elischerargument is an arbitrary pointer that is passed in as the only argument to
240c59b9a76SJulian Elischer.Fa func
241c59b9a76SJulian Elischerwhen it is called by the new process.
242c59b9a76SJulian ElischerThe
243c59b9a76SJulian Elischer.Fa procptr
244c59b9a76SJulian Elischerpointer points to a
245c59b9a76SJulian Elischer.Vt "struct proc"
246c59b9a76SJulian Elischerpointer that is the location to be updated with the new proc pointer
247c59b9a76SJulian Elischerif a new process is created, or if not
248c59b9a76SJulian Elischer.Dv NULL ,
249*9ba47352SJoel Dahlmust contain the process pointer for the already existing process.
250c59b9a76SJulian ElischerIf this argument points to
251c59b9a76SJulian Elischer.Dv NULL ,
252c59b9a76SJulian Elischerthen a new process is created and the field updated.
253c59b9a76SJulian ElischerIf not NULL, the
254c59b9a76SJulian Elischer.Fa tdptr
255c59b9a76SJulian Elischerpointer points to a
256c59b9a76SJulian Elischer.Vt "struct thread"
257c59b9a76SJulian Elischerpointer that is the location to be updated with the new thread pointer.
258c59b9a76SJulian ElischerThe
259c59b9a76SJulian Elischer.Fa flags
260c59b9a76SJulian Elischerargument specifies a set of flags as described in
261c59b9a76SJulian Elischer.Xr rfork 2 .
262c59b9a76SJulian ElischerThe
263c59b9a76SJulian Elischer.Fa pages
264c59b9a76SJulian Elischerargument specifies the size of the new kernel thread's stack in pages.
265c59b9a76SJulian ElischerIf 0 is used, the default kernel stack size is allocated.
266c59b9a76SJulian ElischerThe procname argument is the name the new process should be given if it needs to be created.
267c59b9a76SJulian ElischerIt is
268c59b9a76SJulian Elischer.Em NOT
269c59b9a76SJulian Elischera printf style format specifier but a simple string.
270c59b9a76SJulian ElischerThe rest of the arguments form a
271c59b9a76SJulian Elischer.Xr printf 9
272c59b9a76SJulian Elischerargument list that is used to build the name of the new thread and is stored
273c59b9a76SJulian Elischerin the
274c59b9a76SJulian Elischer.Va td_name
275c59b9a76SJulian Elischermember of the new thread's
276c59b9a76SJulian Elischer.Vt "struct thread" .
277d91be65fSJulian Elischer.Sh RETURN VALUES
278d91be65fSJulian ElischerThe
279d91be65fSJulian Elischer.Fn kproc_create ,
280d91be65fSJulian Elischer.Fn kproc_resume ,
281d91be65fSJulian Elischerand
282d91be65fSJulian Elischer.Fn kproc_suspend
283d91be65fSJulian Elischerfunctions return zero on success and non-zero on failure.
284d91be65fSJulian Elischer.Sh EXAMPLES
285d91be65fSJulian ElischerThis example demonstrates the use of a
28639b920ebSJulian Elischer.Vt "struct kproc_desc"
287d91be65fSJulian Elischerand the functions
288d91be65fSJulian Elischer.Fn kproc_start ,
289d91be65fSJulian Elischer.Fn kproc_shutdown ,
290d91be65fSJulian Elischerand
291d91be65fSJulian Elischer.Fn kproc_suspend_check
292d91be65fSJulian Elischerto run the
29339b920ebSJulian Elischer.Nm bufdaemon
294d91be65fSJulian Elischerprocess.
295d91be65fSJulian Elischer.Bd -literal -offset indent
296d91be65fSJulian Elischerstatic struct proc *bufdaemonproc;
297d91be65fSJulian Elischer
298d91be65fSJulian Elischerstatic struct kproc_desc buf_kp = {
299d91be65fSJulian Elischer	"bufdaemon",
300d91be65fSJulian Elischer	buf_daemon,
301d91be65fSJulian Elischer	&bufdaemonproc
302d91be65fSJulian Elischer};
303d91be65fSJulian ElischerSYSINIT(bufdaemon, SI_SUB_KTHREAD_BUF, SI_ORDER_FIRST, kproc_start,
304d91be65fSJulian Elischer    &buf_kp)
305d91be65fSJulian Elischer
306d91be65fSJulian Elischerstatic void
307d91be65fSJulian Elischerbuf_daemon()
308d91be65fSJulian Elischer{
309d91be65fSJulian Elischer	...
310d91be65fSJulian Elischer	/*
311d91be65fSJulian Elischer	 * This process needs to be suspended prior to shutdown sync.
312d91be65fSJulian Elischer	 */
313d91be65fSJulian Elischer	EVENTHANDLER_REGISTER(shutdown_pre_sync, kproc_shutdown,
314d91be65fSJulian Elischer	    bufdaemonproc, SHUTDOWN_PRI_LAST);
315d91be65fSJulian Elischer	...
316d91be65fSJulian Elischer	for (;;) {
317d91be65fSJulian Elischer		kproc_suspend_check(bufdaemonproc);
318d91be65fSJulian Elischer		...
319d91be65fSJulian Elischer	}
320d91be65fSJulian Elischer}
321d91be65fSJulian Elischer.Ed
322d91be65fSJulian Elischer.Sh ERRORS
323d91be65fSJulian ElischerThe
324d91be65fSJulian Elischer.Fn kproc_resume
325d91be65fSJulian Elischerand
326d91be65fSJulian Elischer.Fn kproc_suspend
327d91be65fSJulian Elischerfunctions will fail if:
328d91be65fSJulian Elischer.Bl -tag -width Er
329d91be65fSJulian Elischer.It Bq Er EINVAL
330d91be65fSJulian ElischerThe
331d91be65fSJulian Elischer.Fa p
332d91be65fSJulian Elischerargument does not reference a kernel process.
333d91be65fSJulian Elischer.El
334d91be65fSJulian Elischer.Pp
335d91be65fSJulian ElischerThe
336d91be65fSJulian Elischer.Fn kproc_create
337d91be65fSJulian Elischerfunction will fail if:
338d91be65fSJulian Elischer.Bl -tag -width Er
339d91be65fSJulian Elischer.It Bq Er EAGAIN
340d91be65fSJulian ElischerThe system-imposed limit on the total
341d91be65fSJulian Elischernumber of processes under execution would be exceeded.
342d91be65fSJulian ElischerThe limit is given by the
343d91be65fSJulian Elischer.Xr sysctl 3
344d91be65fSJulian ElischerMIB variable
345d91be65fSJulian Elischer.Dv KERN_MAXPROC .
346d91be65fSJulian Elischer.It Bq Er EINVAL
347d91be65fSJulian ElischerThe
348d91be65fSJulian Elischer.Dv RFCFDG
349d91be65fSJulian Elischerflag was specified in the
350d91be65fSJulian Elischer.Fa flags
351d91be65fSJulian Elischerparameter.
352d91be65fSJulian Elischer.El
353d91be65fSJulian Elischer.Sh SEE ALSO
354d91be65fSJulian Elischer.Xr rfork 2 ,
355d91be65fSJulian Elischer.Xr exit1 9 ,
356d91be65fSJulian Elischer.Xr kthread 9 ,
357d91be65fSJulian Elischer.Xr SYSINIT 9 ,
358d91be65fSJulian Elischer.Xr wakeup 9
359d91be65fSJulian Elischer.Sh HISTORY
360d91be65fSJulian ElischerThe
361d91be65fSJulian Elischer.Fn kproc_start
362d91be65fSJulian Elischerfunction first appeared in
363d91be65fSJulian Elischer.Fx 2.2 .
364d91be65fSJulian ElischerThe
365d91be65fSJulian Elischer.Fn kproc_shutdown ,
366d91be65fSJulian Elischer.Fn kproc_create ,
367d91be65fSJulian Elischer.Fn kproc_exit ,
368d91be65fSJulian Elischer.Fn kproc_resume ,
369d91be65fSJulian Elischer.Fn kproc_suspend ,
370d91be65fSJulian Elischerand
371d91be65fSJulian Elischer.Fn kproc_suspend_check
372d91be65fSJulian Elischerfunctions were introduced in
373d91be65fSJulian Elischer.Fx 4.0 .
374d91be65fSJulian ElischerPrior to
375d91be65fSJulian Elischer.Fx 5.0 ,
376d91be65fSJulian Elischerthe
377d91be65fSJulian Elischer.Fn kproc_shutdown ,
378d91be65fSJulian Elischer.Fn kproc_resume ,
379d91be65fSJulian Elischer.Fn kproc_suspend ,
380d91be65fSJulian Elischerand
381d91be65fSJulian Elischer.Fn kproc_suspend_check
382d91be65fSJulian Elischerfunctions were named
383d91be65fSJulian Elischer.Fn shutdown_kproc ,
384d91be65fSJulian Elischer.Fn resume_kproc ,
385d91be65fSJulian Elischer.Fn shutdown_kproc ,
386d91be65fSJulian Elischerand
387d91be65fSJulian Elischer.Fn kproc_suspend_loop ,
38839b920ebSJulian Elischerrespectively.
38939b920ebSJulian ElischerOriginally they had the names
39039b920ebSJulian Elischer.Fn kthread_*
39139b920ebSJulian Elischerbut were changed to
39239b920ebSJulian Elischer.Fn kproc_*
39339b920ebSJulian Elischerwhen real kthreads became available.
394