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