xref: /freebsd/share/man/man9/kproc.9 (revision 58cf5c84e0571eca794fc57018b93ff9a09379ab)
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.\" $FreeBSD$
27d91be65fSJulian Elischer.\"
28d91be65fSJulian Elischer.Dd October 19, 2007
29d91be65fSJulian Elischer.Dt KPROC 9
30d91be65fSJulian Elischer.Os
31d91be65fSJulian Elischer.Sh NAME
32d91be65fSJulian Elischer.Nm kproc_start ,
33d91be65fSJulian Elischer.Nm kproc_shutdown ,
34d91be65fSJulian Elischer.Nm kproc_create ,
35d91be65fSJulian Elischer.Nm kproc_exit ,
36d91be65fSJulian Elischer.Nm kproc_resume ,
37d91be65fSJulian Elischer.Nm kproc_suspend ,
38d91be65fSJulian Elischer.Nm kproc_suspend_check
3939b920ebSJulian Elischer.Nd "kernel processes"
40d91be65fSJulian Elischer.Sh SYNOPSIS
41d91be65fSJulian Elischer.In sys/kthread.h
42d91be65fSJulian Elischer.Ft void
43d91be65fSJulian Elischer.Fn kproc_start "const void *udata"
44d91be65fSJulian Elischer.Ft void
45d91be65fSJulian Elischer.Fn kproc_shutdown "void *arg" "int howto"
46d91be65fSJulian Elischer.Ft int
4739b920ebSJulian Elischer.Fo kproc_create
4839b920ebSJulian Elischer.Fa "void (*func)(void *)" "void *arg" "struct proc **newpp"
4939b920ebSJulian Elischer.Fa "int flags" "int pages"
5039b920ebSJulian Elischer.Fa "const char *fmt" ...
5139b920ebSJulian Elischer.Fc
52d91be65fSJulian Elischer.Ft void
53d91be65fSJulian Elischer.Fn kproc_exit "int ecode"
54d91be65fSJulian Elischer.Ft int
55d91be65fSJulian Elischer.Fn kproc_resume "struct proc *p"
56d91be65fSJulian Elischer.Ft int
57d91be65fSJulian Elischer.Fn kproc_suspend "struct proc *p" "int timo"
58d91be65fSJulian Elischer.Ft void
59d91be65fSJulian Elischer.Fn kproc_suspend_check "struct proc *p"
60c59b9a76SJulian Elischer.Ft int
61c59b9a76SJulian Elischer.Fo kproc_kthread_add
62c59b9a76SJulian Elischer.Fa "void (*func)(void *)" "void *arg"
63c59b9a76SJulian Elischer.Fa "struct proc **procptr" "struct thread **tdptr"
64c59b9a76SJulian Elischer.Fa "int flags" "int pages" "char * procname" "const char *fmt" "..."
65c59b9a76SJulian Elischer.Fc
66d91be65fSJulian Elischer.Sh DESCRIPTION
6758cf5c84SJulian ElischerIn
6858cf5c84SJulian Elischer.Fx 8.0 ,
6958cf5c84SJulian Elischerthe
7058cf5c84SJulian Elischer.Fn kthread* 9
7158cf5c84SJulian Elischerfamily of functions was renamed to be the
7258cf5c84SJulian Elischer.Fn kproc* 9
7358cf5c84SJulian Elischerfamily of functions, as they were misnamed
7458cf5c84SJulian Elischerand actually produced kernel processes.
7558cf5c84SJulian ElischerA new family of
7658cf5c84SJulian Elischer.Em different
7758cf5c84SJulian Elischer.Fn kthread_* 9
7858cf5c84SJulian Elischerfunctions was added to produce
7958cf5c84SJulian Elischer.Em real
8058cf5c84SJulian Elischerkernel
8158cf5c84SJulian Elischer.Em threads .
8258cf5c84SJulian ElischerSee the
8358cf5c84SJulian Elischer.Xr kthread 9
8458cf5c84SJulian Elischerman page for more information on those calls.
8558cf5c84SJulian ElischerAlso note that the
8658cf5c84SJulian Elischer.Fn kproc_kthread_add 9
8758cf5c84SJulian Elischerfunction appears in both pages as its functionality is split.
8858cf5c84SJulian Elischer.Pp
89d91be65fSJulian ElischerThe function
90d91be65fSJulian Elischer.Fn kproc_start
91d91be65fSJulian Elischeris used to start
92d91be65fSJulian Elischer.Dq internal
9339b920ebSJulian Elischerdaemons such as
9439b920ebSJulian Elischer.Nm bufdaemon , pagedaemon , vmdaemon ,
9539b920ebSJulian Elischerand the
9639b920ebSJulian Elischer.Nm syncer
9739b920ebSJulian Elischerand is intended
98d91be65fSJulian Elischerto be called from
99d91be65fSJulian Elischer.Xr SYSINIT 9 .
100d91be65fSJulian ElischerThe
101d91be65fSJulian Elischer.Fa udata
102d91be65fSJulian Elischerargument is actually a pointer to a
10339b920ebSJulian Elischer.Vt "struct kproc_desc"
104d91be65fSJulian Elischerwhich describes the kernel process that should be created:
105d91be65fSJulian Elischer.Bd -literal -offset indent
106d91be65fSJulian Elischerstruct kproc_desc {
107d91be65fSJulian Elischer	char		*arg0;
108d91be65fSJulian Elischer	void		(*func)(void);
109d91be65fSJulian Elischer	struct proc	**global_procpp;
110d91be65fSJulian Elischer};
111d91be65fSJulian Elischer.Ed
112d91be65fSJulian Elischer.Pp
113d91be65fSJulian ElischerThe structure members are used by
114d91be65fSJulian Elischer.Fn kproc_start
115d91be65fSJulian Elischeras follows:
11639b920ebSJulian Elischer.Bl -tag -width ".Va global_procpp" -offset indent
117d91be65fSJulian Elischer.It Va arg0
118d91be65fSJulian ElischerString to be used for the name of the process.
119d91be65fSJulian ElischerThis string will be copied into the
120d91be65fSJulian Elischer.Va p_comm
121d91be65fSJulian Elischermember of the new process'
12239b920ebSJulian Elischer.Vt "struct proc" .
123d91be65fSJulian Elischer.It Va func
124d91be65fSJulian ElischerThe main function for this kernel process to run.
125d91be65fSJulian Elischer.It Va global_procpp
126d91be65fSJulian ElischerA pointer to a
12739b920ebSJulian Elischer.Vt "struct proc"
128d91be65fSJulian Elischerpointer that should be updated to point to the newly created process' process
129d91be65fSJulian Elischerstructure.
130d91be65fSJulian ElischerIf this variable is
131d91be65fSJulian Elischer.Dv NULL ,
132d91be65fSJulian Elischerthen it is ignored.
133d91be65fSJulian Elischer.El
134d91be65fSJulian Elischer.Pp
135d91be65fSJulian ElischerThe
136d91be65fSJulian Elischer.Fn kproc_create
137d91be65fSJulian Elischerfunction is used to create a kernel process.
13839b920ebSJulian ElischerThe new process shares its address space with process 0, the
13939b920ebSJulian Elischer.Nm swapper
14039b920ebSJulian Elischerprocess,
141d91be65fSJulian Elischerand runs in kernel mode only.
142d91be65fSJulian ElischerThe
143d91be65fSJulian Elischer.Fa func
144d91be65fSJulian Elischerargument specifies the function that the process should execute.
145d91be65fSJulian ElischerThe
146d91be65fSJulian Elischer.Fa arg
147d91be65fSJulian Elischerargument is an arbitrary pointer that is passed in as the only argument to
148d91be65fSJulian Elischer.Fa func
149d91be65fSJulian Elischerwhen it is called by the new process.
150d91be65fSJulian ElischerThe
151d91be65fSJulian Elischer.Fa newpp
152d91be65fSJulian Elischerpointer points to a
15339b920ebSJulian Elischer.Vt "struct proc"
154d91be65fSJulian Elischerpointer that is to be updated to point to the newly created process.
155d91be65fSJulian ElischerIf this argument is
156d91be65fSJulian Elischer.Dv NULL ,
157d91be65fSJulian Elischerthen it is ignored.
158d91be65fSJulian ElischerThe
159d91be65fSJulian Elischer.Fa flags
160d91be65fSJulian Elischerargument specifies a set of flags as described in
161d91be65fSJulian Elischer.Xr rfork 2 .
162d91be65fSJulian ElischerThe
163d91be65fSJulian Elischer.Fa pages
164d91be65fSJulian Elischerargument specifies the size of the new kernel process's stack in pages.
165d91be65fSJulian ElischerIf 0 is used, the default kernel stack size is allocated.
166d91be65fSJulian ElischerThe rest of the arguments form a
167d91be65fSJulian Elischer.Xr printf 9
168d91be65fSJulian Elischerargument list that is used to build the name of the new process and is stored
169d91be65fSJulian Elischerin the
170d91be65fSJulian Elischer.Va p_comm
171d91be65fSJulian Elischermember of the new process's
17239b920ebSJulian Elischer.Vt "struct proc" .
173d91be65fSJulian Elischer.Pp
174d91be65fSJulian ElischerThe
175d91be65fSJulian Elischer.Fn kproc_exit
176d91be65fSJulian Elischerfunction is used to terminate kernel processes.
177d91be65fSJulian ElischerIt should be called by the main function of the kernel process rather than
178d91be65fSJulian Elischerletting the main function return to its caller.
179d91be65fSJulian ElischerThe
180d91be65fSJulian Elischer.Fa ecode
181d91be65fSJulian Elischerargument specifies the exit status of the process.
182d91be65fSJulian ElischerWhile exiting, the function
183d91be65fSJulian Elischer.Xr exit1 9
184d91be65fSJulian Elischerwill initiate a call to
185d91be65fSJulian Elischer.Xr wakeup 9
186d91be65fSJulian Elischeron the process handle.
187d91be65fSJulian Elischer.Pp
188d91be65fSJulian ElischerThe
189d91be65fSJulian Elischer.Fn kproc_resume ,
190d91be65fSJulian Elischer.Fn kproc_suspend ,
191d91be65fSJulian Elischerand
192d91be65fSJulian Elischer.Fn kproc_suspend_check
193d91be65fSJulian Elischerfunctions are used to suspend and resume a kernel process.
194d91be65fSJulian ElischerDuring the main loop of its execution, a kernel process that wishes to allow
195d91be65fSJulian Elischeritself to be suspended should call
196d91be65fSJulian Elischer.Fn kproc_suspend_check
197d91be65fSJulian Elischerpassing in
198d91be65fSJulian Elischer.Va curproc
199d91be65fSJulian Elischeras the only argument.
200d91be65fSJulian ElischerThis function checks to see if the kernel process has been asked to suspend.
201d91be65fSJulian ElischerIf it has, it will
202d91be65fSJulian Elischer.Xr tsleep 9
203d91be65fSJulian Elischeruntil it is told to resume.
204d91be65fSJulian ElischerOnce it has been told to resume it will return allowing execution of the
205d91be65fSJulian Elischerkernel process to continue.
206d91be65fSJulian ElischerThe other two functions are used to notify a kernel process of a suspend or
207d91be65fSJulian Elischerresume request.
208d91be65fSJulian ElischerThe
209d91be65fSJulian Elischer.Fa p
210d91be65fSJulian Elischerargument points to the
21139b920ebSJulian Elischer.Vt "struct proc"
212d91be65fSJulian Elischerof the kernel process to suspend or resume.
213d91be65fSJulian ElischerFor
214d91be65fSJulian Elischer.Fn kproc_suspend ,
215d91be65fSJulian Elischerthe
216d91be65fSJulian Elischer.Fa timo
217d91be65fSJulian Elischerargument specifies a timeout to wait for the kernel process to acknowledge the
218d91be65fSJulian Elischersuspend request and suspend itself.
219d91be65fSJulian Elischer.Pp
220d91be65fSJulian ElischerThe
221d91be65fSJulian Elischer.Fn kproc_shutdown
222d91be65fSJulian Elischerfunction is meant to be registered as a shutdown event for kernel processes that
223d91be65fSJulian Elischerneed to be suspended voluntarily during system shutdown so as not to interfere
224d91be65fSJulian Elischerwith system shutdown activities.
225d91be65fSJulian ElischerThe actual suspension of the kernel process is done with
226d91be65fSJulian Elischer.Fn kproc_suspend .
227c59b9a76SJulian Elischer.Pp
228c59b9a76SJulian ElischerThe
229c59b9a76SJulian Elischer.Fn kproc_kthread_add
230c59b9a76SJulian Elischerfunction is much like the
231c59b9a76SJulian Elischer.Fn kproc_create
232c59b9a76SJulian Elischerfunction above except that if the kproc already exists,
233c59b9a76SJulian Elischerthen only a new thread (see
234c59b9a76SJulian Elischer.Xr kthread 9 )
235c59b9a76SJulian Elischeris created on the existing process.
236c59b9a76SJulian ElischerThe
237c59b9a76SJulian Elischer.Fa func
238c59b9a76SJulian Elischerargument specifies the function that the process should execute.
239c59b9a76SJulian ElischerThe
240c59b9a76SJulian Elischer.Fa arg
241c59b9a76SJulian Elischerargument is an arbitrary pointer that is passed in as the only argument to
242c59b9a76SJulian Elischer.Fa func
243c59b9a76SJulian Elischerwhen it is called by the new process.
244c59b9a76SJulian ElischerThe
245c59b9a76SJulian Elischer.Fa procptr
246c59b9a76SJulian Elischerpointer points to a
247c59b9a76SJulian Elischer.Vt "struct proc "
248c59b9a76SJulian Elischerpointer that is the location to be updated with the new proc pointer
249c59b9a76SJulian Elischerif a new process is created, or if not
250c59b9a76SJulian Elischer.Dv NULL ,
251c59b9a76SJulian Elischermust contain the process pointer for the already exisiting process.
252c59b9a76SJulian ElischerIf this argument points to
253c59b9a76SJulian Elischer.Dv NULL ,
254c59b9a76SJulian Elischerthen a new process is created and the field updated.
255c59b9a76SJulian ElischerIf not NULL, the
256c59b9a76SJulian Elischer.Fa tdptr
257c59b9a76SJulian Elischerpointer points to a
258c59b9a76SJulian Elischer.Vt "struct thread "
259c59b9a76SJulian Elischerpointer that is the location to be updated with the new thread pointer.
260c59b9a76SJulian ElischerThe
261c59b9a76SJulian Elischer.Fa flags
262c59b9a76SJulian Elischerargument specifies a set of flags as described in
263c59b9a76SJulian Elischer.Xr rfork 2 .
264c59b9a76SJulian ElischerThe
265c59b9a76SJulian Elischer.Fa pages
266c59b9a76SJulian Elischerargument specifies the size of the new kernel thread's stack in pages.
267c59b9a76SJulian ElischerIf 0 is used, the default kernel stack size is allocated.
268c59b9a76SJulian ElischerThe procname argument is the name the new process should be given if it needs to be created.
269c59b9a76SJulian ElischerIt is
270c59b9a76SJulian Elischer.Em NOT
271c59b9a76SJulian Elischera printf style format specifier but a simple string.
272c59b9a76SJulian ElischerThe rest of the arguments form a
273c59b9a76SJulian Elischer.Xr printf 9
274c59b9a76SJulian Elischerargument list that is used to build the name of the new thread and is stored
275c59b9a76SJulian Elischerin the
276c59b9a76SJulian Elischer.Va td_name
277c59b9a76SJulian Elischermember of the new thread's
278c59b9a76SJulian Elischer.Vt "struct thread" .
279d91be65fSJulian Elischer.Sh RETURN VALUES
280d91be65fSJulian ElischerThe
281d91be65fSJulian Elischer.Fn kproc_create ,
282d91be65fSJulian Elischer.Fn kproc_resume ,
283d91be65fSJulian Elischerand
284d91be65fSJulian Elischer.Fn kproc_suspend
285d91be65fSJulian Elischerfunctions return zero on success and non-zero on failure.
286d91be65fSJulian Elischer.Sh EXAMPLES
287d91be65fSJulian ElischerThis example demonstrates the use of a
28839b920ebSJulian Elischer.Vt "struct kproc_desc"
289d91be65fSJulian Elischerand the functions
290d91be65fSJulian Elischer.Fn kproc_start ,
291d91be65fSJulian Elischer.Fn kproc_shutdown ,
292d91be65fSJulian Elischerand
293d91be65fSJulian Elischer.Fn kproc_suspend_check
294d91be65fSJulian Elischerto run the
29539b920ebSJulian Elischer.Nm bufdaemon
296d91be65fSJulian Elischerprocess.
297d91be65fSJulian Elischer.Bd -literal -offset indent
298d91be65fSJulian Elischerstatic struct proc *bufdaemonproc;
299d91be65fSJulian Elischer
300d91be65fSJulian Elischerstatic struct kproc_desc buf_kp = {
301d91be65fSJulian Elischer	"bufdaemon",
302d91be65fSJulian Elischer	buf_daemon,
303d91be65fSJulian Elischer	&bufdaemonproc
304d91be65fSJulian Elischer};
305d91be65fSJulian ElischerSYSINIT(bufdaemon, SI_SUB_KTHREAD_BUF, SI_ORDER_FIRST, kproc_start,
306d91be65fSJulian Elischer    &buf_kp)
307d91be65fSJulian Elischer
308d91be65fSJulian Elischerstatic void
309d91be65fSJulian Elischerbuf_daemon()
310d91be65fSJulian Elischer{
311d91be65fSJulian Elischer	...
312d91be65fSJulian Elischer	/*
313d91be65fSJulian Elischer	 * This process needs to be suspended prior to shutdown sync.
314d91be65fSJulian Elischer	 */
315d91be65fSJulian Elischer	EVENTHANDLER_REGISTER(shutdown_pre_sync, kproc_shutdown,
316d91be65fSJulian Elischer	    bufdaemonproc, SHUTDOWN_PRI_LAST);
317d91be65fSJulian Elischer	...
318d91be65fSJulian Elischer	for (;;) {
319d91be65fSJulian Elischer		kproc_suspend_check(bufdaemonproc);
320d91be65fSJulian Elischer		...
321d91be65fSJulian Elischer	}
322d91be65fSJulian Elischer}
323d91be65fSJulian Elischer.Ed
324d91be65fSJulian Elischer.Sh ERRORS
325d91be65fSJulian ElischerThe
326d91be65fSJulian Elischer.Fn kproc_resume
327d91be65fSJulian Elischerand
328d91be65fSJulian Elischer.Fn kproc_suspend
329d91be65fSJulian Elischerfunctions will fail if:
330d91be65fSJulian Elischer.Bl -tag -width Er
331d91be65fSJulian Elischer.It Bq Er EINVAL
332d91be65fSJulian ElischerThe
333d91be65fSJulian Elischer.Fa p
334d91be65fSJulian Elischerargument does not reference a kernel process.
335d91be65fSJulian Elischer.El
336d91be65fSJulian Elischer.Pp
337d91be65fSJulian ElischerThe
338d91be65fSJulian Elischer.Fn kproc_create
339d91be65fSJulian Elischerfunction will fail if:
340d91be65fSJulian Elischer.Bl -tag -width Er
341d91be65fSJulian Elischer.It Bq Er EAGAIN
342d91be65fSJulian ElischerThe system-imposed limit on the total
343d91be65fSJulian Elischernumber of processes under execution would be exceeded.
344d91be65fSJulian ElischerThe limit is given by the
345d91be65fSJulian Elischer.Xr sysctl 3
346d91be65fSJulian ElischerMIB variable
347d91be65fSJulian Elischer.Dv KERN_MAXPROC .
348d91be65fSJulian Elischer.It Bq Er EINVAL
349d91be65fSJulian ElischerThe
350d91be65fSJulian Elischer.Dv RFCFDG
351d91be65fSJulian Elischerflag was specified in the
352d91be65fSJulian Elischer.Fa flags
353d91be65fSJulian Elischerparameter.
354d91be65fSJulian Elischer.El
355d91be65fSJulian Elischer.Sh SEE ALSO
356d91be65fSJulian Elischer.Xr rfork 2 ,
357d91be65fSJulian Elischer.Xr exit1 9 ,
358d91be65fSJulian Elischer.Xr kthread 9 ,
359d91be65fSJulian Elischer.Xr SYSINIT 9 ,
360d91be65fSJulian Elischer.Xr wakeup 9
361d91be65fSJulian Elischer.Sh HISTORY
362d91be65fSJulian ElischerThe
363d91be65fSJulian Elischer.Fn kproc_start
364d91be65fSJulian Elischerfunction first appeared in
365d91be65fSJulian Elischer.Fx 2.2 .
366d91be65fSJulian ElischerThe
367d91be65fSJulian Elischer.Fn kproc_shutdown ,
368d91be65fSJulian Elischer.Fn kproc_create ,
369d91be65fSJulian Elischer.Fn kproc_exit ,
370d91be65fSJulian Elischer.Fn kproc_resume ,
371d91be65fSJulian Elischer.Fn kproc_suspend ,
372d91be65fSJulian Elischerand
373d91be65fSJulian Elischer.Fn kproc_suspend_check
374d91be65fSJulian Elischerfunctions were introduced in
375d91be65fSJulian Elischer.Fx 4.0 .
376d91be65fSJulian ElischerPrior to
377d91be65fSJulian Elischer.Fx 5.0 ,
378d91be65fSJulian Elischerthe
379d91be65fSJulian Elischer.Fn kproc_shutdown ,
380d91be65fSJulian Elischer.Fn kproc_resume ,
381d91be65fSJulian Elischer.Fn kproc_suspend ,
382d91be65fSJulian Elischerand
383d91be65fSJulian Elischer.Fn kproc_suspend_check
384d91be65fSJulian Elischerfunctions were named
385d91be65fSJulian Elischer.Fn shutdown_kproc ,
386d91be65fSJulian Elischer.Fn resume_kproc ,
387d91be65fSJulian Elischer.Fn shutdown_kproc ,
388d91be65fSJulian Elischerand
389d91be65fSJulian Elischer.Fn kproc_suspend_loop ,
39039b920ebSJulian Elischerrespectively.
39139b920ebSJulian ElischerOriginally they had the names
39239b920ebSJulian Elischer.Fn kthread_*
39339b920ebSJulian Elischerbut were changed to
39439b920ebSJulian Elischer.Fn kproc_*
39539b920ebSJulian Elischerwhen real kthreads became available.
396