diff --git a/en_US.ISO8859-1/books/arch-handbook/locking/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/locking/chapter.sgml index 54448a06ef..993d649ffc 100644 --- a/en_US.ISO8859-1/books/arch-handbook/locking/chapter.sgml +++ b/en_US.ISO8859-1/books/arch-handbook/locking/chapter.sgml @@ -1,312 +1,333 @@ Locking Notes This chapter is maintained by the FreeBSD SMP Next Generation Project freebsd-smp@FreeBSD.org. This document outlines the locking used in the FreeBSD kernel to permit effective multi-processing within the kernel. Locking can be achieved via several means. Data structures can be protected by mutexes or &man.lockmgr.9; locks. A few variables are protected simply by always using atomic operations to access them. Mutexes A mutex is simply a lock used to guarantee mutual exclusion. Specifically, a mutex may only be owned by one entity at a time. If another entity wishes to obtain a mutex that is already owned, it must wait until the mutex is released. In the FreeBSD kernel, mutexes are owned by processes. Mutexes may be recursively acquired, but they are intended to be held for a short period of time. Specifically, one may not sleep while holding a mutex. If you need to hold a lock across a sleep, use a &man.lockmgr.9; lock. Each mutex has several properties of interest: Variable Name The name of the struct mtx variable in the kernel source. Logical Name The name of the mutex assigned to it by mtx_init. This name is displayed in KTR trace messages and witness errors and warnings and is used to distinguish mutexes in the witness code. Type The type of the mutex in terms of the MTX_* flags. The meaning for each flag is related to its meaning as documented in &man.mutex.9;. MTX_DEF A sleep mutex MTX_SPIN A spin mutex MTX_COLD This mutex is initialized very early. Thus, it must be declared via MUTEX_DECLARE, and the MTX_COLD flag must be passed to mtx_init. MTX_TOPHALF This spin mutex does not disable interrupts. MTX_NORECURSE This mutex is not allowed to recurse. Protectees A list of data structures or data structure members that this entry protects. For data structure members, the name will be in the form of Dependent Functions Functions that can only be called if this mutex is held. Mutex List Variable Name Logical Name Type Protectees Dependent Functions sched_lock sched lock MTX_SPIN | MTX_COLD _gmonparam, cnt.v_swtch, cp_time, curpriority, P_PROFIL XXX, P_INMEM, P_SINTR, P_TIMEOUT, P_SWAPINREQ XXX, P_INMEN XXX), p_prof/, p_ru/, statclock), pscnt, slpque, itqueuebits, itqueues, rtqueuebits, rtqueues, queuebits, queues, idqueuebits, idqueues, - callwheel, - nextsoftcheck, switchtime, - softticks, - ticks setrunqueue, remrunqueue, mi_switch, chooseproc, schedclock, resetpriority, updatepri, maybe_resched, cpu_switch, cpu_throw vm86pcb_lock vm86pcb lock MTX_DEF | MTX_COLD vm86pcb vm86_bioscall Giant Giant MTX_DEF | MTX_COLD nearly everything lots + + + + callout_lock + callout lock + + MTX_SPIN + + + callfree, + callwheel, + nextsoftcheck, + softticks, + ticks + + + +
Lock Manager Locks Locks that are provided via the &man.lockmgr.9; interface are lock manager locks. These locks are reader-writer locks and may be held by a sleeping process. &man.lockmgr.9; Lock List Variable Name Protectees allproc_lock allproc zombproc pidhashtbl nextpid + proctree_lock + +
Atomically Protected Variables An atomically protected variable is a special variable that is not protected by an explicit lock. Instead, all data accesses to the variables use special atomic operations as described in &man.atomic.9;. Very few variables are treated this way, although other synchronization primitives such as mutexes are implemented with atomically protected variables. astpending
diff --git a/en_US.ISO8859-1/books/developers-handbook/locking/chapter.sgml b/en_US.ISO8859-1/books/developers-handbook/locking/chapter.sgml index 54448a06ef..993d649ffc 100644 --- a/en_US.ISO8859-1/books/developers-handbook/locking/chapter.sgml +++ b/en_US.ISO8859-1/books/developers-handbook/locking/chapter.sgml @@ -1,312 +1,333 @@ Locking Notes This chapter is maintained by the FreeBSD SMP Next Generation Project freebsd-smp@FreeBSD.org. This document outlines the locking used in the FreeBSD kernel to permit effective multi-processing within the kernel. Locking can be achieved via several means. Data structures can be protected by mutexes or &man.lockmgr.9; locks. A few variables are protected simply by always using atomic operations to access them. Mutexes A mutex is simply a lock used to guarantee mutual exclusion. Specifically, a mutex may only be owned by one entity at a time. If another entity wishes to obtain a mutex that is already owned, it must wait until the mutex is released. In the FreeBSD kernel, mutexes are owned by processes. Mutexes may be recursively acquired, but they are intended to be held for a short period of time. Specifically, one may not sleep while holding a mutex. If you need to hold a lock across a sleep, use a &man.lockmgr.9; lock. Each mutex has several properties of interest: Variable Name The name of the struct mtx variable in the kernel source. Logical Name The name of the mutex assigned to it by mtx_init. This name is displayed in KTR trace messages and witness errors and warnings and is used to distinguish mutexes in the witness code. Type The type of the mutex in terms of the MTX_* flags. The meaning for each flag is related to its meaning as documented in &man.mutex.9;. MTX_DEF A sleep mutex MTX_SPIN A spin mutex MTX_COLD This mutex is initialized very early. Thus, it must be declared via MUTEX_DECLARE, and the MTX_COLD flag must be passed to mtx_init. MTX_TOPHALF This spin mutex does not disable interrupts. MTX_NORECURSE This mutex is not allowed to recurse. Protectees A list of data structures or data structure members that this entry protects. For data structure members, the name will be in the form of Dependent Functions Functions that can only be called if this mutex is held. Mutex List Variable Name Logical Name Type Protectees Dependent Functions sched_lock sched lock MTX_SPIN | MTX_COLD _gmonparam, cnt.v_swtch, cp_time, curpriority, P_PROFIL XXX, P_INMEM, P_SINTR, P_TIMEOUT, P_SWAPINREQ XXX, P_INMEN XXX), p_prof/, p_ru/, statclock), pscnt, slpque, itqueuebits, itqueues, rtqueuebits, rtqueues, queuebits, queues, idqueuebits, idqueues, - callwheel, - nextsoftcheck, switchtime, - softticks, - ticks setrunqueue, remrunqueue, mi_switch, chooseproc, schedclock, resetpriority, updatepri, maybe_resched, cpu_switch, cpu_throw vm86pcb_lock vm86pcb lock MTX_DEF | MTX_COLD vm86pcb vm86_bioscall Giant Giant MTX_DEF | MTX_COLD nearly everything lots + + + + callout_lock + callout lock + + MTX_SPIN + + + callfree, + callwheel, + nextsoftcheck, + softticks, + ticks + + + +
Lock Manager Locks Locks that are provided via the &man.lockmgr.9; interface are lock manager locks. These locks are reader-writer locks and may be held by a sleeping process. &man.lockmgr.9; Lock List Variable Name Protectees allproc_lock allproc zombproc pidhashtbl nextpid + proctree_lock + +
Atomically Protected Variables An atomically protected variable is a special variable that is not protected by an explicit lock. Instead, all data accesses to the variables use special atomic operations as described in &man.atomic.9;. Very few variables are treated this way, although other synchronization primitives such as mutexes are implemented with atomically protected variables. astpending
diff --git a/en_US.ISO_8859-1/books/developers-handbook/locking/chapter.sgml b/en_US.ISO_8859-1/books/developers-handbook/locking/chapter.sgml index 54448a06ef..993d649ffc 100644 --- a/en_US.ISO_8859-1/books/developers-handbook/locking/chapter.sgml +++ b/en_US.ISO_8859-1/books/developers-handbook/locking/chapter.sgml @@ -1,312 +1,333 @@ Locking Notes This chapter is maintained by the FreeBSD SMP Next Generation Project freebsd-smp@FreeBSD.org. This document outlines the locking used in the FreeBSD kernel to permit effective multi-processing within the kernel. Locking can be achieved via several means. Data structures can be protected by mutexes or &man.lockmgr.9; locks. A few variables are protected simply by always using atomic operations to access them. Mutexes A mutex is simply a lock used to guarantee mutual exclusion. Specifically, a mutex may only be owned by one entity at a time. If another entity wishes to obtain a mutex that is already owned, it must wait until the mutex is released. In the FreeBSD kernel, mutexes are owned by processes. Mutexes may be recursively acquired, but they are intended to be held for a short period of time. Specifically, one may not sleep while holding a mutex. If you need to hold a lock across a sleep, use a &man.lockmgr.9; lock. Each mutex has several properties of interest: Variable Name The name of the struct mtx variable in the kernel source. Logical Name The name of the mutex assigned to it by mtx_init. This name is displayed in KTR trace messages and witness errors and warnings and is used to distinguish mutexes in the witness code. Type The type of the mutex in terms of the MTX_* flags. The meaning for each flag is related to its meaning as documented in &man.mutex.9;. MTX_DEF A sleep mutex MTX_SPIN A spin mutex MTX_COLD This mutex is initialized very early. Thus, it must be declared via MUTEX_DECLARE, and the MTX_COLD flag must be passed to mtx_init. MTX_TOPHALF This spin mutex does not disable interrupts. MTX_NORECURSE This mutex is not allowed to recurse. Protectees A list of data structures or data structure members that this entry protects. For data structure members, the name will be in the form of Dependent Functions Functions that can only be called if this mutex is held. Mutex List Variable Name Logical Name Type Protectees Dependent Functions sched_lock sched lock MTX_SPIN | MTX_COLD _gmonparam, cnt.v_swtch, cp_time, curpriority, P_PROFIL XXX, P_INMEM, P_SINTR, P_TIMEOUT, P_SWAPINREQ XXX, P_INMEN XXX), p_prof/, p_ru/, statclock), pscnt, slpque, itqueuebits, itqueues, rtqueuebits, rtqueues, queuebits, queues, idqueuebits, idqueues, - callwheel, - nextsoftcheck, switchtime, - softticks, - ticks setrunqueue, remrunqueue, mi_switch, chooseproc, schedclock, resetpriority, updatepri, maybe_resched, cpu_switch, cpu_throw vm86pcb_lock vm86pcb lock MTX_DEF | MTX_COLD vm86pcb vm86_bioscall Giant Giant MTX_DEF | MTX_COLD nearly everything lots + + + + callout_lock + callout lock + + MTX_SPIN + + + callfree, + callwheel, + nextsoftcheck, + softticks, + ticks + + + +
Lock Manager Locks Locks that are provided via the &man.lockmgr.9; interface are lock manager locks. These locks are reader-writer locks and may be held by a sleeping process. &man.lockmgr.9; Lock List Variable Name Protectees allproc_lock allproc zombproc pidhashtbl nextpid + proctree_lock + +
Atomically Protected Variables An atomically protected variable is a special variable that is not protected by an explicit lock. Instead, all data accesses to the variables use special atomic operations as described in &man.atomic.9;. Very few variables are treated this way, although other synchronization primitives such as mutexes are implemented with atomically protected variables. astpending