xref: /freebsd/share/man/man9/locking.9 (revision ca6829ab999ccb10d0b60d111808fc8bc7392792)
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.\"
275aa42cabSEd Maste.Dd May 22, 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
36*ca6829abSJohn Baldwinkernel is written to run across multiple CPUs and as such provides
37*ca6829abSJohn Baldwinseveral different synchronization primitives to allow developers
38*ca6829abSJohn Baldwinto safely access and manipulate many data types.
3920f16ca0SJulian Elischer.Ss Mutexes
40*ca6829abSJohn 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.
45*ca6829abSJohn BaldwinMutexes are adaptive by default, meaning that
462139f5e0SJulian Elischerif the owner of a contended mutex is currently running on another CPU,
47*ca6829abSJohn Baldwinthen a thread attempting to acquire the mutex will spin rather than yielding
48*ca6829abSJohn 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.
54*ca6829abSJohn Baldwin.Ss Spin Mutexes
55*ca6829abSJohn BaldwinSpin mutexes are a variation of basic mutexes; the main difference between
56*ca6829abSJohn Baldwinthe two is that spin mutexes never block.
57*ca6829abSJohn BaldwinInstead, they spin while waiting for the lock to be released.
58*ca6829abSJohn BaldwinNote that a thread that holds a spin mutex must never yield its CPU to
59*ca6829abSJohn Baldwinavoid deadlock.
60*ca6829abSJohn BaldwinUnlike ordinary mutexes, spin mutexes disable interrupts when acquired.
61*ca6829abSJohn BaldwinSince disabling interrupts can be expensive, they are generally slower to
62*ca6829abSJohn Baldwinacquire and release.
63*ca6829abSJohn BaldwinSpin mutexes should be used only when absolutely necessary,
64*ca6829abSJohn Baldwine.g. to protect data shared
65ddcd2bc9SEdward Tomasz Napieralawith interrupt filter code (see
66ddcd2bc9SEdward Tomasz Napierala.Xr bus_setup_intr 9
67*ca6829abSJohn Baldwinfor details),
68*ca6829abSJohn Baldwinor for scheduler internals.
69*ca6829abSJohn Baldwin.Ss Mutex Pools
70*ca6829abSJohn BaldwinWith most synchronization primitives, such as mutexes, the programmer must
71*ca6829abSJohn Baldwinprovide memory to hold the primitive.
72815e4772SEdward Tomasz NapieralaFor example, a mutex may be embedded inside the structure it protects.
73*ca6829abSJohn BaldwinMutex pools provide a preallocated set of mutexes to avoid this
74*ca6829abSJohn Baldwinrequirement.
75*ca6829abSJohn BaldwinNote that mutexes from a pool may only be used as leaf locks.
76815e4772SEdward Tomasz Napierala.Pp
774ff467dcSEdward Tomasz NapieralaSee
78815e4772SEdward Tomasz Napierala.Xr mtx_pool 9
794ff467dcSEdward Tomasz Napieralafor details.
80*ca6829abSJohn Baldwin.Ss Reader/Writer Locks
81*ca6829abSJohn BaldwinReader/writer locks allow shared access to protected data by multiple threads
820929bf8eSJulian Elischeror exclusive access by a single thread.
830929bf8eSJulian ElischerThe threads with shared access are known as
840929bf8eSJulian Elischer.Em readers
8520f16ca0SJulian Elischersince they should only read the protected data.
860929bf8eSJulian ElischerA thread with exclusive access is known as a
870929bf8eSJulian Elischer.Em writer
8820f16ca0SJulian Elischersince it may modify protected data.
890929bf8eSJulian Elischer.Pp
9020f16ca0SJulian ElischerReader/writer locks can be treated as mutexes (see above and
910929bf8eSJulian Elischer.Xr mutex 9 )
920929bf8eSJulian Elischerwith shared/exclusive semantics.
93*ca6829abSJohn BaldwinReader/writer locks support priority propagation like mutexes,
94*ca6829abSJohn Baldwinbut priority is propagated only to an exclusive holder.
950929bf8eSJulian ElischerThis limitation comes from the fact that shared owners
960929bf8eSJulian Elischerare anonymous.
97815e4772SEdward Tomasz Napierala.Pp
984ff467dcSEdward Tomasz NapieralaSee
99815e4772SEdward Tomasz Napierala.Xr rwlock 9
1004ff467dcSEdward Tomasz Napieralafor details.
101*ca6829abSJohn Baldwin.Ss Read-Mostly Locks
102*ca6829abSJohn BaldwinRead-mostly locks are similar to
103561205dfSEdward Tomasz Napierala.Em reader/writer
104561205dfSEdward Tomasz Napieralalocks but optimized for very infrequent write locking.
105561205dfSEdward Tomasz Napierala.Em Read-mostly
106f53d15feSStephan Uphofflocks implement full priority propagation by tracking shared owners
10788238a08SEdward Tomasz Napieralausing a caller-supplied
108f53d15feSStephan Uphoff.Em tracker
109f53d15feSStephan Uphoffdata structure.
110815e4772SEdward Tomasz Napierala.Pp
1114ff467dcSEdward Tomasz NapieralaSee
112815e4772SEdward Tomasz Napierala.Xr rmlock 9
1134ff467dcSEdward Tomasz Napieralafor details.
114*ca6829abSJohn Baldwin.Ss Sleepable Read-Mostly Locks
115*ca6829abSJohn BaldwinSleepable read-mostly locks are a variation on read-mostly locks.
116*ca6829abSJohn BaldwinThreads holding an exclusive lock may sleep,
117*ca6829abSJohn Baldwinbut threads holding a shared lock may not.
118*ca6829abSJohn BaldwinPriority is propagated to shared owners but not to exclusive owners.
119815e4772SEdward Tomasz Napierala.Ss Shared/exclusive locks
120561205dfSEdward Tomasz NapieralaShared/exclusive locks are similar to reader/writer locks; the main difference
121*ca6829abSJohn Baldwinbetween them is that shared/exclusive locks may be held during unbounded sleep.
122*ca6829abSJohn BaldwinAcquiring a contested shared/exclusive lock can perform an unbounded sleep.
123*ca6829abSJohn BaldwinThese locks do not support priority propagation.
124815e4772SEdward Tomasz Napierala.Pp
1254ff467dcSEdward Tomasz NapieralaSee
126815e4772SEdward Tomasz Napierala.Xr sx 9
1274ff467dcSEdward Tomasz Napieralafor details.
128*ca6829abSJohn Baldwin.Ss Lockmanager locks
129*ca6829abSJohn BaldwinLockmanager locks are sleepable shared/exclusive locks used mostly in
130*ca6829abSJohn Baldwin.Xr VFS 9
131*ca6829abSJohn Baldwin.Po
132*ca6829abSJohn Baldwinas a
133*ca6829abSJohn Baldwin.Xr vnode 9
134*ca6829abSJohn Baldwinlock
135*ca6829abSJohn Baldwin.Pc
136*ca6829abSJohn Baldwinand in the buffer cache
137*ca6829abSJohn Baldwin.Po
138*ca6829abSJohn Baldwin.Xr BUF_LOCK 9
139*ca6829abSJohn Baldwin.Pc .
140*ca6829abSJohn BaldwinThey have features other lock types do not have such as sleep
141*ca6829abSJohn Baldwintimeouts, blocking upgrades,
142*ca6829abSJohn Baldwinwriter starvation avoidance, draining, and an interlock mutex,
143*ca6829abSJohn Baldwinbut this makes them complicated to both use and implement;
144*ca6829abSJohn Baldwinfor this reason, they should be avoided.
145*ca6829abSJohn Baldwin.Pp
146*ca6829abSJohn BaldwinSee
147*ca6829abSJohn Baldwin.Xr lock 9
148*ca6829abSJohn Baldwinfor details.
149815e4772SEdward Tomasz Napierala.Ss Counting semaphores
150815e4772SEdward Tomasz NapieralaCounting semaphores provide a mechanism for synchronizing access
151815e4772SEdward Tomasz Napieralato a pool of resources.
152815e4772SEdward Tomasz NapieralaUnlike mutexes, semaphores do not have the concept of an owner,
153815e4772SEdward Tomasz Napieralaso they can be useful in situations where one thread needs
154815e4772SEdward Tomasz Napieralato acquire a resource, and another thread needs to release it.
155815e4772SEdward Tomasz NapieralaThey are largely deprecated.
156815e4772SEdward Tomasz Napierala.Pp
1574ff467dcSEdward Tomasz NapieralaSee
158815e4772SEdward Tomasz Napierala.Xr sema 9
1594ff467dcSEdward Tomasz Napieralafor details.
1600929bf8eSJulian Elischer.Ss Condition variables
161*ca6829abSJohn BaldwinCondition variables are used in conjunction with locks to wait for
162*ca6829abSJohn Baldwina condition to become true.
163*ca6829abSJohn BaldwinA thread must hold the associated lock before calling one of the
164*ca6829abSJohn Baldwin.Fn cv_wait ,
1650929bf8eSJulian Elischerfunctions.
166*ca6829abSJohn BaldwinWhen a thread waits on a condition, the lock
167*ca6829abSJohn Baldwinis atomically released before the thread yields the processor
168*ca6829abSJohn Baldwinand reacquired before the function call returns.
169*ca6829abSJohn BaldwinCondition variables may be used with blocking mutexes,
170*ca6829abSJohn Baldwinreader/writer locks, read-mostly locks, and shared/exclusive locks.
171815e4772SEdward Tomasz Napierala.Pp
1724ff467dcSEdward Tomasz NapieralaSee
173815e4772SEdward Tomasz Napierala.Xr condvar 9
1744ff467dcSEdward Tomasz Napieralafor details.
175*ca6829abSJohn Baldwin.Ss Sleep/Wakeup
1760929bf8eSJulian ElischerThe functions
1770929bf8eSJulian Elischer.Fn tsleep ,
1780929bf8eSJulian Elischer.Fn msleep ,
1790929bf8eSJulian Elischer.Fn msleep_spin ,
1800929bf8eSJulian Elischer.Fn pause ,
1810929bf8eSJulian Elischer.Fn wakeup ,
1820929bf8eSJulian Elischerand
1830929bf8eSJulian Elischer.Fn wakeup_one
184*ca6829abSJohn Baldwinalso handle event-based thread blocking.
185*ca6829abSJohn BaldwinUnlike condition variables,
186*ca6829abSJohn Baldwinarbitrary addresses may be used as wait channels and an dedicated
187*ca6829abSJohn Baldwinstructure does not need to be allocated.
188*ca6829abSJohn BaldwinHowever, care must be taken to ensure that wait channel addresses are
189*ca6829abSJohn Baldwinunique to an event.
1904ff78a9cSJulian ElischerIf a thread must wait for an external event, it is put to sleep by
1910929bf8eSJulian Elischer.Fn tsleep ,
1920929bf8eSJulian Elischer.Fn msleep ,
1930929bf8eSJulian Elischer.Fn msleep_spin ,
1940929bf8eSJulian Elischeror
1950929bf8eSJulian Elischer.Fn pause .
1960929bf8eSJulian ElischerThreads may also wait using one of the locking primitive sleep routines
1970929bf8eSJulian Elischer.Xr mtx_sleep 9 ,
1980929bf8eSJulian Elischer.Xr rw_sleep 9 ,
1990929bf8eSJulian Elischeror
2000929bf8eSJulian Elischer.Xr sx_sleep 9 .
2010929bf8eSJulian Elischer.Pp
2020929bf8eSJulian ElischerThe parameter
2030929bf8eSJulian Elischer.Fa chan
2040929bf8eSJulian Elischeris an arbitrary address that uniquely identifies the event on which
2050929bf8eSJulian Elischerthe thread is being put to sleep.
2060929bf8eSJulian ElischerAll threads sleeping on a single
2070929bf8eSJulian Elischer.Fa chan
2080929bf8eSJulian Elischerare woken up later by
209*ca6829abSJohn Baldwin.Fn wakeup
210*ca6829abSJohn Baldwin.Pq often called from inside an interrupt routine
211*ca6829abSJohn Baldwinto indicate that the
212*ca6829abSJohn Baldwinevent the thread was blocking on has occurred.
2130929bf8eSJulian Elischer.Pp
2140929bf8eSJulian ElischerSeveral of the sleep functions including
2150929bf8eSJulian Elischer.Fn msleep ,
2160929bf8eSJulian Elischer.Fn msleep_spin ,
2170929bf8eSJulian Elischerand the locking primitive sleep routines specify an additional lock
2180929bf8eSJulian Elischerparameter.
2190929bf8eSJulian ElischerThe lock will be released before sleeping and reacquired
2200929bf8eSJulian Elischerbefore the sleep routine returns.
2210929bf8eSJulian ElischerIf
2220929bf8eSJulian Elischer.Fa priority
2230929bf8eSJulian Elischerincludes the
2240929bf8eSJulian Elischer.Dv PDROP
2254ff78a9cSJulian Elischerflag, then the lock will not be reacquired before returning.
2260929bf8eSJulian ElischerThe lock is used to ensure that a condition can be checked atomically,
2270929bf8eSJulian Elischerand that the current thread can be suspended without missing a
228*ca6829abSJohn Baldwinchange to the condition or an associated wakeup.
2290929bf8eSJulian ElischerIn addition, all of the sleep routines will fully drop the
2300929bf8eSJulian Elischer.Va Giant
2310929bf8eSJulian Elischermutex
232*ca6829abSJohn Baldwin.Pq even if recursed
2330929bf8eSJulian Elischerwhile the thread is suspended and will reacquire the
2340929bf8eSJulian Elischer.Va Giant
235*ca6829abSJohn Baldwinmutex
236*ca6829abSJohn Baldwin.Pq restoring any recursion
237*ca6829abSJohn Baldwinbefore the function returns.
238*ca6829abSJohn Baldwin.Pp
239*ca6829abSJohn BaldwinThe
240*ca6829abSJohn Baldwin.Fn pause
241*ca6829abSJohn Baldwinfunction is a special sleep function that waits for a specified
242*ca6829abSJohn Baldwinamount of time to pass before the thread resumes execution.
243*ca6829abSJohn BaldwinThis sleep cannot be terminated early by either an explicit
244*ca6829abSJohn Baldwin.Fn wakeup
245*ca6829abSJohn Baldwinor a signal.
2460929bf8eSJulian Elischer.Pp
2474ff467dcSEdward Tomasz NapieralaSee
248815e4772SEdward Tomasz Napierala.Xr sleep 9
2494ff467dcSEdward Tomasz Napieralafor details.
250*ca6829abSJohn Baldwin.Ss Giant
251*ca6829abSJohn BaldwinGiant is a special mutex used to protect data structures that do not
252*ca6829abSJohn Baldwinyet have their own locks.
253*ca6829abSJohn BaldwinSince it provides semantics akin to the old
254*ca6829abSJohn Baldwin.Xr spl 9
255*ca6829abSJohn Baldwininterface,
256*ca6829abSJohn BaldwinGiant has special characteristics:
257*ca6829abSJohn Baldwin.Bl -enum
258*ca6829abSJohn Baldwin.It
259*ca6829abSJohn BaldwinIt is recursive.
260*ca6829abSJohn Baldwin.It
261*ca6829abSJohn BaldwinDrivers can request that Giant be locked around them
262*ca6829abSJohn Baldwinby not marking themselves MPSAFE.
263*ca6829abSJohn BaldwinNote that infrastructure to do this is slowly going away as non-MPSAFE
264*ca6829abSJohn Baldwindrivers either became properly locked or disappear.
265*ca6829abSJohn Baldwin.It
266*ca6829abSJohn BaldwinGiant must be locked before other non-sleepable locks.
267*ca6829abSJohn Baldwin.It
268*ca6829abSJohn BaldwinGiant is dropped during unbounded sleeps and reacquired after wakeup.
269*ca6829abSJohn Baldwin.It
270*ca6829abSJohn BaldwinThere are places in the kernel that drop Giant and pick it back up
271*ca6829abSJohn Baldwinagain.
272*ca6829abSJohn BaldwinSleep locks will do this before sleeping.
273*ca6829abSJohn BaldwinParts of the network or VM code may do this as well.
274*ca6829abSJohn BaldwinThis means that you cannot count on Giant keeping other code from
275*ca6829abSJohn Baldwinrunning if your code sleeps, even if you want it to.
276*ca6829abSJohn Baldwin.El
277815e4772SEdward Tomasz Napierala.Sh INTERACTIONS
278*ca6829abSJohn BaldwinThe primitives can interact and have a number of rules regarding how
279ddcd2bc9SEdward Tomasz Napieralathey can and can not be combined.
280*ca6829abSJohn BaldwinMany of these rules are checked by
281*ca6829abSJohn Baldwin.Xr witness 4 .
282*ca6829abSJohn Baldwin.Ss Bounded vs. Unbounded Sleep
283*ca6829abSJohn BaldwinA bounded sleep
284*ca6829abSJohn Baldwin.Pq or blocking
285*ca6829abSJohn Baldwinis a sleep where the only resource needed to resume execution of a thread
286*ca6829abSJohn Baldwinis CPU time for the owner of a lock that the thread is waiting to acquire.
287*ca6829abSJohn BaldwinAn unbounded sleep
288*ca6829abSJohn Baldwin.Po
289*ca6829abSJohn Baldwinoften referred to as simply
290*ca6829abSJohn Baldwin.Dq sleeping
291*ca6829abSJohn Baldwin.Pc
292*ca6829abSJohn Baldwinis a sleep where a thread is waiting for an external event or for a condition
293*ca6829abSJohn Baldwinto become true.
294*ca6829abSJohn BaldwinIn particular,
295*ca6829abSJohn Baldwinsince there is always CPU time available,
296*ca6829abSJohn Baldwina dependency chain of threads in bounded sleeps should always make forward
297*ca6829abSJohn Baldwinprogress.
298*ca6829abSJohn BaldwinThis requires that no thread in a bounded sleep is waiting for a lock held
299*ca6829abSJohn Baldwinby a thread in an unbounded sleep.
300*ca6829abSJohn BaldwinTo avoid priority inversions,
301*ca6829abSJohn Baldwina thread in a bounded sleep lends its priority to the owner of the lock
302*ca6829abSJohn Baldwinthat it is waiting for.
303561205dfSEdward Tomasz Napierala.Pp
304*ca6829abSJohn BaldwinThe following primitives perform bounded sleeps:
305*ca6829abSJohn Baldwinmutexes, reader/writer locks and read-mostly locks.
306561205dfSEdward Tomasz Napierala.Pp
307*ca6829abSJohn BaldwinThe following primitives perform unbounded sleeps:
308*ca6829abSJohn Baldwinsleepable read-mostly locks, shared/exclusive locks, lockmanager locks,
309*ca6829abSJohn Baldwincounting semaphores, condition variables, and sleep/wakeup.
310*ca6829abSJohn Baldwin.Ss General Principles
311*ca6829abSJohn Baldwin.Bl -bullet
312*ca6829abSJohn Baldwin.It
3132139f5e0SJulian ElischerIt is an error to do any operation that could result in yielding the processor
3142139f5e0SJulian Elischerwhile holding a spin mutex.
315*ca6829abSJohn Baldwin.It
316*ca6829abSJohn BaldwinIt is an error to do any operation that could result in unbounded sleep
317*ca6829abSJohn Baldwinwhile holding any primitive from the 'bounded sleep' group.
318*ca6829abSJohn BaldwinFor example, it is an error to try to acquire a shared/exclusive lock while
319*ca6829abSJohn Baldwinholding a mutex, or to try to allocate memory with M_WAITOK while holding a
320*ca6829abSJohn Baldwinreader/writer lock.
321561205dfSEdward Tomasz Napierala.Pp
322*ca6829abSJohn BaldwinNote that the lock passed to one of the
32388238a08SEdward Tomasz Napierala.Fn sleep
324561205dfSEdward Tomasz Napieralaor
325*ca6829abSJohn Baldwin.Fn cv_wait
326*ca6829abSJohn Baldwinfunctions is dropped before the thread enters the unbounded sleep and does
327*ca6829abSJohn Baldwinnot violate this rule.
328*ca6829abSJohn Baldwin.It
3292139f5e0SJulian ElischerIt is an error to do any operation that could result in yielding of
3302139f5e0SJulian Elischerthe processor when running inside an interrupt filter.
331*ca6829abSJohn Baldwin.It
3320b0b48c0SEdward Tomasz NapieralaIt is an error to do any operation that could result in unbounded sleep when
3330b0b48c0SEdward Tomasz Napieralarunning inside an interrupt thread.
334*ca6829abSJohn Baldwin.El
335561205dfSEdward Tomasz Napierala.Ss Interaction table
336ddcd2bc9SEdward Tomasz NapieralaThe following table shows what you can and can not do while holding
337*ca6829abSJohn Baldwinone of the locking primitives discussed.  Note that
338*ca6829abSJohn Baldwin.Dq sleep
339*ca6829abSJohn Baldwinincludes
340*ca6829abSJohn Baldwin.Fn sema_wait ,
341*ca6829abSJohn Baldwin.Fn sema_timedwait ,
342*ca6829abSJohn Baldwinany of the
343*ca6829abSJohn Baldwin.Fn cv_wait
344*ca6829abSJohn Baldwinfunctions,
345*ca6829abSJohn Baldwinand any of the
346*ca6829abSJohn Baldwin.Fn sleep
347*ca6829abSJohn Baldwinfunctions.
348*ca6829abSJohn Baldwin.Bl -column ".Ic xxxxxxxxxxxxxxxx" ".Xr XXXXXXXXX" ".Xr XXXXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXXXXX" ".Xr XXXXXX" -offset 3n
349*ca6829abSJohn Baldwin.It Em "       You want:" Ta spin mtx Ta mutex/rw Ta rmlock Ta sleep rm Ta sx/lk Ta sleep
350*ca6829abSJohn Baldwin.It Em "You have:     " Ta -------- Ta -------- Ta ------ Ta -------- Ta ------ Ta ------
351*ca6829abSJohn Baldwin.It spin mtx  Ta \&ok Ta \&no Ta \&no Ta \&no Ta \&no Ta \&no-1
352*ca6829abSJohn Baldwin.It mutex/rw  Ta \&ok Ta \&ok Ta \&ok Ta \&no Ta \&no Ta \&no-1
353*ca6829abSJohn Baldwin.It rmlock    Ta \&ok Ta \&ok Ta \&ok Ta \&no Ta \&no Ta \&no-1
354*ca6829abSJohn Baldwin.It sleep rm  Ta \&ok Ta \&ok Ta \&ok Ta \&ok-2 Ta \&ok-2 Ta \&ok-2/3
355*ca6829abSJohn Baldwin.It sx        Ta \&ok Ta \&ok Ta \&ok Ta \&ok Ta \&ok Ta \&ok-3
356*ca6829abSJohn Baldwin.It lockmgr   Ta \&ok Ta \&ok Ta \&ok Ta \&ok Ta \&ok Ta \&ok
3570929bf8eSJulian Elischer.El
3580929bf8eSJulian Elischer.Pp
3590929bf8eSJulian Elischer.Em *1
360*ca6829abSJohn BaldwinThere are calls that atomically release this primitive when going to sleep
361*ca6829abSJohn Baldwinand reacquire it on wakeup
362*ca6829abSJohn Baldwin.Po
363*ca6829abSJohn Baldwin.Fn mtx_sleep ,
364*ca6829abSJohn Baldwin.Fn rw_sleep ,
365*ca6829abSJohn Baldwin.Fn msleep_spin ,
366*ca6829abSJohn Baldwinetc.
367*ca6829abSJohn Baldwin.Pc .
3680929bf8eSJulian Elischer.Pp
3690929bf8eSJulian Elischer.Em *2
370*ca6829abSJohn BaldwinThese cases are only allowed while holding a write lock on a sleepable
371*ca6829abSJohn Baldwinread-mostly lock.
3720929bf8eSJulian Elischer.Pp
3730929bf8eSJulian Elischer.Em *3
374*ca6829abSJohn BaldwinThough one can sleep while holding this lock,
375*ca6829abSJohn Baldwinone can also use a
376*ca6829abSJohn Baldwin.Fn sleep
377*ca6829abSJohn Baldwinfunction to atomically release this primitive when going to sleep and
3784ff78a9cSJulian Elischerreacquire it on wakeup.
37936058c09SMax Laier.Pp
380*ca6829abSJohn BaldwinNote that non-blocking try operations on locks are always permitted.
381561205dfSEdward Tomasz Napierala.Ss Context mode table
3824ff78a9cSJulian ElischerThe next table shows what can be used in different contexts.
3834ff78a9cSJulian ElischerAt this time this is a rather easy to remember table.
384*ca6829abSJohn Baldwin.Bl -column ".Ic Xxxxxxxxxxxxxxxxxxx" ".Xr XXXXXXXXX" ".Xr XXXXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXXXXX" ".Xr XXXXXX" -offset 3n
385*ca6829abSJohn Baldwin.It Em "Context:"  Ta spin mtx Ta mutex/rw Ta rmlock Ta sleep rm Ta sx/lk Ta sleep
386ddcd2bc9SEdward Tomasz Napierala.It interrupt filter:  Ta \&ok Ta \&no Ta \&no Ta \&no Ta \&no Ta \&no
387*ca6829abSJohn Baldwin.It interrupt thread:  Ta \&ok Ta \&ok Ta \&ok Ta \&no Ta \&no Ta \&no
388*ca6829abSJohn Baldwin.It callout:    Ta \&ok Ta \&ok Ta \&ok Ta \&no Ta \&no Ta \&no
389*ca6829abSJohn Baldwin.It system call:    Ta \&ok Ta \&ok Ta \&ok Ta \&ok Ta \&ok Ta \&ok
390c2c54c3dSJulian Elischer.El
3910929bf8eSJulian Elischer.Sh SEE ALSO
39288238a08SEdward Tomasz Napierala.Xr witness 4 ,
3930929bf8eSJulian Elischer.Xr condvar 9 ,
3943111fc98SChristian Brueffer.Xr lock 9 ,
3950929bf8eSJulian Elischer.Xr mtx_pool 9 ,
39620f16ca0SJulian Elischer.Xr mutex 9 ,
397f53d15feSStephan Uphoff.Xr rmlock 9 ,
3980929bf8eSJulian Elischer.Xr rwlock 9 ,
3990929bf8eSJulian Elischer.Xr sema 9 ,
4000929bf8eSJulian Elischer.Xr sleep 9 ,
4013111fc98SChristian Brueffer.Xr sx 9 ,
4028de599ecSEdward Tomasz Napierala.Xr BUS_SETUP_INTR 9 ,
403815e4772SEdward Tomasz Napierala.Xr LOCK_PROFILING 9
4040929bf8eSJulian Elischer.Sh HISTORY
4050929bf8eSJulian ElischerThese
4060929bf8eSJulian Elischerfunctions appeared in
4070929bf8eSJulian Elischer.Bsx 4.1
4080929bf8eSJulian Elischerthrough
40973bbeaa5SGlen Barber.Fx 7.0 .
410815e4772SEdward Tomasz Napierala.Sh BUGS
411815e4772SEdward Tomasz NapieralaThere are too many locking primitives to choose from.
412