10929bf8eSJulian Elischer.\" Copyright (c) 2007 Julian Elischer (julian - freebsd org ) 20929bf8eSJulian Elischer.\" All rights reserved. 30929bf8eSJulian Elischer.\" 40929bf8eSJulian Elischer.\" Redistribution and use in source and binary forms, with or without 50929bf8eSJulian Elischer.\" modification, are permitted provided that the following conditions 60929bf8eSJulian Elischer.\" are met: 70929bf8eSJulian Elischer.\" 1. Redistributions of source code must retain the above copyright 80929bf8eSJulian Elischer.\" notice, this list of conditions and the following disclaimer. 90929bf8eSJulian Elischer.\" 2. Redistributions in binary form must reproduce the above copyright 100929bf8eSJulian Elischer.\" notice, this list of conditions and the following disclaimer in the 110929bf8eSJulian Elischer.\" documentation and/or other materials provided with the distribution. 120929bf8eSJulian Elischer.\" 130929bf8eSJulian Elischer.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 140929bf8eSJulian Elischer.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 150929bf8eSJulian Elischer.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 160929bf8eSJulian Elischer.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 170929bf8eSJulian Elischer.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 180929bf8eSJulian Elischer.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 190929bf8eSJulian Elischer.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 200929bf8eSJulian Elischer.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 210929bf8eSJulian Elischer.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 220929bf8eSJulian Elischer.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 230929bf8eSJulian Elischer.\" SUCH DAMAGE. 240929bf8eSJulian Elischer.\" 250929bf8eSJulian Elischer.\" $FreeBSD$ 260929bf8eSJulian Elischer.\" 2710038699SBenjamin Kaduk.Dd June 30, 2013 280929bf8eSJulian Elischer.Dt LOCKING 9 290929bf8eSJulian Elischer.Os 300929bf8eSJulian Elischer.Sh NAME 3146d98f57SXin LI.Nm locking 320929bf8eSJulian Elischer.Nd kernel synchronization primitives 330929bf8eSJulian Elischer.Sh DESCRIPTION 340929bf8eSJulian ElischerThe 350929bf8eSJulian Elischer.Em FreeBSD 36ca6829abSJohn Baldwinkernel is written to run across multiple CPUs and as such provides 37ca6829abSJohn Baldwinseveral different synchronization primitives to allow developers 38ca6829abSJohn Baldwinto safely access and manipulate many data types. 3920f16ca0SJulian Elischer.Ss Mutexes 40ca6829abSJohn BaldwinMutexes (also called "blocking mutexes") are the most commonly used 41ddcd2bc9SEdward Tomasz Napieralasynchronization primitive in the kernel. 422139f5e0SJulian ElischerA thread acquires (locks) a mutex before accessing data shared with other 43815e4772SEdward Tomasz Napieralathreads (including interrupt threads), and releases (unlocks) it afterwards. 442139f5e0SJulian ElischerIf the mutex cannot be acquired, the thread requesting it will wait. 45ca6829abSJohn BaldwinMutexes are adaptive by default, meaning that 462139f5e0SJulian Elischerif the owner of a contended mutex is currently running on another CPU, 47ca6829abSJohn Baldwinthen a thread attempting to acquire the mutex will spin rather than yielding 48ca6829abSJohn Baldwinthe processor. 49561205dfSEdward Tomasz NapieralaMutexes fully support priority propagation. 50815e4772SEdward Tomasz Napierala.Pp 514ff467dcSEdward Tomasz NapieralaSee 52815e4772SEdward Tomasz Napierala.Xr mutex 9 534ff467dcSEdward Tomasz Napieralafor details. 54ca6829abSJohn Baldwin.Ss Spin Mutexes 55ca6829abSJohn BaldwinSpin mutexes are a variation of basic mutexes; the main difference between 56ca6829abSJohn Baldwinthe two is that spin mutexes never block. 57ca6829abSJohn BaldwinInstead, they spin while waiting for the lock to be released. 5810038699SBenjamin KadukTo avoid deadlock, a thread that holds a spin mutex must never yield its CPU. 59ca6829abSJohn BaldwinUnlike ordinary mutexes, spin mutexes disable interrupts when acquired. 60ca6829abSJohn BaldwinSince disabling interrupts can be expensive, they are generally slower to 61ca6829abSJohn Baldwinacquire and release. 62ca6829abSJohn BaldwinSpin mutexes should be used only when absolutely necessary, 63ca6829abSJohn Baldwine.g. to protect data shared 64ddcd2bc9SEdward Tomasz Napieralawith interrupt filter code (see 65ddcd2bc9SEdward Tomasz Napierala.Xr bus_setup_intr 9 66ca6829abSJohn Baldwinfor details), 67ca6829abSJohn Baldwinor for scheduler internals. 68ca6829abSJohn Baldwin.Ss Mutex Pools 69ca6829abSJohn BaldwinWith most synchronization primitives, such as mutexes, the programmer must 70ca6829abSJohn Baldwinprovide memory to hold the primitive. 71815e4772SEdward Tomasz NapieralaFor example, a mutex may be embedded inside the structure it protects. 72ca6829abSJohn BaldwinMutex pools provide a preallocated set of mutexes to avoid this 73ca6829abSJohn Baldwinrequirement. 74ca6829abSJohn BaldwinNote that mutexes from a pool may only be used as leaf locks. 75815e4772SEdward Tomasz Napierala.Pp 764ff467dcSEdward Tomasz NapieralaSee 77815e4772SEdward Tomasz Napierala.Xr mtx_pool 9 784ff467dcSEdward Tomasz Napieralafor details. 79ca6829abSJohn Baldwin.Ss Reader/Writer Locks 80ca6829abSJohn BaldwinReader/writer locks allow shared access to protected data by multiple threads 810929bf8eSJulian Elischeror exclusive access by a single thread. 820929bf8eSJulian ElischerThe threads with shared access are known as 830929bf8eSJulian Elischer.Em readers 8420f16ca0SJulian Elischersince they should only read the protected data. 850929bf8eSJulian ElischerA thread with exclusive access is known as a 860929bf8eSJulian Elischer.Em writer 8720f16ca0SJulian Elischersince it may modify protected data. 880929bf8eSJulian Elischer.Pp 8920f16ca0SJulian ElischerReader/writer locks can be treated as mutexes (see above and 900929bf8eSJulian Elischer.Xr mutex 9 ) 910929bf8eSJulian Elischerwith shared/exclusive semantics. 92ca6829abSJohn BaldwinReader/writer locks support priority propagation like mutexes, 93ca6829abSJohn Baldwinbut priority is propagated only to an exclusive holder. 940929bf8eSJulian ElischerThis limitation comes from the fact that shared owners 950929bf8eSJulian Elischerare anonymous. 96815e4772SEdward Tomasz Napierala.Pp 974ff467dcSEdward Tomasz NapieralaSee 98815e4772SEdward Tomasz Napierala.Xr rwlock 9 994ff467dcSEdward Tomasz Napieralafor details. 100ca6829abSJohn Baldwin.Ss Read-Mostly Locks 101ca6829abSJohn BaldwinRead-mostly locks are similar to 102561205dfSEdward Tomasz Napierala.Em reader/writer 103561205dfSEdward Tomasz Napieralalocks but optimized for very infrequent write locking. 104561205dfSEdward Tomasz Napierala.Em Read-mostly 105f53d15feSStephan Uphofflocks implement full priority propagation by tracking shared owners 10688238a08SEdward Tomasz Napieralausing a caller-supplied 107f53d15feSStephan Uphoff.Em tracker 108f53d15feSStephan Uphoffdata structure. 109815e4772SEdward Tomasz Napierala.Pp 1104ff467dcSEdward Tomasz NapieralaSee 111815e4772SEdward Tomasz Napierala.Xr rmlock 9 1124ff467dcSEdward Tomasz Napieralafor details. 113ca6829abSJohn Baldwin.Ss Sleepable Read-Mostly Locks 114ca6829abSJohn BaldwinSleepable read-mostly locks are a variation on read-mostly locks. 115ca6829abSJohn BaldwinThreads holding an exclusive lock may sleep, 116ca6829abSJohn Baldwinbut threads holding a shared lock may not. 117ca6829abSJohn BaldwinPriority is propagated to shared owners but not to exclusive owners. 118815e4772SEdward Tomasz Napierala.Ss Shared/exclusive locks 119561205dfSEdward Tomasz NapieralaShared/exclusive locks are similar to reader/writer locks; the main difference 120ca6829abSJohn Baldwinbetween them is that shared/exclusive locks may be held during unbounded sleep. 121ca6829abSJohn BaldwinAcquiring a contested shared/exclusive lock can perform an unbounded sleep. 122ca6829abSJohn BaldwinThese locks do not support priority propagation. 123815e4772SEdward Tomasz Napierala.Pp 1244ff467dcSEdward Tomasz NapieralaSee 125815e4772SEdward Tomasz Napierala.Xr sx 9 1264ff467dcSEdward Tomasz Napieralafor details. 127ca6829abSJohn Baldwin.Ss Lockmanager locks 128ca6829abSJohn BaldwinLockmanager locks are sleepable shared/exclusive locks used mostly in 129ca6829abSJohn Baldwin.Xr VFS 9 130ca6829abSJohn Baldwin.Po 131ca6829abSJohn Baldwinas a 132ca6829abSJohn Baldwin.Xr vnode 9 133ca6829abSJohn Baldwinlock 134ca6829abSJohn Baldwin.Pc 135ca6829abSJohn Baldwinand in the buffer cache 136ca6829abSJohn Baldwin.Po 137ca6829abSJohn Baldwin.Xr BUF_LOCK 9 138ca6829abSJohn Baldwin.Pc . 139ca6829abSJohn BaldwinThey have features other lock types do not have such as sleep 140ca6829abSJohn Baldwintimeouts, blocking upgrades, 141ca6829abSJohn Baldwinwriter starvation avoidance, draining, and an interlock mutex, 14210038699SBenjamin Kadukbut this makes them complicated both to use and to implement; 143ca6829abSJohn Baldwinfor this reason, they should be avoided. 144ca6829abSJohn Baldwin.Pp 145ca6829abSJohn BaldwinSee 146ca6829abSJohn Baldwin.Xr lock 9 147ca6829abSJohn Baldwinfor details. 148815e4772SEdward Tomasz Napierala.Ss Counting semaphores 149815e4772SEdward Tomasz NapieralaCounting semaphores provide a mechanism for synchronizing access 150815e4772SEdward Tomasz Napieralato a pool of resources. 151815e4772SEdward Tomasz NapieralaUnlike mutexes, semaphores do not have the concept of an owner, 152815e4772SEdward Tomasz Napieralaso they can be useful in situations where one thread needs 153815e4772SEdward Tomasz Napieralato acquire a resource, and another thread needs to release it. 154815e4772SEdward Tomasz NapieralaThey are largely deprecated. 155815e4772SEdward Tomasz Napierala.Pp 1564ff467dcSEdward Tomasz NapieralaSee 157815e4772SEdward Tomasz Napierala.Xr sema 9 1584ff467dcSEdward Tomasz Napieralafor details. 1590929bf8eSJulian Elischer.Ss Condition variables 160ca6829abSJohn BaldwinCondition variables are used in conjunction with locks to wait for 161ca6829abSJohn Baldwina condition to become true. 162ca6829abSJohn BaldwinA thread must hold the associated lock before calling one of the 163ca6829abSJohn Baldwin.Fn cv_wait , 1640929bf8eSJulian Elischerfunctions. 165ca6829abSJohn BaldwinWhen a thread waits on a condition, the lock 166ca6829abSJohn Baldwinis atomically released before the thread yields the processor 167ca6829abSJohn Baldwinand reacquired before the function call returns. 168ca6829abSJohn BaldwinCondition variables may be used with blocking mutexes, 169ca6829abSJohn Baldwinreader/writer locks, read-mostly locks, and shared/exclusive locks. 170815e4772SEdward Tomasz Napierala.Pp 1714ff467dcSEdward Tomasz NapieralaSee 172815e4772SEdward Tomasz Napierala.Xr condvar 9 1734ff467dcSEdward Tomasz Napieralafor details. 174ca6829abSJohn Baldwin.Ss Sleep/Wakeup 1750929bf8eSJulian ElischerThe functions 1760929bf8eSJulian Elischer.Fn tsleep , 1770929bf8eSJulian Elischer.Fn msleep , 1780929bf8eSJulian Elischer.Fn msleep_spin , 1790929bf8eSJulian Elischer.Fn pause , 1800929bf8eSJulian Elischer.Fn wakeup , 1810929bf8eSJulian Elischerand 1820929bf8eSJulian Elischer.Fn wakeup_one 183ca6829abSJohn Baldwinalso handle event-based thread blocking. 184ca6829abSJohn BaldwinUnlike condition variables, 18510038699SBenjamin Kadukarbitrary addresses may be used as wait channels and a dedicated 186ca6829abSJohn Baldwinstructure does not need to be allocated. 187ca6829abSJohn BaldwinHowever, care must be taken to ensure that wait channel addresses are 188ca6829abSJohn Baldwinunique to an event. 1894ff78a9cSJulian ElischerIf a thread must wait for an external event, it is put to sleep by 1900929bf8eSJulian Elischer.Fn tsleep , 1910929bf8eSJulian Elischer.Fn msleep , 1920929bf8eSJulian Elischer.Fn msleep_spin , 1930929bf8eSJulian Elischeror 1940929bf8eSJulian Elischer.Fn pause . 1950929bf8eSJulian ElischerThreads may also wait using one of the locking primitive sleep routines 1960929bf8eSJulian Elischer.Xr mtx_sleep 9 , 1970929bf8eSJulian Elischer.Xr rw_sleep 9 , 1980929bf8eSJulian Elischeror 1990929bf8eSJulian Elischer.Xr sx_sleep 9 . 2000929bf8eSJulian Elischer.Pp 2010929bf8eSJulian ElischerThe parameter 2020929bf8eSJulian Elischer.Fa chan 2030929bf8eSJulian Elischeris an arbitrary address that uniquely identifies the event on which 2040929bf8eSJulian Elischerthe thread is being put to sleep. 2050929bf8eSJulian ElischerAll threads sleeping on a single 2060929bf8eSJulian Elischer.Fa chan 2070929bf8eSJulian Elischerare woken up later by 208ca6829abSJohn Baldwin.Fn wakeup 209ca6829abSJohn Baldwin.Pq often called from inside an interrupt routine 210ca6829abSJohn Baldwinto indicate that the 211ca6829abSJohn Baldwinevent the thread was blocking on has occurred. 2120929bf8eSJulian Elischer.Pp 2130929bf8eSJulian ElischerSeveral of the sleep functions including 2140929bf8eSJulian Elischer.Fn msleep , 2150929bf8eSJulian Elischer.Fn msleep_spin , 2160929bf8eSJulian Elischerand the locking primitive sleep routines specify an additional lock 2170929bf8eSJulian Elischerparameter. 2180929bf8eSJulian ElischerThe lock will be released before sleeping and reacquired 2190929bf8eSJulian Elischerbefore the sleep routine returns. 2200929bf8eSJulian ElischerIf 2210929bf8eSJulian Elischer.Fa priority 2220929bf8eSJulian Elischerincludes the 2230929bf8eSJulian Elischer.Dv PDROP 2244ff78a9cSJulian Elischerflag, then the lock will not be reacquired before returning. 2250929bf8eSJulian ElischerThe lock is used to ensure that a condition can be checked atomically, 2260929bf8eSJulian Elischerand that the current thread can be suspended without missing a 227ca6829abSJohn Baldwinchange to the condition or an associated wakeup. 2280929bf8eSJulian ElischerIn addition, all of the sleep routines will fully drop the 2290929bf8eSJulian Elischer.Va Giant 2300929bf8eSJulian Elischermutex 231ca6829abSJohn Baldwin.Pq even if recursed 2320929bf8eSJulian Elischerwhile the thread is suspended and will reacquire the 2330929bf8eSJulian Elischer.Va Giant 234ca6829abSJohn Baldwinmutex 235ca6829abSJohn Baldwin.Pq restoring any recursion 236ca6829abSJohn Baldwinbefore the function returns. 237ca6829abSJohn Baldwin.Pp 238ca6829abSJohn BaldwinThe 239ca6829abSJohn Baldwin.Fn pause 240ca6829abSJohn Baldwinfunction is a special sleep function that waits for a specified 241ca6829abSJohn Baldwinamount of time to pass before the thread resumes execution. 242ca6829abSJohn BaldwinThis sleep cannot be terminated early by either an explicit 243ca6829abSJohn Baldwin.Fn wakeup 244ca6829abSJohn Baldwinor a signal. 2450929bf8eSJulian Elischer.Pp 2464ff467dcSEdward Tomasz NapieralaSee 247815e4772SEdward Tomasz Napierala.Xr sleep 9 2484ff467dcSEdward Tomasz Napieralafor details. 249ca6829abSJohn Baldwin.Ss Giant 250ca6829abSJohn BaldwinGiant is a special mutex used to protect data structures that do not 251ca6829abSJohn Baldwinyet have their own locks. 252ca6829abSJohn BaldwinSince it provides semantics akin to the old 253ca6829abSJohn Baldwin.Xr spl 9 254ca6829abSJohn Baldwininterface, 255ca6829abSJohn BaldwinGiant has special characteristics: 256ca6829abSJohn Baldwin.Bl -enum 257ca6829abSJohn Baldwin.It 258ca6829abSJohn BaldwinIt is recursive. 259ca6829abSJohn Baldwin.It 260ca6829abSJohn BaldwinDrivers can request that Giant be locked around them 261ca6829abSJohn Baldwinby not marking themselves MPSAFE. 262ca6829abSJohn BaldwinNote that infrastructure to do this is slowly going away as non-MPSAFE 263ca6829abSJohn Baldwindrivers either became properly locked or disappear. 264ca6829abSJohn Baldwin.It 265ca6829abSJohn BaldwinGiant must be locked before other non-sleepable locks. 266ca6829abSJohn Baldwin.It 267ca6829abSJohn BaldwinGiant is dropped during unbounded sleeps and reacquired after wakeup. 268ca6829abSJohn Baldwin.It 269ca6829abSJohn BaldwinThere are places in the kernel that drop Giant and pick it back up 270ca6829abSJohn Baldwinagain. 271ca6829abSJohn BaldwinSleep locks will do this before sleeping. 272ca6829abSJohn BaldwinParts of the network or VM code may do this as well. 273ca6829abSJohn BaldwinThis means that you cannot count on Giant keeping other code from 274ca6829abSJohn Baldwinrunning if your code sleeps, even if you want it to. 275ca6829abSJohn Baldwin.El 276815e4772SEdward Tomasz Napierala.Sh INTERACTIONS 277ca6829abSJohn BaldwinThe primitives can interact and have a number of rules regarding how 278ddcd2bc9SEdward Tomasz Napieralathey can and can not be combined. 279ca6829abSJohn BaldwinMany of these rules are checked by 280ca6829abSJohn Baldwin.Xr witness 4 . 281ca6829abSJohn Baldwin.Ss Bounded vs. Unbounded Sleep 28210038699SBenjamin KadukIn a bounded sleep 28310038699SBenjamin Kaduk.Po also referred to as 28410038699SBenjamin Kaduk.Dq blocking 28510038699SBenjamin Kaduk.Pc 28610038699SBenjamin Kadukthe only resource needed to resume execution of a thread 287ca6829abSJohn Baldwinis CPU time for the owner of a lock that the thread is waiting to acquire. 28810038699SBenjamin KadukIn an unbounded sleep 289ca6829abSJohn Baldwin.Po 290ca6829abSJohn Baldwinoften referred to as simply 291ca6829abSJohn Baldwin.Dq sleeping 292ca6829abSJohn Baldwin.Pc 29310038699SBenjamin Kaduka thread waits for an external event or for a condition 294ca6829abSJohn Baldwinto become true. 295ca6829abSJohn BaldwinIn particular, 296ca6829abSJohn Baldwina dependency chain of threads in bounded sleeps should always make forward 29710038699SBenjamin Kadukprogress, 29810038699SBenjamin Kaduksince there is always CPU time available. 299ca6829abSJohn BaldwinThis requires that no thread in a bounded sleep is waiting for a lock held 300ca6829abSJohn Baldwinby a thread in an unbounded sleep. 301ca6829abSJohn BaldwinTo avoid priority inversions, 302ca6829abSJohn Baldwina thread in a bounded sleep lends its priority to the owner of the lock 303ca6829abSJohn Baldwinthat it is waiting for. 304561205dfSEdward Tomasz Napierala.Pp 305ca6829abSJohn BaldwinThe following primitives perform bounded sleeps: 306ca6829abSJohn Baldwinmutexes, reader/writer locks and read-mostly locks. 307561205dfSEdward Tomasz Napierala.Pp 308ca6829abSJohn BaldwinThe following primitives perform unbounded sleeps: 309ca6829abSJohn Baldwinsleepable read-mostly locks, shared/exclusive locks, lockmanager locks, 310ca6829abSJohn Baldwincounting semaphores, condition variables, and sleep/wakeup. 311ca6829abSJohn Baldwin.Ss General Principles 312ca6829abSJohn Baldwin.Bl -bullet 313ca6829abSJohn Baldwin.It 3142139f5e0SJulian ElischerIt is an error to do any operation that could result in yielding the processor 3152139f5e0SJulian Elischerwhile holding a spin mutex. 316ca6829abSJohn Baldwin.It 317ca6829abSJohn BaldwinIt is an error to do any operation that could result in unbounded sleep 318ca6829abSJohn Baldwinwhile holding any primitive from the 'bounded sleep' group. 319ca6829abSJohn BaldwinFor example, it is an error to try to acquire a shared/exclusive lock while 320ca6829abSJohn Baldwinholding a mutex, or to try to allocate memory with M_WAITOK while holding a 321ca6829abSJohn Baldwinreader/writer lock. 322561205dfSEdward Tomasz Napierala.Pp 323ca6829abSJohn BaldwinNote that the lock passed to one of the 32488238a08SEdward Tomasz Napierala.Fn sleep 325561205dfSEdward Tomasz Napieralaor 326ca6829abSJohn Baldwin.Fn cv_wait 327ca6829abSJohn Baldwinfunctions is dropped before the thread enters the unbounded sleep and does 328ca6829abSJohn Baldwinnot violate this rule. 329ca6829abSJohn Baldwin.It 3302139f5e0SJulian ElischerIt is an error to do any operation that could result in yielding of 3312139f5e0SJulian Elischerthe processor when running inside an interrupt filter. 332ca6829abSJohn Baldwin.It 3330b0b48c0SEdward Tomasz NapieralaIt is an error to do any operation that could result in unbounded sleep when 3340b0b48c0SEdward Tomasz Napieralarunning inside an interrupt thread. 335ca6829abSJohn Baldwin.El 336561205dfSEdward Tomasz Napierala.Ss Interaction table 337ddcd2bc9SEdward Tomasz NapieralaThe following table shows what you can and can not do while holding 338ca6829abSJohn Baldwinone of the locking primitives discussed. Note that 339ca6829abSJohn Baldwin.Dq sleep 340ca6829abSJohn Baldwinincludes 341ca6829abSJohn Baldwin.Fn sema_wait , 342ca6829abSJohn Baldwin.Fn sema_timedwait , 343ca6829abSJohn Baldwinany of the 344ca6829abSJohn Baldwin.Fn cv_wait 345ca6829abSJohn Baldwinfunctions, 346ca6829abSJohn Baldwinand any of the 347ca6829abSJohn Baldwin.Fn sleep 348ca6829abSJohn Baldwinfunctions. 349ca6829abSJohn Baldwin.Bl -column ".Ic xxxxxxxxxxxxxxxx" ".Xr XXXXXXXXX" ".Xr XXXXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXXXXX" ".Xr XXXXXX" -offset 3n 350ca6829abSJohn Baldwin.It Em " You want:" Ta spin mtx Ta mutex/rw Ta rmlock Ta sleep rm Ta sx/lk Ta sleep 351ca6829abSJohn Baldwin.It Em "You have: " Ta -------- Ta -------- Ta ------ Ta -------- Ta ------ Ta ------ 352ca6829abSJohn Baldwin.It spin mtx Ta \&ok Ta \&no Ta \&no Ta \&no Ta \&no Ta \&no-1 353ca6829abSJohn Baldwin.It mutex/rw Ta \&ok Ta \&ok Ta \&ok Ta \&no Ta \&no Ta \&no-1 354ca6829abSJohn Baldwin.It rmlock Ta \&ok Ta \&ok Ta \&ok Ta \&no Ta \&no Ta \&no-1 355ca6829abSJohn Baldwin.It sleep rm Ta \&ok Ta \&ok Ta \&ok Ta \&ok-2 Ta \&ok-2 Ta \&ok-2/3 356ca6829abSJohn Baldwin.It sx Ta \&ok Ta \&ok Ta \&ok Ta \&ok Ta \&ok Ta \&ok-3 357ca6829abSJohn Baldwin.It lockmgr Ta \&ok Ta \&ok Ta \&ok Ta \&ok Ta \&ok Ta \&ok 3580929bf8eSJulian Elischer.El 3590929bf8eSJulian Elischer.Pp 3600929bf8eSJulian Elischer.Em *1 361ca6829abSJohn BaldwinThere are calls that atomically release this primitive when going to sleep 362ca6829abSJohn Baldwinand reacquire it on wakeup 363ca6829abSJohn Baldwin.Po 364ca6829abSJohn Baldwin.Fn mtx_sleep , 365ca6829abSJohn Baldwin.Fn rw_sleep , 366ca6829abSJohn Baldwin.Fn msleep_spin , 367ca6829abSJohn Baldwinetc. 368ca6829abSJohn Baldwin.Pc . 3690929bf8eSJulian Elischer.Pp 3700929bf8eSJulian Elischer.Em *2 371ca6829abSJohn BaldwinThese cases are only allowed while holding a write lock on a sleepable 372ca6829abSJohn Baldwinread-mostly lock. 3730929bf8eSJulian Elischer.Pp 3740929bf8eSJulian Elischer.Em *3 375ca6829abSJohn BaldwinThough one can sleep while holding this lock, 376ca6829abSJohn Baldwinone can also use a 377ca6829abSJohn Baldwin.Fn sleep 378ca6829abSJohn Baldwinfunction to atomically release this primitive when going to sleep and 3794ff78a9cSJulian Elischerreacquire it on wakeup. 38036058c09SMax Laier.Pp 381ca6829abSJohn BaldwinNote that non-blocking try operations on locks are always permitted. 382561205dfSEdward Tomasz Napierala.Ss Context mode table 3834ff78a9cSJulian ElischerThe next table shows what can be used in different contexts. 3844ff78a9cSJulian ElischerAt this time this is a rather easy to remember table. 385ca6829abSJohn Baldwin.Bl -column ".Ic Xxxxxxxxxxxxxxxxxxx" ".Xr XXXXXXXXX" ".Xr XXXXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXXXXX" ".Xr XXXXXX" -offset 3n 386ca6829abSJohn Baldwin.It Em "Context:" Ta spin mtx Ta mutex/rw Ta rmlock Ta sleep rm Ta sx/lk Ta sleep 387ddcd2bc9SEdward Tomasz Napierala.It interrupt filter: Ta \&ok Ta \&no Ta \&no Ta \&no Ta \&no Ta \&no 388ca6829abSJohn Baldwin.It interrupt thread: Ta \&ok Ta \&ok Ta \&ok Ta \&no Ta \&no Ta \&no 389ca6829abSJohn Baldwin.It callout: Ta \&ok Ta \&ok Ta \&ok Ta \&no Ta \&no Ta \&no 390ca6829abSJohn Baldwin.It system call: Ta \&ok Ta \&ok Ta \&ok Ta \&ok Ta \&ok Ta \&ok 391c2c54c3dSJulian Elischer.El 3920929bf8eSJulian Elischer.Sh SEE ALSO 39388238a08SEdward Tomasz Napierala.Xr witness 4 , 394*1e9469d1SChristian Brueffer.Xr BUS_SETUP_INTR 9 , 3950929bf8eSJulian Elischer.Xr condvar 9 , 3963111fc98SChristian Brueffer.Xr lock 9 , 397*1e9469d1SChristian Brueffer.Xr LOCK_PROFILING 9 , 3980929bf8eSJulian Elischer.Xr mtx_pool 9 , 39920f16ca0SJulian Elischer.Xr mutex 9 , 400f53d15feSStephan Uphoff.Xr rmlock 9 , 4010929bf8eSJulian Elischer.Xr rwlock 9 , 4020929bf8eSJulian Elischer.Xr sema 9 , 4030929bf8eSJulian Elischer.Xr sleep 9 , 404*1e9469d1SChristian Brueffer.Xr sx 9 4050929bf8eSJulian Elischer.Sh HISTORY 4060929bf8eSJulian ElischerThese 4070929bf8eSJulian Elischerfunctions appeared in 4080929bf8eSJulian Elischer.Bsx 4.1 4090929bf8eSJulian Elischerthrough 41073bbeaa5SGlen Barber.Fx 7.0 . 411815e4772SEdward Tomasz Napierala.Sh BUGS 412815e4772SEdward Tomasz NapieralaThere are too many locking primitives to choose from. 413