xref: /freebsd/share/man/man9/locking.9 (revision f53d15fe1b8a7a7df972f253b38c698f6ca45b71)
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.\"
270929bf8eSJulian Elischer.Dd March 14, 2007
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 SYNOPSIS
340929bf8eSJulian ElischerAll sorts of stuff to go here.
350929bf8eSJulian Elischer.Pp
360929bf8eSJulian Elischer.Sh DESCRIPTION
370929bf8eSJulian ElischerThe
380929bf8eSJulian Elischer.Em FreeBSD
390929bf8eSJulian Elischerkernel is written to run across multiple CPUs and as such requires
404ff78a9cSJulian Elischerseveral different synchronization primitives to allow the developers
410929bf8eSJulian Elischerto safely access and manipulate the many data types required.
420929bf8eSJulian Elischer.Pp
430929bf8eSJulian ElischerThese include:
440929bf8eSJulian Elischer.Bl -enum
450929bf8eSJulian Elischer.It
460929bf8eSJulian ElischerSpin Mutexes
470929bf8eSJulian Elischer.It
480929bf8eSJulian ElischerSleep Mutexes
490929bf8eSJulian Elischer.It
500929bf8eSJulian Elischerpool Mutexes
510929bf8eSJulian Elischer.It
520929bf8eSJulian ElischerShared-Exclusive locks
530929bf8eSJulian Elischer.It
540929bf8eSJulian ElischerReader-Writer locks
550929bf8eSJulian Elischer.It
56f53d15feSStephan UphoffRead-Mostly locks
57f53d15feSStephan Uphoff.It
584ff78a9cSJulian ElischerTurnstiles
590929bf8eSJulian Elischer.It
600929bf8eSJulian ElischerSemaphores
610929bf8eSJulian Elischer.It
620929bf8eSJulian ElischerCondition variables
630929bf8eSJulian Elischer.It
640929bf8eSJulian ElischerSleep/wakeup
650929bf8eSJulian Elischer.It
660929bf8eSJulian ElischerGiant
670929bf8eSJulian Elischer.It
680929bf8eSJulian ElischerLockmanager locks
690929bf8eSJulian Elischer.El
700929bf8eSJulian Elischer.Pp
7153882c7cSJulian ElischerThe primitives interact and have a number of rules regarding how
7220f16ca0SJulian Elischerthey can and can not be combined.
7320f16ca0SJulian ElischerThere are too many for the average
744ff78a9cSJulian Elischerhuman mind and they keep changing.
754ff78a9cSJulian Elischer(if you disagree, please write replacement text)  :-)
760929bf8eSJulian Elischer.Pp
774ff78a9cSJulian ElischerSome of these primitives may be used at the low (interrupt) level and
784ff78a9cSJulian Elischersome may not.
790929bf8eSJulian Elischer.Pp
800929bf8eSJulian ElischerThere are strict ordering requirements and for some of the types this
810929bf8eSJulian Elischeris checked using the
820929bf8eSJulian Elischer.Xr witness 4
830929bf8eSJulian Elischercode.
840929bf8eSJulian Elischer.Pp
850929bf8eSJulian Elischer.Ss SPIN Mutexes
8653882c7cSJulian ElischerMutexes are the basic primitive.
870929bf8eSJulian ElischerYou either hold it or you don't.
884ff78a9cSJulian ElischerIf you don't own it then you just spin, waiting for the holder (on
894ff78a9cSJulian Elischeranother CPU) to release it.
904ff78a9cSJulian ElischerHopefully they are doing something fast.
9120f16ca0SJulian ElischerYou
9220f16ca0SJulian Elischer.Em must not
9320f16ca0SJulian Elischerdo anything that deschedules the thread while you
944ff78a9cSJulian Elischerare holding a SPIN mutex.
9520f16ca0SJulian Elischer.Ss Mutexes
9620f16ca0SJulian ElischerBasically (regular) mutexes will deschedule the thread if the
974ff78a9cSJulian Elischermutex can not be acquired.
9820f16ca0SJulian ElischerA non-spin mutex can be considered to be equivalent
9920f16ca0SJulian Elischerto getting a write lock on an
10020f16ca0SJulian Elischer.Em rw_lock
10120f16ca0SJulian Elischer(see below), and in fact non-spin mutexes and rw_locks may soon become the same thing.
1024ff78a9cSJulian ElischerAs in spin mutexes, you either get it or you don't.
10320f16ca0SJulian ElischerYou may only call the
1040929bf8eSJulian Elischer.Xr sleep 9
10520f16ca0SJulian Elischercall via
1060929bf8eSJulian Elischer.Fn msleep
1070929bf8eSJulian Elischeror the new
1080929bf8eSJulian Elischer.Fn mtx_sleep
10920f16ca0SJulian Elischervariant.
11020f16ca0SJulian ElischerThese will atomically drop the mutex and reacquire it
1110929bf8eSJulian Elischeras part of waking up.
11220f16ca0SJulian ElischerThis is often however a
11320f16ca0SJulian Elischer.Em BAD
11420f16ca0SJulian Elischeridea because it generally relies on you having
11520f16ca0SJulian Elischersuch a good knowledge of all the call graph above you
11620f16ca0SJulian Elischerand what assumptions it is making that there are a lot
11720f16ca0SJulian Elischerof ways to make hard-to-find mistakes.
11820f16ca0SJulian ElischerFor example you MUST re-test all the assumptions you made before,
11920f16ca0SJulian Elischerall the way up the call graph to where you got the lock.
12020f16ca0SJulian ElischerYou can not just assume that mtx_sleep can be inserted anywhere.
12120f16ca0SJulian ElischerIf any caller above you has any mutex or
12220f16ca0SJulian Elischerrwlock, your sleep, will cause a panic.
12320f16ca0SJulian ElischerIf the sleep only happens rarely it may be years before the
12420f16ca0SJulian Elischerbad code path is found.
1250929bf8eSJulian Elischer.Ss Pool Mutexes
12620f16ca0SJulian ElischerA variant of regular mutexes where the allocation of the mutex is handled
1274ff78a9cSJulian Elischermore by the system.
1280929bf8eSJulian Elischer.Ss Rw_locks
1290929bf8eSJulian ElischerReader/writer locks allow shared access to protected data by multiple threads,
1300929bf8eSJulian Elischeror exclusive access by a single thread.
1310929bf8eSJulian ElischerThe threads with shared access are known as
1320929bf8eSJulian Elischer.Em readers
13320f16ca0SJulian Elischersince they should only read the protected data.
1340929bf8eSJulian ElischerA thread with exclusive access is known as a
1350929bf8eSJulian Elischer.Em writer
13620f16ca0SJulian Elischersince it may modify protected data.
1370929bf8eSJulian Elischer.Pp
1380929bf8eSJulian ElischerAlthough reader/writer locks look very similar to
1390929bf8eSJulian Elischer.Xr sx 9
14020f16ca0SJulian Elischer(see below) locks, their usage pattern is different.
14120f16ca0SJulian ElischerReader/writer locks can be treated as mutexes (see above and
1420929bf8eSJulian Elischer.Xr mutex 9 )
1430929bf8eSJulian Elischerwith shared/exclusive semantics.
14420f16ca0SJulian ElischerMore specifically, regular mutexes can be
14520f16ca0SJulian Elischerconsidered to be equivalent to a write-lock on an
14620f16ca0SJulian Elischer.Em rw_lock.
14720f16ca0SJulian ElischerIn the future this may in fact
14820f16ca0SJulian Elischerbecome literally the fact.
14920f16ca0SJulian ElischerAn
1500929bf8eSJulian Elischer.Em rw_lock
15120f16ca0SJulian Elischercan be locked while holding a regular mutex, but
15220f16ca0SJulian Elischercan
15320f16ca0SJulian Elischer.Em not
15420f16ca0SJulian Elischerbe held while sleeping.
1550929bf8eSJulian ElischerThe
1560929bf8eSJulian Elischer.Em rw_lock
1570929bf8eSJulian Elischerlocks have priority propagation like mutexes, but priority
1580929bf8eSJulian Elischercan be propagated only to an exclusive holder.
1590929bf8eSJulian ElischerThis limitation comes from the fact that shared owners
1600929bf8eSJulian Elischerare anonymous.
1610929bf8eSJulian ElischerAnother important property is that shared holders of
1620929bf8eSJulian Elischer.Em rw_lock
16320f16ca0SJulian Elischercan recurse, but exclusive locks are not allowed to recurse.
16420f16ca0SJulian ElischerThis ability should not be used lightly and
16520f16ca0SJulian Elischer.Em may go away.
16620f16ca0SJulian ElischerUsers of recursion in any locks should be prepared to
16720f16ca0SJulian Elischerdefend their decision against vigorous criticism.
168f53d15feSStephan Uphoff.Ss Rm_locks
169f53d15feSStephan UphoffMostly reader locks are similar to
170f53d15feSStephan Uphoff.Em Reader/write
171f53d15feSStephan Uphofflocks but optimized for very infrequent
172f53d15feSStephan Uphoff.Em writer
173f53d15feSStephan Uphofflocking.
174f53d15feSStephan Uphoff.Em rm_lock
175f53d15feSStephan Uphofflocks implement full priority propagation by tracking shared owners
176f53d15feSStephan Uphoffusing a lock user supplied
177f53d15feSStephan Uphoff.Em tracker
178f53d15feSStephan Uphoffdata structure.
17920f16ca0SJulian Elischer.Ss Sx_locks
18020f16ca0SJulian ElischerShared/exclusive locks are used to protect data that are read far more often
18120f16ca0SJulian Elischerthan they are written.
18220f16ca0SJulian ElischerMutexes are inherently more efficient than shared/exclusive locks, so
18320f16ca0SJulian Elischershared/exclusive locks should be used prudently.
18420f16ca0SJulian ElischerThe main reason for using an
18520f16ca0SJulian Elischer.Em sx_lock
18620f16ca0SJulian Elischeris that a thread may hold a shared or exclusive lock on an
18720f16ca0SJulian Elischer.Em sx_lock
18820f16ca0SJulian Elischerlock while sleeping.
18920f16ca0SJulian ElischerAs a consequence of this however, an
19020f16ca0SJulian Elischer.Em sx_lock
19120f16ca0SJulian Elischerlock may not be acquired while holding a mutex.
19220f16ca0SJulian ElischerThe reason for this is that, if one thread slept while holding an
19320f16ca0SJulian Elischer.Em sx_lock
19420f16ca0SJulian Elischerlock while another thread blocked on the same
19520f16ca0SJulian Elischer.Em sx_lock
19620f16ca0SJulian Elischerlock after acquiring a mutex, then the second thread would effectively
19720f16ca0SJulian Elischerend up sleeping while holding a mutex, which is not allowed.
19820f16ca0SJulian ElischerThe
19920f16ca0SJulian Elischer.Em sx_lock
20020f16ca0SJulian Elischershould be considered to be closely related to
20120f16ca0SJulian Elischer.Xr sleep 9 .
20220f16ca0SJulian ElischerIn fact it could in some cases be
20320f16ca0SJulian Elischerconsidered a conditional sleep.
20453882c7cSJulian Elischer.Ss Turnstiles
2050929bf8eSJulian ElischerTurnstiles are used to hold a queue of threads blocked on
2064ff78a9cSJulian Elischernon-sleepable locks.
2074ff78a9cSJulian ElischerSleepable locks use condition variables to implement their queues.
2084ff78a9cSJulian ElischerTurnstiles differ from a sleep queue in that turnstile queue's
2094ff78a9cSJulian Elischerare assigned to a lock held by an owning thread.
2104ff78a9cSJulian ElischerThus, when one thread is enqueued onto a turnstile, it can lend its
2114ff78a9cSJulian Elischerpriority to the owning thread.
21220f16ca0SJulian ElischerIf this sounds confusing, we need to describe it better.
2130929bf8eSJulian Elischer.Ss Semaphores
2140929bf8eSJulian Elischer.Ss Condition variables
2154ff78a9cSJulian ElischerCondition variables are used in conjunction with mutexes to wait for
2164ff78a9cSJulian Elischerconditions to occur.
2170929bf8eSJulian ElischerA thread must hold the mutex before calling the
2180929bf8eSJulian Elischer.Fn cv_wait* ,
2190929bf8eSJulian Elischerfunctions.
2200929bf8eSJulian ElischerWhen a thread waits on a condition, the mutex
2210929bf8eSJulian Elischeris atomically released before the thread is blocked, then reacquired
2220929bf8eSJulian Elischerbefore the function call returns.
2230929bf8eSJulian Elischer.Ss Giant
2240929bf8eSJulian ElischerGiant is a special instance of a sleep lock.
225fbe508ffSWarner LoshIt has several special characteristics.
226fbe508ffSWarner Losh.Bl -enum
227fbe508ffSWarner Losh.It
228fbe508ffSWarner LoshIt is recursive.
229fbe508ffSWarner Losh.It
230fbe508ffSWarner LoshDrivers can request that Giant be locked around them, but this is
231fbe508ffSWarner Loshgoing away.
232fbe508ffSWarner Losh.It
233fbe508ffSWarner LoshYou can sleep while it has recursed, but other recursive locks cannot.
234fbe508ffSWarner Losh.It
23520f16ca0SJulian ElischerGiant must be locked first before other locks.
236fbe508ffSWarner Losh.It
237fbe508ffSWarner LoshThere are places in the kernel that drop Giant and pick it back up
238fbe508ffSWarner Loshagain.
239fbe508ffSWarner LoshSleep locks will do this before sleeping.
240fbe508ffSWarner LoshParts of the Network or VM code may do this as well, depending on the
241fbe508ffSWarner Loshsetting of a sysctl.
242fbe508ffSWarner LoshThis means that you cannot count on Giant keeping other code from
243fbe508ffSWarner Loshrunning if your code sleeps, even if you want it to.
244fbe508ffSWarner Losh.El
2450929bf8eSJulian Elischer.Ss Sleep/wakeup
2460929bf8eSJulian ElischerThe functions
2470929bf8eSJulian Elischer.Fn tsleep ,
2480929bf8eSJulian Elischer.Fn msleep ,
2490929bf8eSJulian Elischer.Fn msleep_spin ,
2500929bf8eSJulian Elischer.Fn pause ,
2510929bf8eSJulian Elischer.Fn wakeup ,
2520929bf8eSJulian Elischerand
2530929bf8eSJulian Elischer.Fn wakeup_one
2540929bf8eSJulian Elischerhandle event-based thread blocking.
2554ff78a9cSJulian ElischerIf a thread must wait for an external event, it is put to sleep by
2560929bf8eSJulian Elischer.Fn tsleep ,
2570929bf8eSJulian Elischer.Fn msleep ,
2580929bf8eSJulian Elischer.Fn msleep_spin ,
2590929bf8eSJulian Elischeror
2600929bf8eSJulian Elischer.Fn pause .
2610929bf8eSJulian ElischerThreads may also wait using one of the locking primitive sleep routines
2620929bf8eSJulian Elischer.Xr mtx_sleep 9 ,
2630929bf8eSJulian Elischer.Xr rw_sleep 9 ,
2640929bf8eSJulian Elischeror
2650929bf8eSJulian Elischer.Xr sx_sleep 9 .
2660929bf8eSJulian Elischer.Pp
2670929bf8eSJulian ElischerThe parameter
2680929bf8eSJulian Elischer.Fa chan
2690929bf8eSJulian Elischeris an arbitrary address that uniquely identifies the event on which
2700929bf8eSJulian Elischerthe thread is being put to sleep.
2710929bf8eSJulian ElischerAll threads sleeping on a single
2720929bf8eSJulian Elischer.Fa chan
2730929bf8eSJulian Elischerare woken up later by
2740929bf8eSJulian Elischer.Fn wakeup ,
2750929bf8eSJulian Elischeroften called from inside an interrupt routine, to indicate that the
2760929bf8eSJulian Elischerresource the thread was blocking on is available now.
2770929bf8eSJulian Elischer.Pp
2780929bf8eSJulian ElischerSeveral of the sleep functions including
2790929bf8eSJulian Elischer.Fn msleep ,
2800929bf8eSJulian Elischer.Fn msleep_spin ,
2810929bf8eSJulian Elischerand the locking primitive sleep routines specify an additional lock
2820929bf8eSJulian Elischerparameter.
2830929bf8eSJulian ElischerThe lock will be released before sleeping and reacquired
2840929bf8eSJulian Elischerbefore the sleep routine returns.
2850929bf8eSJulian ElischerIf
2860929bf8eSJulian Elischer.Fa priority
2870929bf8eSJulian Elischerincludes the
2880929bf8eSJulian Elischer.Dv PDROP
2894ff78a9cSJulian Elischerflag, then the lock will not be reacquired before returning.
2900929bf8eSJulian ElischerThe lock is used to ensure that a condition can be checked atomically,
2910929bf8eSJulian Elischerand that the current thread can be suspended without missing a
2920929bf8eSJulian Elischerchange to the condition, or an associated wakeup.
2930929bf8eSJulian ElischerIn addition, all of the sleep routines will fully drop the
2940929bf8eSJulian Elischer.Va Giant
2950929bf8eSJulian Elischermutex
2960929bf8eSJulian Elischer(even if recursed)
2970929bf8eSJulian Elischerwhile the thread is suspended and will reacquire the
2980929bf8eSJulian Elischer.Va Giant
2990929bf8eSJulian Elischermutex before the function returns.
3000929bf8eSJulian Elischer.Pp
3010929bf8eSJulian Elischer.Ss lockmanager locks
30220f16ca0SJulian ElischerLargely deprecated.
30320f16ca0SJulian ElischerSee the
3040929bf8eSJulian Elischer.Xr lock 9
3050929bf8eSJulian Elischerpage for more information.
3060929bf8eSJulian ElischerI don't know what the downsides are but I'm sure someone will fill in this part.
307c2c54c3dSJulian Elischer.Sh Usage tables.
308c2c54c3dSJulian Elischer.Ss Interaction table.
3090929bf8eSJulian ElischerThe following table shows what you can and can not do if you hold
310f9d63aecSXin LIone of the synchronization primitives discussed here:
3110929bf8eSJulian Elischer(someone who knows what they are talking about should write this table)
3120929bf8eSJulian Elischer.Bl -column ".Ic xxxxxxxxxxxxxxxxxxxx" ".Xr XXXXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXXX" ".Xr XXXXX" -offset indent
3130929bf8eSJulian Elischer.It Xo
314f53d15feSStephan Uphoff.Em "You have: You want:" Ta Spin_mtx Ta Slp_mtx Ta sx_lock Ta rw_lock Ta rm_lock Ta sleep
3150929bf8eSJulian Elischer.Xc
316f53d15feSStephan Uphoff.It Ic SPIN mutex  Ta \&ok-1 Ta \&no Ta \&no Ta \&no Ta \&no Ta \&no-3
317f53d15feSStephan Uphoff.It Ic Sleep mutex Ta \&ok Ta \&ok-1 Ta \&no Ta \&ok Ta \&ok Ta \&no-3
318f53d15feSStephan Uphoff.It Ic sx_lock     Ta \&ok Ta \&ok Ta \&ok-2 Ta \&ok Ta \&ok Ta \&ok-4
319f53d15feSStephan Uphoff.It Ic rw_lock     Ta \&ok Ta \&ok Ta \&no Ta \&ok-2 Ta \&ok Ta \&no-3
320f53d15feSStephan Uphoff.It Ic rm_lock     Ta \&ok Ta \&ok Ta \&no Ta \&ok Ta \&ok-2 Ta \&no
3210929bf8eSJulian Elischer.El
3220929bf8eSJulian Elischer.Pp
3230929bf8eSJulian Elischer.Em *1
32420f16ca0SJulian ElischerRecursion is defined per lock.
32520f16ca0SJulian ElischerLock order is important.
3260929bf8eSJulian Elischer.Pp
3270929bf8eSJulian Elischer.Em *2
32820f16ca0SJulian Elischerreaders can recurse though writers can not.
32920f16ca0SJulian ElischerLock order is important.
3300929bf8eSJulian Elischer.Pp
3310929bf8eSJulian Elischer.Em *3
3324ff78a9cSJulian ElischerThere are calls atomically release this primitive when going to sleep
3330929bf8eSJulian Elischerand reacquire it on wakeup (e.g.
3340929bf8eSJulian Elischer.Fn mtx_sleep ,
33534e1b9e5SJulian Elischer.Fn rw_sleep
3360929bf8eSJulian Elischerand
337f9d63aecSXin LI.Fn msleep_spin
338f9d63aecSXin LI).
3390929bf8eSJulian Elischer.Pp
3400929bf8eSJulian Elischer.Em *4
34134e1b9e5SJulian ElischerThough one can sleep holding an sx lock, one can also use
3420929bf8eSJulian Elischer.Fn sx_sleep
3434ff78a9cSJulian Elischerwhich atomically release this primitive when going to sleep and
3444ff78a9cSJulian Elischerreacquire it on wakeup.
345c2c54c3dSJulian Elischer.Ss Context mode table.
3464ff78a9cSJulian ElischerThe next table shows what can be used in different contexts.
3474ff78a9cSJulian ElischerAt this time this is a rather easy to remember table.
348c2c54c3dSJulian Elischer.Bl -column ".Ic Xxxxxxxxxxxxxxxxxxxx" ".Xr XXXXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXXX" ".Xr XXXXX" -offset indent
349c2c54c3dSJulian Elischer.It Xo
350f53d15feSStephan Uphoff.Em "Context:" Ta Spin_mtx Ta Slp_mtx Ta sx_lock Ta rw_lock Ta rm_lock Ta sleep
351c2c54c3dSJulian Elischer.Xc
352f53d15feSStephan Uphoff.It interrupt:  Ta \&ok Ta \&no Ta \&no Ta \&no Ta \&no Ta \&no
353f53d15feSStephan Uphoff.It idle:  Ta \&ok Ta \&no Ta \&no Ta \&no Ta \&no Ta \&no
354c2c54c3dSJulian Elischer.El
3550929bf8eSJulian Elischer.Sh SEE ALSO
3560929bf8eSJulian Elischer.Xr condvar 9 ,
3573111fc98SChristian Brueffer.Xr lock 9 ,
3580929bf8eSJulian Elischer.Xr mtx_pool 9 ,
35920f16ca0SJulian Elischer.Xr mutex 9 ,
360f53d15feSStephan Uphoff.Xr rmlock 9 ,
3610929bf8eSJulian Elischer.Xr rwlock 9 ,
3620929bf8eSJulian Elischer.Xr sema 9 ,
3630929bf8eSJulian Elischer.Xr sleep 9 ,
3643111fc98SChristian Brueffer.Xr sx 9 ,
3650929bf8eSJulian Elischer.Xr LOCK_PROFILING 9 ,
3663111fc98SChristian Brueffer.Xr WITNESS 9
3670929bf8eSJulian Elischer.Sh HISTORY
3680929bf8eSJulian ElischerThese
3690929bf8eSJulian Elischerfunctions appeared in
3700929bf8eSJulian Elischer.Bsx 4.1
3710929bf8eSJulian Elischerthrough
3720929bf8eSJulian Elischer.Fx 7.0
373