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