xref: /freebsd/share/man/man9/lock.9 (revision 7cc42f6d25ef2e19059d088fa7d4853fe9afefb5)
1.\"
2.\" Copyright (C) 2002 Chad David <davidc@acns.ab.ca>. All rights reserved.
3.\"
4.\" Redistribution and use in source and binary forms, with or without
5.\" modification, are permitted provided that the following conditions
6.\" are met:
7.\" 1. Redistributions of source code must retain the above copyright
8.\"    notice(s), this list of conditions and the following disclaimer as
9.\"    the first lines of this file unmodified other than the possible
10.\"    addition of one or more copyright notices.
11.\" 2. Redistributions in binary form must reproduce the above copyright
12.\"    notice(s), this list of conditions and the following disclaimer in the
13.\"    documentation and/or other materials provided with the distribution.
14.\"
15.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY
16.\" EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18.\" DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
19.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22.\" CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
25.\" DAMAGE.
26.\"
27.\" $FreeBSD$
28.\"
29.Dd November 17, 2017
30.Dt LOCK 9
31.Os
32.Sh NAME
33.Nm lockinit ,
34.Nm lockdestroy ,
35.Nm lockmgr ,
36.Nm lockmgr_args ,
37.Nm lockmgr_args_rw ,
38.Nm lockmgr_disown ,
39.Nm lockmgr_printinfo ,
40.Nm lockmgr_recursed ,
41.Nm lockmgr_rw ,
42.Nm lockstatus ,
43.Nm lockmgr_assert
44.Nd "lockmgr family of functions"
45.Sh SYNOPSIS
46.In sys/types.h
47.In sys/lock.h
48.In sys/lockmgr.h
49.Ft void
50.Fn lockinit "struct lock *lkp" "int prio" "const char *wmesg" "int timo" "int flags"
51.Ft void
52.Fn lockdestroy "struct lock *lkp"
53.Ft int
54.Fn lockmgr "struct lock *lkp" "u_int flags" "struct mtx *ilk"
55.Ft int
56.Fn lockmgr_args "struct lock *lkp" "u_int flags" "struct mtx *ilk" "const char *wmesg" "int prio" "int timo"
57.Ft int
58.Fn lockmgr_args_rw "struct lock *lkp" "u_int flags" "struct rwlock *ilk" "const char *wmesg" "int prio" "int timo"
59.Ft void
60.Fn lockmgr_disown "struct lock *lkp"
61.Ft void
62.Fn lockmgr_printinfo "const struct lock *lkp"
63.Ft int
64.Fn lockmgr_recursed "const struct lock *lkp"
65.Ft int
66.Fn lockmgr_rw "struct lock *lkp" "u_int flags" "struct rwlock *ilk"
67.Ft int
68.Fn lockstatus "const struct lock *lkp"
69.Pp
70.Cd "options INVARIANTS"
71.Cd "options INVARIANT_SUPPORT"
72.Ft void
73.Fn lockmgr_assert "const struct lock *lkp" "int what"
74.Sh DESCRIPTION
75The
76.Fn lockinit
77function is used to initialize a lock.
78It must be called before any operation can be performed on a lock.
79Its arguments are:
80.Bl -tag -width ".Fa wmesg"
81.It Fa lkp
82A pointer to the lock to initialize.
83.It Fa prio
84The priority passed to
85.Xr sleep 9 .
86.It Fa wmesg
87The lock message.
88This is used for both debugging output and
89.Xr sleep 9 .
90.It Fa timo
91The timeout value passed to
92.Xr sleep 9 .
93.It Fa flags
94The flags the lock is to be initialized with:
95.Bl -tag -width ".Dv LK_CANRECURSE"
96.It Dv LK_CANRECURSE
97Allow recursive exclusive locks.
98.It Dv LK_NOPROFILE
99Disable lock profiling for this lock.
100.It Dv LK_NOSHARE
101Allow exclusive locks only.
102.It Dv LK_NOWITNESS
103Instruct
104.Xr witness 4
105to ignore this lock.
106.It Dv LK_NODUP
107.Xr witness 4
108should log messages about duplicate locks being acquired.
109.It Dv LK_QUIET
110Disable
111.Xr ktr 4
112logging for this lock.
113.It Dv LK_TIMELOCK
114Use
115.Fa timo
116during a sleep; otherwise, 0 is used.
117.El
118.El
119.Pp
120The
121.Fn lockdestroy
122function is used to destroy a lock, and while it is called in a number of
123places in the kernel, it currently does nothing.
124.Pp
125The
126.Fn lockmgr
127and
128.Fn lockmgr_rw
129functions handle general locking functionality within the kernel, including
130support for shared and exclusive locks, and recursion.
131.Fn lockmgr
132and
133.Fn lockmgr_rw
134are also able to upgrade and downgrade locks.
135.Pp
136Their arguments are:
137.Bl -tag -width ".Fa flags"
138.It Fa lkp
139A pointer to the lock to manipulate.
140.It Fa flags
141Flags indicating what action is to be taken.
142.Bl -tag -width ".Dv LK_NODDLKTREAT"
143.It Dv LK_SHARED
144Acquire a shared lock.
145If an exclusive lock is currently held,
146.Dv EDEADLK
147will be returned.
148.It Dv LK_EXCLUSIVE
149Acquire an exclusive lock.
150If an exclusive lock is already held, and
151.Dv LK_CANRECURSE
152is not set, the system will
153.Xr panic 9 .
154.It Dv LK_DOWNGRADE
155Downgrade exclusive lock to a shared lock.
156Downgrading a shared lock is not permitted.
157If an exclusive lock has been recursed, the system will
158.Xr panic 9 .
159.It Dv LK_UPGRADE
160Upgrade a shared lock to an exclusive lock.
161If this call fails, the shared lock is lost, even if the
162.Dv LK_NOWAIT
163flag is specified.
164During the upgrade, the shared lock could
165be temporarily dropped.
166Attempts to upgrade an exclusive lock will cause a
167.Xr panic 9 .
168.It Dv LK_TRYUPGRADE
169Try to upgrade a shared lock to an exclusive lock.
170The failure to upgrade does not result in the dropping
171of the shared lock ownership.
172.It Dv LK_RELEASE
173Release the lock.
174Releasing a lock that is not held can cause a
175.Xr panic 9 .
176.It Dv LK_DRAIN
177Wait for all activity on the lock to end, then mark it decommissioned.
178This is used before freeing a lock that is part of a piece of memory that is
179about to be freed.
180(As documented in
181.In sys/lockmgr.h . )
182.It Dv LK_SLEEPFAIL
183Fail if operation has slept.
184.It Dv LK_NOWAIT
185Do not allow the call to sleep.
186This can be used to test the lock.
187.It Dv LK_NOWITNESS
188Skip the
189.Xr witness 4
190checks for this instance.
191.It Dv LK_CANRECURSE
192Allow recursion on an exclusive lock.
193For every lock there must be a release.
194.It Dv LK_INTERLOCK
195Unlock the interlock (which should be locked already).
196.It Dv LK_NODDLKTREAT
197Normally,
198.Fn lockmgr
199postpones serving further shared requests for shared-locked lock if there is
200exclusive waiter, to avoid exclusive lock starvation.
201But, if the thread requesting the shared lock already owns a shared lockmgr
202lock, the request is granted even in presence of the parallel exclusive lock
203request, which is done to avoid deadlocks with recursive shared acquisition.
204.Pp
205The
206.Dv LK_NODDLKTREAT
207flag can only be used by code which requests shared non-recursive lock.
208The flag allows exclusive requests to preempt the current shared request
209even if the current thread owns shared locks.
210This is safe since shared lock is guaranteed to not recurse, and is used
211when thread is known to held unrelated shared locks, to not cause
212unnecessary starvation.
213An example is
214.Dv vp
215locking in VFS
216.Xr lookup 9 ,
217when
218.Dv dvp
219is already locked.
220.El
221.It Fa ilk
222An interlock mutex for controlling group access to the lock.
223If
224.Dv LK_INTERLOCK
225is specified,
226.Fn lockmgr
227and
228.Fn lockmgr_rw
229assume
230.Fa ilk
231is currently owned and not recursed, and will return it unlocked.
232See
233.Xr mtx_assert 9 .
234.El
235.Pp
236The
237.Fn lockmgr_args
238and
239.Fn lockmgr_args_rw
240function work like
241.Fn lockmgr
242and
243.Fn lockmgr_rw
244but accepting a
245.Fa wmesg ,
246.Fa timo
247and
248.Fa prio
249on a per-instance basis.
250The specified values will override the default
251ones, but this can still be used passing, respectively,
252.Dv LK_WMESG_DEFAULT ,
253.Dv LK_PRIO_DEFAULT
254and
255.Dv LK_TIMO_DEFAULT .
256.Pp
257The
258.Fn lockmgr_disown
259function switches the owner from the current thread to be
260.Dv LK_KERNPROC ,
261if the lock is already held.
262.Pp
263The
264.Fn lockmgr_printinfo
265function prints debugging information about the lock.
266It is used primarily by
267.Xr VOP_PRINT 9
268functions.
269.Pp
270The
271.Fn lockmgr_recursed
272function returns true if the lock is recursed, 0
273otherwise.
274.Pp
275The
276.Fn lockstatus
277function returns the status of the lock in relation to the current thread.
278.Pp
279When compiled with
280.Cd "options INVARIANTS"
281and
282.Cd "options INVARIANT_SUPPORT" ,
283the
284.Fn lockmgr_assert
285function tests
286.Fa lkp
287for the assertions specified in
288.Fa what ,
289and panics if they are not met.
290One of the following assertions must be specified:
291.Bl -tag -width ".Dv KA_UNLOCKED"
292.It Dv KA_LOCKED
293Assert that the current thread has either a shared or an exclusive lock on the
294.Vt lkp
295lock pointed to by the first argument.
296.It Dv KA_SLOCKED
297Assert that the current thread has a shared lock on the
298.Vt lkp
299lock pointed to by the first argument.
300.It Dv KA_XLOCKED
301Assert that the current thread has an exclusive lock on the
302.Vt lkp
303lock pointed to by the first argument.
304.It Dv KA_UNLOCKED
305Assert that the current thread has no lock on the
306.Vt lkp
307lock pointed to by the first argument.
308.El
309.Pp
310In addition, one of the following optional assertions can be used with
311either an
312.Dv KA_LOCKED ,
313.Dv KA_SLOCKED ,
314or
315.Dv KA_XLOCKED
316assertion:
317.Bl -tag -width ".Dv KA_NOTRECURSED"
318.It Dv KA_RECURSED
319Assert that the current thread has a recursed lock on
320.Fa lkp .
321.It Dv KA_NOTRECURSED
322Assert that the current thread does not have a recursed lock on
323.Fa lkp .
324.El
325.Sh RETURN VALUES
326The
327.Fn lockmgr
328and
329.Fn lockmgr_rw
330functions return 0 on success and non-zero on failure.
331.Pp
332The
333.Fn lockstatus
334function returns:
335.Bl -tag -width ".Dv LK_EXCLUSIVE"
336.It Dv LK_EXCLUSIVE
337An exclusive lock is held by the current thread.
338.It Dv LK_EXCLOTHER
339An exclusive lock is held by someone other than the current thread.
340.It Dv LK_SHARED
341A shared lock is held.
342.It Li 0
343The lock is not held by anyone.
344.El
345.Sh ERRORS
346.Fn lockmgr
347and
348.Fn lockmgr_rw
349fail if:
350.Bl -tag -width Er
351.It Bq Er EBUSY
352.Dv LK_FORCEUPGRADE
353was requested and another thread had already requested a lock upgrade.
354.It Bq Er EBUSY
355.Dv LK_NOWAIT
356was set, and a sleep would have been required, or
357.Dv LK_TRYUPGRADE
358operation was not able to upgrade the lock.
359.It Bq Er ENOLCK
360.Dv LK_SLEEPFAIL
361was set and
362.Fn lockmgr
363or
364.Fn lockmgr_rw
365did sleep.
366.It Bq Er EINTR
367.Dv PCATCH
368was set in the lock priority, and a signal was delivered during a sleep.
369Note the
370.Er ERESTART
371error below.
372.It Bq Er ERESTART
373.Dv PCATCH
374was set in the lock priority, a signal was delivered during a sleep,
375and the system call is to be restarted.
376.It Bq Er EWOULDBLOCK
377a non-zero timeout was given, and the timeout expired.
378.El
379.Sh LOCKS
380If
381.Dv LK_INTERLOCK
382is passed in the
383.Fa flags
384argument to
385.Fn lockmgr
386or
387.Fn lockmgr_rw ,
388the
389.Fa ilk
390must be held prior to calling
391.Fn lockmgr
392or
393.Fn lockmgr_rw ,
394and will be returned unlocked.
395.Pp
396Upgrade attempts that fail result in the loss of the lock that
397is currently held.
398Also, it is invalid to upgrade an
399exclusive lock, and a
400.Xr panic 9
401will be the result of trying.
402.Sh SEE ALSO
403.Xr condvar 9 ,
404.Xr locking 9 ,
405.Xr mtx_assert 9 ,
406.Xr mutex 9 ,
407.Xr panic 9 ,
408.Xr rwlock 9 ,
409.Xr sleep 9 ,
410.Xr sx 9 ,
411.Xr VOP_PRINT 9
412.Sh AUTHORS
413This manual page was written by
414.An Chad David Aq Mt davidc@acns.ab.ca .
415