8322 nl: misleading-indentation
[unleashed/tickless.git] / usr / src / man / man9f / mutex.9f
blob78c34e4b3f153cd2789b9fdb86d9473fe1f3fa8e
1 '\" te
2 .\"  Copyright (c) 2008 Sun Microsystems, Inc., All Rights Reserved.
3 .\" The contents of this file are subject to the terms of the Common Development and Distribution License (the "License").  You may not use this file except in compliance with the License. You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing.
4 .\"  See the License for the specific language governing permissions and limitations under the License. When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE.  If applicable, add the following below this CDDL HEADER, with
5 .\" the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
6 .TH MUTEX 9F "May 21, 2008"
7 .SH NAME
8 mutex, mutex_enter, mutex_exit, mutex_init, mutex_destroy, mutex_owned,
9 mutex_tryenter \- mutual exclusion lock routines
10 .SH SYNOPSIS
11 .LP
12 .nf
13 #include <sys/ksynch.h>
15 \fBvoid\fR \fBmutex_init\fR(\fBkmutex_t *\fR\fImp\fR, \fBchar *\fR\fIname\fR, \fBkmutex_type_t\fR \fItype\fR,
16      \fBvoid *\fR\fIarg\fR);
17 .fi
19 .LP
20 .nf
21 \fBvoid\fR \fBmutex_destroy\fR(\fBkmutex_t *\fR\fImp\fR);
22 .fi
24 .LP
25 .nf
26 \fBvoid\fR \fBmutex_enter\fR(\fBkmutex_t *\fR\fImp\fR);
27 .fi
29 .LP
30 .nf
31 \fBvoid\fR \fBmutex_exit\fR(\fBkmutex_t *\fR\fImp\fR);
32 .fi
34 .LP
35 .nf
36 \fBint\fR \fBmutex_owned\fR(\fBkmutex_t *\fR\fImp\fR);
37 .fi
39 .LP
40 .nf
41 \fBint\fR \fBmutex_tryenter\fR(\fBkmutex_t *\fR\fImp\fR);
42 .fi
44 .SH INTERFACE LEVEL
45 .sp
46 .LP
47 Solaris DDI specific (Solaris DDI).
48 .SH PARAMETERS
49 .sp
50 .ne 2
51 .na
52 \fB\fImp\fR\fR
53 .ad
54 .RS 8n
55 Pointer to a kernel mutex lock (\fBkmutex_t\fR).
56 .RE
58 .sp
59 .ne 2
60 .na
61 \fB\fIname\fR\fR
62 .ad
63 .RS 8n
64 Descriptive string. This is obsolete and should be \fINULL\fR. (Non-\fINULL\fR
65 strings are legal, but they are a waste of kernel memory.)
66 .RE
68 .sp
69 .ne 2
70 .na
71 \fB\fItype\fR\fR
72 .ad
73 .RS 8n
74 Type of mutex lock.
75 .RE
77 .sp
78 .ne 2
79 .na
80 \fB\fIarg\fR\fR
81 .ad
82 .RS 8n
83 Type-specific argument for initialization routine.
84 .RE
86 .SH DESCRIPTION
87 .sp
88 .LP
89 A mutex enforces a policy of mutual exclusion. Only one thread at a time may
90 hold a particular mutex. Threads trying to lock a held mutex will block until
91 the mutex is unlocked.
92 .sp
93 .LP
94 Mutexes are strictly bracketing and may not be recursively locked, meaning that
95 mutexes should be exited in the opposite order they were entered, and cannot be
96 reentered before exiting.
97 .sp
98 .LP
99 \fBmutex_init()\fR initializes a mutex. It is an error to initialize a mutex
100 more than once. The \fItype\fR argument should be set to \fBMUTEX_DRIVER\fR.
103 \fIarg\fR provides type-specific information for a given variant type of mutex.
104 When \fBmutex_init()\fR is called for driver mutexes, if the mutex is used by
105 the interrupt handler, the \fIarg\fR should be the interrupt priority returned
106 from \fBddi_intr_get_pri\fR(9F) or \fBddi_intr_get_softint_pri\fR(9F). Note
107 that \fIarg\fR should be the value of the interrupt priority cast by calling
108 the \fBDDI_INTR_PRI\fR macro. If the mutex is never used inside an interrupt
109 handler, the argument should be \fINULL\fR.
112 \fBmutex_enter()\fR is used to acquire a mutex. If the mutex is already held,
113 then the caller blocks. After returning, the calling thread is the owner of the
114 mutex. If the mutex is already held by the calling thread, a panic ensues.
117 \fBmutex_owned()\fR should only be used in \fBASSERT()\fR and may be enforced
118 by not being defined unless the preprocessor symbol \fBDEBUG\fR is defined. Its
119 return value is non-zero if the current thread (or, if that cannot be
120 determined, at least some thread) holds the mutex pointed to by \fImp\fR.
123 \fBmutex_tryenter()\fR is very similar to \fBmutex_enter()\fR except that it
124 doesn't block when the mutex is already held. \fBmutex_tryenter()\fR returns
125 non-zero when it acquired the mutex and 0 when the mutex is already held.
128 \fBmutex_exit()\fR releases a mutex and will unblock another thread if any are
129 blocked on the mutex.
132 \fBmutex_destroy()\fR releases any resources that might have been allocated by
133 \fBmutex_init()\fR. \fBmutex_destroy()\fR must be called before freeing the
134 memory containing the mutex, and should be called with the mutex unheld (not
135 owned by any thread). The caller must be sure that no other thread attempts to
136 use the mutex.
137 .SH RETURN VALUES
140 \fBmutex_tryenter()\fR returns a non-zero value on success and zero on failure.
143 \fBmutex_owned()\fR returns a non-zero value if the calling thread currently
144 holds the mutex pointed to by \fImp\fR, or when that cannot be determined, if
145 any thread holds the mutex. Otherwise \fBmutex_owned()\fR returns zero.
146 .SH CONTEXT
149 These functions can be called from user, kernel, or high-level interrupt
150 context, except for \fBmutex_init()\fR and \fBmutex_destroy()\fR, which can be
151 called from user or kernel context only.
152 .SH EXAMPLES
154 \fBExample 1 \fRInitializing a Mutex
157 A driver might do this to initialize a mutex that is part of its unit structure
158 and used in its interrupt routine:
161 .in +2
163 ddi_intr_get_pri(hdlp, &pri);
164 mutex_init(&un->un_lock, NULL, MUTEX_DRIVER, DDI_INTR_PRI(pri));
165 ddi_intr_add_handler(hdlp, xxintr, (caddr_t)un, NULL);
167 .in -2
170 \fBExample 2 \fRCalling a Routine with a Lock
173 A routine that expects to be called with a certain lock held might have the
174 following ASSERT:
177 .in +2
179 xxstart(struct xxunit *un)
181               ASSERT(mutex_owned(&un->un_lock));
182 \&...
184 .in -2
186 .SH SEE ALSO
189 \fBlockstat\fR(1M), \fBIntro\fR(9F), \fBcondvar\fR(9F),
190 \fBddi_intr_alloc\fR(9F), \fBddi_intr_add_handler\fR(9F),
191 \fBddi_intr_get_pri\fR(9F), \fBddi_intr_get_softint_pri\fR(9F),
192 \fBrwlock\fR(9F), \fBsemaphore\fR(9F)
195 \fIWriting Device Drivers\fR
196 .SH NOTES
199 Compiling with \fB_LOCKTEST\fR or \fB_MPSTATS\fR defined has no effect. To
200 gather lock statistics, see \fBlockstat\fR(1M).
203 The address of a \fBkmutex_t\fR lock must be aligned on an 8-byte boundary for
204 64-bit kernels, or a 4-byte boundary for 32-bit kernels. Violation of this
205 requirement will result in undefined behavior, including, but not limited to,
206 failure of mutual exclusion or a system panic.
209 To write scalable, responsive drivers that do not hang, panic or deadlock the
210 system, follow these guidelines:
212 .in +2
213 Never return from a driver entry point with a mutex held.
214 .in -2
216 .in +2
217 Never hold a mutex when calling a service that may block, for example
218 \fBkmem_alloc\fR(9F) with KM_SLEEP or \fBdelay\fR(9F).
219 .in -2
221 .in +2
222 Always acquire mutexes in a consistent order. If a critical section acquires
223 mutex A followed by B, and elsewhere in the driver mutex B is acquired before
224 A, the driver can deadlock with one thread holding A and waiting for B and
225 another thread holding B while waiting for A.
226 .in -2
228 .in +2
229 Always use a mutex to enforce exclusive access to data, not instruction paths.
230 .in -2
232 .in +2
233 Acquiring a lock in user context that is also acquired in interrupt context
234 means that, as long as that lock is held, the driver instance holding the lock
235 is subject to all the rules and limitations of interrupt context.
236 .in -2
238 .in +2
239 In most cases, a mutex can and should be acquired and released within the same
240 function.
241 .in -2
243 .in +2
244 Liberal use of debugging aids like ASSERT(mutex_owned(&mutex)) can help find
245 callers of a function which should be holding a mutex but are not. This means
246 you need to test your driver compiled with DEBUG.
247 .in -2
249 .in +2
250 Do not use a mutex to set driver state. However, you should use a mutex to
251 protect driver state data.
252 .in -2
254 .in +2
255 Use per-instance and automatic data where possible to reduce the amount of
256 shared data. Per-instance data can be protected by a per-instance lock to
257 improve scalability and reduce contention with multiple hardware instances.
258 .in -2
260 .in +2
261 Avoid global data and global mutexes whenever possible.
262 .in -2
264 .in +2
266 .in -2