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