xref: /freebsd/share/man/man9/kproc.9 (revision c59b9a7659c40e21fdf2578bb53d9ac02129899f)
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
67d91be65fSJulian ElischerThe function
68d91be65fSJulian Elischer.Fn kproc_start
69d91be65fSJulian Elischeris used to start
70d91be65fSJulian Elischer.Dq internal
7139b920ebSJulian Elischerdaemons such as
7239b920ebSJulian Elischer.Nm bufdaemon , pagedaemon , vmdaemon ,
7339b920ebSJulian Elischerand the
7439b920ebSJulian Elischer.Nm syncer
7539b920ebSJulian Elischerand is intended
76d91be65fSJulian Elischerto be called from
77d91be65fSJulian Elischer.Xr SYSINIT 9 .
78d91be65fSJulian ElischerThe
79d91be65fSJulian Elischer.Fa udata
80d91be65fSJulian Elischerargument is actually a pointer to a
8139b920ebSJulian Elischer.Vt "struct kproc_desc"
82d91be65fSJulian Elischerwhich describes the kernel process that should be created:
83d91be65fSJulian Elischer.Bd -literal -offset indent
84d91be65fSJulian Elischerstruct kproc_desc {
85d91be65fSJulian Elischer	char		*arg0;
86d91be65fSJulian Elischer	void		(*func)(void);
87d91be65fSJulian Elischer	struct proc	**global_procpp;
88d91be65fSJulian Elischer};
89d91be65fSJulian Elischer.Ed
90d91be65fSJulian Elischer.Pp
91d91be65fSJulian ElischerThe structure members are used by
92d91be65fSJulian Elischer.Fn kproc_start
93d91be65fSJulian Elischeras follows:
9439b920ebSJulian Elischer.Bl -tag -width ".Va global_procpp" -offset indent
95d91be65fSJulian Elischer.It Va arg0
96d91be65fSJulian ElischerString to be used for the name of the process.
97d91be65fSJulian ElischerThis string will be copied into the
98d91be65fSJulian Elischer.Va p_comm
99d91be65fSJulian Elischermember of the new process'
10039b920ebSJulian Elischer.Vt "struct proc" .
101d91be65fSJulian Elischer.It Va func
102d91be65fSJulian ElischerThe main function for this kernel process to run.
103d91be65fSJulian Elischer.It Va global_procpp
104d91be65fSJulian ElischerA pointer to a
10539b920ebSJulian Elischer.Vt "struct proc"
106d91be65fSJulian Elischerpointer that should be updated to point to the newly created process' process
107d91be65fSJulian Elischerstructure.
108d91be65fSJulian ElischerIf this variable is
109d91be65fSJulian Elischer.Dv NULL ,
110d91be65fSJulian Elischerthen it is ignored.
111d91be65fSJulian Elischer.El
112d91be65fSJulian Elischer.Pp
113d91be65fSJulian ElischerThe
114d91be65fSJulian Elischer.Fn kproc_create
115d91be65fSJulian Elischerfunction is used to create a kernel process.
11639b920ebSJulian ElischerThe new process shares its address space with process 0, the
11739b920ebSJulian Elischer.Nm swapper
11839b920ebSJulian Elischerprocess,
119d91be65fSJulian Elischerand runs in kernel mode only.
120d91be65fSJulian ElischerThe
121d91be65fSJulian Elischer.Fa func
122d91be65fSJulian Elischerargument specifies the function that the process should execute.
123d91be65fSJulian ElischerThe
124d91be65fSJulian Elischer.Fa arg
125d91be65fSJulian Elischerargument is an arbitrary pointer that is passed in as the only argument to
126d91be65fSJulian Elischer.Fa func
127d91be65fSJulian Elischerwhen it is called by the new process.
128d91be65fSJulian ElischerThe
129d91be65fSJulian Elischer.Fa newpp
130d91be65fSJulian Elischerpointer points to a
13139b920ebSJulian Elischer.Vt "struct proc"
132d91be65fSJulian Elischerpointer that is to be updated to point to the newly created process.
133d91be65fSJulian ElischerIf this argument is
134d91be65fSJulian Elischer.Dv NULL ,
135d91be65fSJulian Elischerthen it is ignored.
136d91be65fSJulian ElischerThe
137d91be65fSJulian Elischer.Fa flags
138d91be65fSJulian Elischerargument specifies a set of flags as described in
139d91be65fSJulian Elischer.Xr rfork 2 .
140d91be65fSJulian ElischerThe
141d91be65fSJulian Elischer.Fa pages
142d91be65fSJulian Elischerargument specifies the size of the new kernel process's stack in pages.
143d91be65fSJulian ElischerIf 0 is used, the default kernel stack size is allocated.
144d91be65fSJulian ElischerThe rest of the arguments form a
145d91be65fSJulian Elischer.Xr printf 9
146d91be65fSJulian Elischerargument list that is used to build the name of the new process and is stored
147d91be65fSJulian Elischerin the
148d91be65fSJulian Elischer.Va p_comm
149d91be65fSJulian Elischermember of the new process's
15039b920ebSJulian Elischer.Vt "struct proc" .
151d91be65fSJulian Elischer.Pp
152d91be65fSJulian ElischerThe
153d91be65fSJulian Elischer.Fn kproc_exit
154d91be65fSJulian Elischerfunction is used to terminate kernel processes.
155d91be65fSJulian ElischerIt should be called by the main function of the kernel process rather than
156d91be65fSJulian Elischerletting the main function return to its caller.
157d91be65fSJulian ElischerThe
158d91be65fSJulian Elischer.Fa ecode
159d91be65fSJulian Elischerargument specifies the exit status of the process.
160d91be65fSJulian ElischerWhile exiting, the function
161d91be65fSJulian Elischer.Xr exit1 9
162d91be65fSJulian Elischerwill initiate a call to
163d91be65fSJulian Elischer.Xr wakeup 9
164d91be65fSJulian Elischeron the process handle.
165d91be65fSJulian Elischer.Pp
166d91be65fSJulian ElischerThe
167d91be65fSJulian Elischer.Fn kproc_resume ,
168d91be65fSJulian Elischer.Fn kproc_suspend ,
169d91be65fSJulian Elischerand
170d91be65fSJulian Elischer.Fn kproc_suspend_check
171d91be65fSJulian Elischerfunctions are used to suspend and resume a kernel process.
172d91be65fSJulian ElischerDuring the main loop of its execution, a kernel process that wishes to allow
173d91be65fSJulian Elischeritself to be suspended should call
174d91be65fSJulian Elischer.Fn kproc_suspend_check
175d91be65fSJulian Elischerpassing in
176d91be65fSJulian Elischer.Va curproc
177d91be65fSJulian Elischeras the only argument.
178d91be65fSJulian ElischerThis function checks to see if the kernel process has been asked to suspend.
179d91be65fSJulian ElischerIf it has, it will
180d91be65fSJulian Elischer.Xr tsleep 9
181d91be65fSJulian Elischeruntil it is told to resume.
182d91be65fSJulian ElischerOnce it has been told to resume it will return allowing execution of the
183d91be65fSJulian Elischerkernel process to continue.
184d91be65fSJulian ElischerThe other two functions are used to notify a kernel process of a suspend or
185d91be65fSJulian Elischerresume request.
186d91be65fSJulian ElischerThe
187d91be65fSJulian Elischer.Fa p
188d91be65fSJulian Elischerargument points to the
18939b920ebSJulian Elischer.Vt "struct proc"
190d91be65fSJulian Elischerof the kernel process to suspend or resume.
191d91be65fSJulian ElischerFor
192d91be65fSJulian Elischer.Fn kproc_suspend ,
193d91be65fSJulian Elischerthe
194d91be65fSJulian Elischer.Fa timo
195d91be65fSJulian Elischerargument specifies a timeout to wait for the kernel process to acknowledge the
196d91be65fSJulian Elischersuspend request and suspend itself.
197d91be65fSJulian Elischer.Pp
198d91be65fSJulian ElischerThe
199d91be65fSJulian Elischer.Fn kproc_shutdown
200d91be65fSJulian Elischerfunction is meant to be registered as a shutdown event for kernel processes that
201d91be65fSJulian Elischerneed to be suspended voluntarily during system shutdown so as not to interfere
202d91be65fSJulian Elischerwith system shutdown activities.
203d91be65fSJulian ElischerThe actual suspension of the kernel process is done with
204d91be65fSJulian Elischer.Fn kproc_suspend .
205c59b9a76SJulian Elischer.Pp
206c59b9a76SJulian ElischerThe
207c59b9a76SJulian Elischer.Fn kproc_kthread_add
208c59b9a76SJulian Elischerfunction is much like the
209c59b9a76SJulian Elischer.Fn kproc_create
210c59b9a76SJulian Elischerfunction above except that if the kproc already exists,
211c59b9a76SJulian Elischerthen only a new thread (see
212c59b9a76SJulian Elischer.Xr kthread 9 )
213c59b9a76SJulian Elischeris created on the existing process.
214c59b9a76SJulian ElischerThe
215c59b9a76SJulian Elischer.Fa func
216c59b9a76SJulian Elischerargument specifies the function that the process should execute.
217c59b9a76SJulian ElischerThe
218c59b9a76SJulian Elischer.Fa arg
219c59b9a76SJulian Elischerargument is an arbitrary pointer that is passed in as the only argument to
220c59b9a76SJulian Elischer.Fa func
221c59b9a76SJulian Elischerwhen it is called by the new process.
222c59b9a76SJulian ElischerThe
223c59b9a76SJulian Elischer.Fa procptr
224c59b9a76SJulian Elischerpointer points to a
225c59b9a76SJulian Elischer.Vt "struct proc "
226c59b9a76SJulian Elischerpointer that is the location to be updated with the new proc pointer
227c59b9a76SJulian Elischerif a new process is created, or if not
228c59b9a76SJulian Elischer.Dv NULL ,
229c59b9a76SJulian Elischermust contain the process pointer for the already exisiting process.
230c59b9a76SJulian ElischerIf this argument points to
231c59b9a76SJulian Elischer.Dv NULL ,
232c59b9a76SJulian Elischerthen a new process is created and the field updated.
233c59b9a76SJulian ElischerIf not NULL, the
234c59b9a76SJulian Elischer.Fa tdptr
235c59b9a76SJulian Elischerpointer points to a
236c59b9a76SJulian Elischer.Vt "struct thread "
237c59b9a76SJulian Elischerpointer that is the location to be updated with the new thread pointer.
238c59b9a76SJulian ElischerThe
239c59b9a76SJulian Elischer.Fa flags
240c59b9a76SJulian Elischerargument specifies a set of flags as described in
241c59b9a76SJulian Elischer.Xr rfork 2 .
242c59b9a76SJulian ElischerThe
243c59b9a76SJulian Elischer.Fa pages
244c59b9a76SJulian Elischerargument specifies the size of the new kernel thread's stack in pages.
245c59b9a76SJulian ElischerIf 0 is used, the default kernel stack size is allocated.
246c59b9a76SJulian ElischerThe procname argument is the name the new process should be given if it needs to be created.
247c59b9a76SJulian ElischerIt is
248c59b9a76SJulian Elischer.Em NOT
249c59b9a76SJulian Elischera printf style format specifier but a simple string.
250c59b9a76SJulian ElischerThe rest of the arguments form a
251c59b9a76SJulian Elischer.Xr printf 9
252c59b9a76SJulian Elischerargument list that is used to build the name of the new thread and is stored
253c59b9a76SJulian Elischerin the
254c59b9a76SJulian Elischer.Va td_name
255c59b9a76SJulian Elischermember of the new thread's
256c59b9a76SJulian Elischer.Vt "struct thread" .
257d91be65fSJulian Elischer.Sh RETURN VALUES
258d91be65fSJulian ElischerThe
259d91be65fSJulian Elischer.Fn kproc_create ,
260d91be65fSJulian Elischer.Fn kproc_resume ,
261d91be65fSJulian Elischerand
262d91be65fSJulian Elischer.Fn kproc_suspend
263d91be65fSJulian Elischerfunctions return zero on success and non-zero on failure.
264d91be65fSJulian Elischer.Sh EXAMPLES
265d91be65fSJulian ElischerThis example demonstrates the use of a
26639b920ebSJulian Elischer.Vt "struct kproc_desc"
267d91be65fSJulian Elischerand the functions
268d91be65fSJulian Elischer.Fn kproc_start ,
269d91be65fSJulian Elischer.Fn kproc_shutdown ,
270d91be65fSJulian Elischerand
271d91be65fSJulian Elischer.Fn kproc_suspend_check
272d91be65fSJulian Elischerto run the
27339b920ebSJulian Elischer.Nm bufdaemon
274d91be65fSJulian Elischerprocess.
275d91be65fSJulian Elischer.Bd -literal -offset indent
276d91be65fSJulian Elischerstatic struct proc *bufdaemonproc;
277d91be65fSJulian Elischer
278d91be65fSJulian Elischerstatic struct kproc_desc buf_kp = {
279d91be65fSJulian Elischer	"bufdaemon",
280d91be65fSJulian Elischer	buf_daemon,
281d91be65fSJulian Elischer	&bufdaemonproc
282d91be65fSJulian Elischer};
283d91be65fSJulian ElischerSYSINIT(bufdaemon, SI_SUB_KTHREAD_BUF, SI_ORDER_FIRST, kproc_start,
284d91be65fSJulian Elischer    &buf_kp)
285d91be65fSJulian Elischer
286d91be65fSJulian Elischerstatic void
287d91be65fSJulian Elischerbuf_daemon()
288d91be65fSJulian Elischer{
289d91be65fSJulian Elischer	...
290d91be65fSJulian Elischer	/*
291d91be65fSJulian Elischer	 * This process needs to be suspended prior to shutdown sync.
292d91be65fSJulian Elischer	 */
293d91be65fSJulian Elischer	EVENTHANDLER_REGISTER(shutdown_pre_sync, kproc_shutdown,
294d91be65fSJulian Elischer	    bufdaemonproc, SHUTDOWN_PRI_LAST);
295d91be65fSJulian Elischer	...
296d91be65fSJulian Elischer	for (;;) {
297d91be65fSJulian Elischer		kproc_suspend_check(bufdaemonproc);
298d91be65fSJulian Elischer		...
299d91be65fSJulian Elischer	}
300d91be65fSJulian Elischer}
301d91be65fSJulian Elischer.Ed
302d91be65fSJulian Elischer.Sh ERRORS
303d91be65fSJulian ElischerThe
304d91be65fSJulian Elischer.Fn kproc_resume
305d91be65fSJulian Elischerand
306d91be65fSJulian Elischer.Fn kproc_suspend
307d91be65fSJulian Elischerfunctions will fail if:
308d91be65fSJulian Elischer.Bl -tag -width Er
309d91be65fSJulian Elischer.It Bq Er EINVAL
310d91be65fSJulian ElischerThe
311d91be65fSJulian Elischer.Fa p
312d91be65fSJulian Elischerargument does not reference a kernel process.
313d91be65fSJulian Elischer.El
314d91be65fSJulian Elischer.Pp
315d91be65fSJulian ElischerThe
316d91be65fSJulian Elischer.Fn kproc_create
317d91be65fSJulian Elischerfunction will fail if:
318d91be65fSJulian Elischer.Bl -tag -width Er
319d91be65fSJulian Elischer.It Bq Er EAGAIN
320d91be65fSJulian ElischerThe system-imposed limit on the total
321d91be65fSJulian Elischernumber of processes under execution would be exceeded.
322d91be65fSJulian ElischerThe limit is given by the
323d91be65fSJulian Elischer.Xr sysctl 3
324d91be65fSJulian ElischerMIB variable
325d91be65fSJulian Elischer.Dv KERN_MAXPROC .
326d91be65fSJulian Elischer.It Bq Er EINVAL
327d91be65fSJulian ElischerThe
328d91be65fSJulian Elischer.Dv RFCFDG
329d91be65fSJulian Elischerflag was specified in the
330d91be65fSJulian Elischer.Fa flags
331d91be65fSJulian Elischerparameter.
332d91be65fSJulian Elischer.El
333d91be65fSJulian Elischer.Sh SEE ALSO
334d91be65fSJulian Elischer.Xr rfork 2 ,
335d91be65fSJulian Elischer.Xr exit1 9 ,
336d91be65fSJulian Elischer.Xr kthread 9 ,
337d91be65fSJulian Elischer.Xr SYSINIT 9 ,
338d91be65fSJulian Elischer.Xr wakeup 9
339d91be65fSJulian Elischer.Sh HISTORY
340d91be65fSJulian ElischerThe
341d91be65fSJulian Elischer.Fn kproc_start
342d91be65fSJulian Elischerfunction first appeared in
343d91be65fSJulian Elischer.Fx 2.2 .
344d91be65fSJulian ElischerThe
345d91be65fSJulian Elischer.Fn kproc_shutdown ,
346d91be65fSJulian Elischer.Fn kproc_create ,
347d91be65fSJulian Elischer.Fn kproc_exit ,
348d91be65fSJulian Elischer.Fn kproc_resume ,
349d91be65fSJulian Elischer.Fn kproc_suspend ,
350d91be65fSJulian Elischerand
351d91be65fSJulian Elischer.Fn kproc_suspend_check
352d91be65fSJulian Elischerfunctions were introduced in
353d91be65fSJulian Elischer.Fx 4.0 .
354d91be65fSJulian ElischerPrior to
355d91be65fSJulian Elischer.Fx 5.0 ,
356d91be65fSJulian Elischerthe
357d91be65fSJulian Elischer.Fn kproc_shutdown ,
358d91be65fSJulian Elischer.Fn kproc_resume ,
359d91be65fSJulian Elischer.Fn kproc_suspend ,
360d91be65fSJulian Elischerand
361d91be65fSJulian Elischer.Fn kproc_suspend_check
362d91be65fSJulian Elischerfunctions were named
363d91be65fSJulian Elischer.Fn shutdown_kproc ,
364d91be65fSJulian Elischer.Fn resume_kproc ,
365d91be65fSJulian Elischer.Fn shutdown_kproc ,
366d91be65fSJulian Elischerand
367d91be65fSJulian Elischer.Fn kproc_suspend_loop ,
36839b920ebSJulian Elischerrespectively.
36939b920ebSJulian ElischerOriginally they had the names
37039b920ebSJulian Elischer.Fn kthread_*
37139b920ebSJulian Elischerbut were changed to
37239b920ebSJulian Elischer.Fn kproc_*
37339b920ebSJulian Elischerwhen real kthreads became available.
374