kern_mutex.c revision 192853
1/*-
2 * Copyright (c) 1998 Berkeley Software Design, Inc. 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, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 * 3. Berkeley Software Design Inc's name may not be used to endorse or
13 *    promote products derived from this software without specific prior
14 *    written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY BERKELEY SOFTWARE DESIGN INC ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED.  IN NO EVENT SHALL BERKELEY SOFTWARE DESIGN INC BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 *	from BSDI $Id: mutex_witness.c,v 1.1.2.20 2000/04/27 03:10:27 cp Exp $
29 *	and BSDI $Id: synch_machdep.c,v 2.3.2.39 2000/04/27 03:10:25 cp Exp $
30 */
31
32/*
33 * Machine independent bits of mutex implementation.
34 */
35
36#include <sys/cdefs.h>
37__FBSDID("$FreeBSD: head/sys/kern/kern_mutex.c 192853 2009-05-26 20:28:22Z sson $");
38
39#include "opt_adaptive_mutexes.h"
40#include "opt_ddb.h"
41#include "opt_global.h"
42#include "opt_kdtrace.h"
43#include "opt_sched.h"
44
45#include <sys/param.h>
46#include <sys/systm.h>
47#include <sys/bus.h>
48#include <sys/conf.h>
49#include <sys/kdb.h>
50#include <sys/kernel.h>
51#include <sys/ktr.h>
52#include <sys/lock.h>
53#include <sys/malloc.h>
54#include <sys/mutex.h>
55#include <sys/proc.h>
56#include <sys/resourcevar.h>
57#include <sys/sched.h>
58#include <sys/sbuf.h>
59#include <sys/sysctl.h>
60#include <sys/turnstile.h>
61#include <sys/vmmeter.h>
62#include <sys/lock_profile.h>
63
64#include <machine/atomic.h>
65#include <machine/bus.h>
66#include <machine/cpu.h>
67
68#include <ddb/ddb.h>
69
70#include <fs/devfs/devfs_int.h>
71
72#include <vm/vm.h>
73#include <vm/vm_extern.h>
74
75#if defined(SMP) && !defined(NO_ADAPTIVE_MUTEXES)
76#define	ADAPTIVE_MUTEXES
77#endif
78
79/*
80 * Internal utility macros.
81 */
82#define mtx_unowned(m)	((m)->mtx_lock == MTX_UNOWNED)
83
84#define	mtx_destroyed(m) ((m)->mtx_lock == MTX_DESTROYED)
85
86#define	mtx_owner(m)	((struct thread *)((m)->mtx_lock & ~MTX_FLAGMASK))
87
88static void	assert_mtx(struct lock_object *lock, int what);
89#ifdef DDB
90static void	db_show_mtx(struct lock_object *lock);
91#endif
92static void	lock_mtx(struct lock_object *lock, int how);
93static void	lock_spin(struct lock_object *lock, int how);
94#ifdef KDTRACE_HOOKS
95static int	owner_mtx(struct lock_object *lock, struct thread **owner);
96#endif
97static int	unlock_mtx(struct lock_object *lock);
98static int	unlock_spin(struct lock_object *lock);
99
100/*
101 * Lock classes for sleep and spin mutexes.
102 */
103struct lock_class lock_class_mtx_sleep = {
104	.lc_name = "sleep mutex",
105	.lc_flags = LC_SLEEPLOCK | LC_RECURSABLE,
106	.lc_assert = assert_mtx,
107#ifdef DDB
108	.lc_ddb_show = db_show_mtx,
109#endif
110	.lc_lock = lock_mtx,
111	.lc_unlock = unlock_mtx,
112#ifdef KDTRACE_HOOKS
113	.lc_owner = owner_mtx,
114#endif
115};
116struct lock_class lock_class_mtx_spin = {
117	.lc_name = "spin mutex",
118	.lc_flags = LC_SPINLOCK | LC_RECURSABLE,
119	.lc_assert = assert_mtx,
120#ifdef DDB
121	.lc_ddb_show = db_show_mtx,
122#endif
123	.lc_lock = lock_spin,
124	.lc_unlock = unlock_spin,
125#ifdef KDTRACE_HOOKS
126	.lc_owner = owner_mtx,
127#endif
128};
129
130/*
131 * System-wide mutexes
132 */
133struct mtx blocked_lock;
134struct mtx Giant;
135
136void
137assert_mtx(struct lock_object *lock, int what)
138{
139
140	mtx_assert((struct mtx *)lock, what);
141}
142
143void
144lock_mtx(struct lock_object *lock, int how)
145{
146
147	mtx_lock((struct mtx *)lock);
148}
149
150void
151lock_spin(struct lock_object *lock, int how)
152{
153
154	panic("spin locks can only use msleep_spin");
155}
156
157int
158unlock_mtx(struct lock_object *lock)
159{
160	struct mtx *m;
161
162	m = (struct mtx *)lock;
163	mtx_assert(m, MA_OWNED | MA_NOTRECURSED);
164	mtx_unlock(m);
165	return (0);
166}
167
168int
169unlock_spin(struct lock_object *lock)
170{
171
172	panic("spin locks can only use msleep_spin");
173}
174
175#ifdef KDTRACE_HOOKS
176int
177owner_mtx(struct lock_object *lock, struct thread **owner)
178{
179	struct mtx *m = (struct mtx *)lock;
180
181	*owner = mtx_owner(m);
182	return (mtx_unowned(m) == 0);
183}
184#endif
185
186/*
187 * Function versions of the inlined __mtx_* macros.  These are used by
188 * modules and can also be called from assembly language if needed.
189 */
190void
191_mtx_lock_flags(struct mtx *m, int opts, const char *file, int line)
192{
193
194	MPASS(curthread != NULL);
195	KASSERT(m->mtx_lock != MTX_DESTROYED,
196	    ("mtx_lock() of destroyed mutex @ %s:%d", file, line));
197	KASSERT(LOCK_CLASS(&m->lock_object) == &lock_class_mtx_sleep,
198	    ("mtx_lock() of spin mutex %s @ %s:%d", m->lock_object.lo_name,
199	    file, line));
200	WITNESS_CHECKORDER(&m->lock_object, opts | LOP_NEWORDER | LOP_EXCLUSIVE,
201	    file, line, NULL);
202
203	_get_sleep_lock(m, curthread, opts, file, line);
204	LOCK_LOG_LOCK("LOCK", &m->lock_object, opts, m->mtx_recurse, file,
205	    line);
206	WITNESS_LOCK(&m->lock_object, opts | LOP_EXCLUSIVE, file, line);
207	curthread->td_locks++;
208}
209
210void
211_mtx_unlock_flags(struct mtx *m, int opts, const char *file, int line)
212{
213	MPASS(curthread != NULL);
214	KASSERT(m->mtx_lock != MTX_DESTROYED,
215	    ("mtx_unlock() of destroyed mutex @ %s:%d", file, line));
216	KASSERT(LOCK_CLASS(&m->lock_object) == &lock_class_mtx_sleep,
217	    ("mtx_unlock() of spin mutex %s @ %s:%d", m->lock_object.lo_name,
218	    file, line));
219	curthread->td_locks--;
220	WITNESS_UNLOCK(&m->lock_object, opts | LOP_EXCLUSIVE, file, line);
221	LOCK_LOG_LOCK("UNLOCK", &m->lock_object, opts, m->mtx_recurse, file,
222	    line);
223	mtx_assert(m, MA_OWNED);
224
225	if (m->mtx_recurse == 0)
226		LOCKSTAT_PROFILE_RELEASE_LOCK(LS_MTX_UNLOCK_RELEASE, m);
227	_rel_sleep_lock(m, curthread, opts, file, line);
228}
229
230void
231_mtx_lock_spin_flags(struct mtx *m, int opts, const char *file, int line)
232{
233
234	MPASS(curthread != NULL);
235	KASSERT(m->mtx_lock != MTX_DESTROYED,
236	    ("mtx_lock_spin() of destroyed mutex @ %s:%d", file, line));
237	KASSERT(LOCK_CLASS(&m->lock_object) == &lock_class_mtx_spin,
238	    ("mtx_lock_spin() of sleep mutex %s @ %s:%d",
239	    m->lock_object.lo_name, file, line));
240	if (mtx_owned(m))
241		KASSERT((m->lock_object.lo_flags & LO_RECURSABLE) != 0,
242	    ("mtx_lock_spin: recursed on non-recursive mutex %s @ %s:%d\n",
243		    m->lock_object.lo_name, file, line));
244	WITNESS_CHECKORDER(&m->lock_object, opts | LOP_NEWORDER | LOP_EXCLUSIVE,
245	    file, line, NULL);
246	_get_spin_lock(m, curthread, opts, file, line);
247	LOCK_LOG_LOCK("LOCK", &m->lock_object, opts, m->mtx_recurse, file,
248	    line);
249	WITNESS_LOCK(&m->lock_object, opts | LOP_EXCLUSIVE, file, line);
250}
251
252void
253_mtx_unlock_spin_flags(struct mtx *m, int opts, const char *file, int line)
254{
255
256	MPASS(curthread != NULL);
257	KASSERT(m->mtx_lock != MTX_DESTROYED,
258	    ("mtx_unlock_spin() of destroyed mutex @ %s:%d", file, line));
259	KASSERT(LOCK_CLASS(&m->lock_object) == &lock_class_mtx_spin,
260	    ("mtx_unlock_spin() of sleep mutex %s @ %s:%d",
261	    m->lock_object.lo_name, file, line));
262	WITNESS_UNLOCK(&m->lock_object, opts | LOP_EXCLUSIVE, file, line);
263	LOCK_LOG_LOCK("UNLOCK", &m->lock_object, opts, m->mtx_recurse, file,
264	    line);
265	mtx_assert(m, MA_OWNED);
266
267	_rel_spin_lock(m);
268}
269
270/*
271 * The important part of mtx_trylock{,_flags}()
272 * Tries to acquire lock `m.'  If this function is called on a mutex that
273 * is already owned, it will recursively acquire the lock.
274 */
275int
276_mtx_trylock(struct mtx *m, int opts, const char *file, int line)
277{
278#ifdef LOCK_PROFILING
279	uint64_t waittime = 0;
280	int contested = 0;
281#endif
282	int rval;
283
284	MPASS(curthread != NULL);
285	KASSERT(m->mtx_lock != MTX_DESTROYED,
286	    ("mtx_trylock() of destroyed mutex @ %s:%d", file, line));
287	KASSERT(LOCK_CLASS(&m->lock_object) == &lock_class_mtx_sleep,
288	    ("mtx_trylock() of spin mutex %s @ %s:%d", m->lock_object.lo_name,
289	    file, line));
290
291	if (mtx_owned(m) && (m->lock_object.lo_flags & LO_RECURSABLE) != 0) {
292		m->mtx_recurse++;
293		atomic_set_ptr(&m->mtx_lock, MTX_RECURSED);
294		rval = 1;
295	} else
296		rval = _obtain_lock(m, (uintptr_t)curthread);
297
298	LOCK_LOG_TRY("LOCK", &m->lock_object, opts, rval, file, line);
299	if (rval) {
300		WITNESS_LOCK(&m->lock_object, opts | LOP_EXCLUSIVE | LOP_TRYLOCK,
301		    file, line);
302		curthread->td_locks++;
303		if (m->mtx_recurse == 0)
304			LOCKSTAT_PROFILE_OBTAIN_LOCK_SUCCESS(LS_MTX_LOCK_ACQUIRE,
305			    m, contested, waittime, file, line);
306
307	}
308
309	return (rval);
310}
311
312/*
313 * _mtx_lock_sleep: the tougher part of acquiring an MTX_DEF lock.
314 *
315 * We call this if the lock is either contested (i.e. we need to go to
316 * sleep waiting for it), or if we need to recurse on it.
317 */
318void
319_mtx_lock_sleep(struct mtx *m, uintptr_t tid, int opts, const char *file,
320    int line)
321{
322	struct turnstile *ts;
323	uintptr_t v;
324#ifdef ADAPTIVE_MUTEXES
325	volatile struct thread *owner;
326#endif
327#ifdef KTR
328	int cont_logged = 0;
329#endif
330#ifdef LOCK_PROFILING
331	int contested = 0;
332	uint64_t waittime = 0;
333#endif
334#ifdef KDTRACE_HOOKS
335	uint64_t spin_cnt = 0;
336	uint64_t sleep_cnt = 0;
337	int64_t sleep_time = 0;
338#endif
339
340	if (mtx_owned(m)) {
341		KASSERT((m->lock_object.lo_flags & LO_RECURSABLE) != 0,
342	    ("_mtx_lock_sleep: recursed on non-recursive mutex %s @ %s:%d\n",
343		    m->lock_object.lo_name, file, line));
344		m->mtx_recurse++;
345		atomic_set_ptr(&m->mtx_lock, MTX_RECURSED);
346		if (LOCK_LOG_TEST(&m->lock_object, opts))
347			CTR1(KTR_LOCK, "_mtx_lock_sleep: %p recursing", m);
348		return;
349	}
350
351	lock_profile_obtain_lock_failed(&m->lock_object,
352		    &contested, &waittime);
353	if (LOCK_LOG_TEST(&m->lock_object, opts))
354		CTR4(KTR_LOCK,
355		    "_mtx_lock_sleep: %s contested (lock=%p) at %s:%d",
356		    m->lock_object.lo_name, (void *)m->mtx_lock, file, line);
357
358	while (!_obtain_lock(m, tid)) {
359#ifdef KDTRACE_HOOKS
360		spin_cnt++;
361#endif
362#ifdef ADAPTIVE_MUTEXES
363		/*
364		 * If the owner is running on another CPU, spin until the
365		 * owner stops running or the state of the lock changes.
366		 */
367		v = m->mtx_lock;
368		if (v != MTX_UNOWNED) {
369			owner = (struct thread *)(v & ~MTX_FLAGMASK);
370			if (TD_IS_RUNNING(owner)) {
371				if (LOCK_LOG_TEST(&m->lock_object, 0))
372					CTR3(KTR_LOCK,
373					    "%s: spinning on %p held by %p",
374					    __func__, m, owner);
375				while (mtx_owner(m) == owner &&
376				    TD_IS_RUNNING(owner)) {
377					cpu_spinwait();
378#ifdef KDTRACE_HOOKS
379					spin_cnt++;
380#endif
381				}
382				continue;
383			}
384		}
385#endif
386
387		ts = turnstile_trywait(&m->lock_object);
388		v = m->mtx_lock;
389
390		/*
391		 * Check if the lock has been released while spinning for
392		 * the turnstile chain lock.
393		 */
394		if (v == MTX_UNOWNED) {
395			turnstile_cancel(ts);
396			cpu_spinwait();
397			continue;
398		}
399
400#ifdef ADAPTIVE_MUTEXES
401		/*
402		 * If the current owner of the lock is executing on another
403		 * CPU quit the hard path and try to spin.
404		 */
405		owner = (struct thread *)(v & ~MTX_FLAGMASK);
406		if (TD_IS_RUNNING(owner)) {
407			turnstile_cancel(ts);
408			cpu_spinwait();
409			continue;
410		}
411#endif
412
413		/*
414		 * If the mutex isn't already contested and a failure occurs
415		 * setting the contested bit, the mutex was either released
416		 * or the state of the MTX_RECURSED bit changed.
417		 */
418		if ((v & MTX_CONTESTED) == 0 &&
419		    !atomic_cmpset_ptr(&m->mtx_lock, v, v | MTX_CONTESTED)) {
420			turnstile_cancel(ts);
421			cpu_spinwait();
422			continue;
423		}
424
425		/*
426		 * We definitely must sleep for this lock.
427		 */
428		mtx_assert(m, MA_NOTOWNED);
429
430#ifdef KTR
431		if (!cont_logged) {
432			CTR6(KTR_CONTENTION,
433			    "contention: %p at %s:%d wants %s, taken by %s:%d",
434			    (void *)tid, file, line, m->lock_object.lo_name,
435			    WITNESS_FILE(&m->lock_object),
436			    WITNESS_LINE(&m->lock_object));
437			cont_logged = 1;
438		}
439#endif
440
441		/*
442		 * Block on the turnstile.
443		 */
444#ifdef KDTRACE_HOOKS
445		sleep_time -= lockstat_nsecs();
446#endif
447		turnstile_wait(ts, mtx_owner(m), TS_EXCLUSIVE_QUEUE);
448#ifdef KDTRACE_HOOKS
449		sleep_time += lockstat_nsecs();
450		sleep_cnt++;
451#endif
452	}
453#ifdef KTR
454	if (cont_logged) {
455		CTR4(KTR_CONTENTION,
456		    "contention end: %s acquired by %p at %s:%d",
457		    m->lock_object.lo_name, (void *)tid, file, line);
458	}
459#endif
460	LOCKSTAT_PROFILE_OBTAIN_LOCK_SUCCESS(LS_MTX_LOCK_ACQUIRE, m, contested,
461	    waittime, file, line);
462#ifdef KDTRACE_HOOKS
463	if (sleep_time)
464		LOCKSTAT_RECORD1(LS_MTX_LOCK_BLOCK, m, sleep_time);
465
466	/*
467	 * Only record the loops spinning and not sleeping.
468	 */
469	if (spin_cnt > sleep_cnt)
470		LOCKSTAT_RECORD1(LS_MTX_LOCK_SPIN, m, (spin_cnt - sleep_cnt));
471#endif
472}
473
474static void
475_mtx_lock_spin_failed(struct mtx *m)
476{
477	struct thread *td;
478
479	td = mtx_owner(m);
480
481	/* If the mutex is unlocked, try again. */
482	if (td == NULL)
483		return;
484
485	printf( "spin lock %p (%s) held by %p (tid %d) too long\n",
486	    m, m->lock_object.lo_name, td, td->td_tid);
487#ifdef WITNESS
488	witness_display_spinlock(&m->lock_object, td);
489#endif
490	panic("spin lock held too long");
491}
492
493#ifdef SMP
494/*
495 * _mtx_lock_spin: the tougher part of acquiring an MTX_SPIN lock.
496 *
497 * This is only called if we need to actually spin for the lock. Recursion
498 * is handled inline.
499 */
500void
501_mtx_lock_spin(struct mtx *m, uintptr_t tid, int opts, const char *file,
502    int line)
503{
504	int i = 0;
505#ifdef LOCK_PROFILING
506	int contested = 0;
507	uint64_t waittime = 0;
508#endif
509
510	if (LOCK_LOG_TEST(&m->lock_object, opts))
511		CTR1(KTR_LOCK, "_mtx_lock_spin: %p spinning", m);
512
513	lock_profile_obtain_lock_failed(&m->lock_object, &contested, &waittime);
514	while (!_obtain_lock(m, tid)) {
515
516		/* Give interrupts a chance while we spin. */
517		spinlock_exit();
518		while (m->mtx_lock != MTX_UNOWNED) {
519			if (i++ < 10000000) {
520				cpu_spinwait();
521				continue;
522			}
523			if (i < 60000000 || kdb_active || panicstr != NULL)
524				DELAY(1);
525			else
526				_mtx_lock_spin_failed(m);
527			cpu_spinwait();
528		}
529		spinlock_enter();
530	}
531
532	if (LOCK_LOG_TEST(&m->lock_object, opts))
533		CTR1(KTR_LOCK, "_mtx_lock_spin: %p spin done", m);
534
535	LOCKSTAT_PROFILE_OBTAIN_LOCK_SUCCESS(LS_MTX_SPIN_LOCK_ACQUIRE, m,
536	    contested, waittime, (file), (line));
537	LOCKSTAT_RECORD1(LS_MTX_SPIN_LOCK_SPIN, m, i);
538}
539#endif /* SMP */
540
541void
542_thread_lock_flags(struct thread *td, int opts, const char *file, int line)
543{
544	struct mtx *m;
545	uintptr_t tid;
546	int i;
547#ifdef LOCK_PROFILING
548	int contested = 0;
549	uint64_t waittime = 0;
550#endif
551#ifdef KDTRACE_HOOKS
552	uint64_t spin_cnt = 0;
553#endif
554
555	i = 0;
556	tid = (uintptr_t)curthread;
557	for (;;) {
558retry:
559		spinlock_enter();
560		m = td->td_lock;
561		KASSERT(m->mtx_lock != MTX_DESTROYED,
562		    ("thread_lock() of destroyed mutex @ %s:%d", file, line));
563		KASSERT(LOCK_CLASS(&m->lock_object) == &lock_class_mtx_spin,
564		    ("thread_lock() of sleep mutex %s @ %s:%d",
565		    m->lock_object.lo_name, file, line));
566		if (mtx_owned(m))
567			KASSERT((m->lock_object.lo_flags & LO_RECURSABLE) != 0,
568	    ("thread_lock: recursed on non-recursive mutex %s @ %s:%d\n",
569			    m->lock_object.lo_name, file, line));
570		WITNESS_CHECKORDER(&m->lock_object,
571		    opts | LOP_NEWORDER | LOP_EXCLUSIVE, file, line, NULL);
572		while (!_obtain_lock(m, tid)) {
573#ifdef KDTRACE_HOOKS
574			spin_cnt++;
575#endif
576			if (m->mtx_lock == tid) {
577				m->mtx_recurse++;
578				break;
579			}
580			lock_profile_obtain_lock_failed(&m->lock_object,
581			    &contested, &waittime);
582			/* Give interrupts a chance while we spin. */
583			spinlock_exit();
584			while (m->mtx_lock != MTX_UNOWNED) {
585				if (i++ < 10000000)
586					cpu_spinwait();
587				else if (i < 60000000 ||
588				    kdb_active || panicstr != NULL)
589					DELAY(1);
590				else
591					_mtx_lock_spin_failed(m);
592				cpu_spinwait();
593				if (m != td->td_lock)
594					goto retry;
595			}
596			spinlock_enter();
597		}
598		if (m == td->td_lock)
599			break;
600		_rel_spin_lock(m);	/* does spinlock_exit() */
601#ifdef KDTRACE_HOOKS
602		spin_cnt++;
603#endif
604	}
605	if (m->mtx_recurse == 0)
606		LOCKSTAT_PROFILE_OBTAIN_LOCK_SUCCESS(LS_MTX_SPIN_LOCK_ACQUIRE,
607		    m, contested, waittime, (file), (line));
608	LOCK_LOG_LOCK("LOCK", &m->lock_object, opts, m->mtx_recurse, file,
609	    line);
610	WITNESS_LOCK(&m->lock_object, opts | LOP_EXCLUSIVE, file, line);
611	LOCKSTAT_RECORD1(LS_THREAD_LOCK_SPIN, m, spin_cnt);
612}
613
614struct mtx *
615thread_lock_block(struct thread *td)
616{
617	struct mtx *lock;
618
619	spinlock_enter();
620	THREAD_LOCK_ASSERT(td, MA_OWNED);
621	lock = td->td_lock;
622	td->td_lock = &blocked_lock;
623	mtx_unlock_spin(lock);
624
625	return (lock);
626}
627
628void
629thread_lock_unblock(struct thread *td, struct mtx *new)
630{
631	mtx_assert(new, MA_OWNED);
632	MPASS(td->td_lock == &blocked_lock);
633	atomic_store_rel_ptr((volatile void *)&td->td_lock, (uintptr_t)new);
634	spinlock_exit();
635}
636
637void
638thread_lock_set(struct thread *td, struct mtx *new)
639{
640	struct mtx *lock;
641
642	mtx_assert(new, MA_OWNED);
643	THREAD_LOCK_ASSERT(td, MA_OWNED);
644	lock = td->td_lock;
645	td->td_lock = new;
646	mtx_unlock_spin(lock);
647}
648
649/*
650 * _mtx_unlock_sleep: the tougher part of releasing an MTX_DEF lock.
651 *
652 * We are only called here if the lock is recursed or contested (i.e. we
653 * need to wake up a blocked thread).
654 */
655void
656_mtx_unlock_sleep(struct mtx *m, int opts, const char *file, int line)
657{
658	struct turnstile *ts;
659
660	if (mtx_recursed(m)) {
661		if (--(m->mtx_recurse) == 0)
662			atomic_clear_ptr(&m->mtx_lock, MTX_RECURSED);
663		if (LOCK_LOG_TEST(&m->lock_object, opts))
664			CTR1(KTR_LOCK, "_mtx_unlock_sleep: %p unrecurse", m);
665		return;
666	}
667
668	/*
669	 * We have to lock the chain before the turnstile so this turnstile
670	 * can be removed from the hash list if it is empty.
671	 */
672	turnstile_chain_lock(&m->lock_object);
673	ts = turnstile_lookup(&m->lock_object);
674	if (LOCK_LOG_TEST(&m->lock_object, opts))
675		CTR1(KTR_LOCK, "_mtx_unlock_sleep: %p contested", m);
676	MPASS(ts != NULL);
677	turnstile_broadcast(ts, TS_EXCLUSIVE_QUEUE);
678	_release_lock_quick(m);
679
680	/*
681	 * This turnstile is now no longer associated with the mutex.  We can
682	 * unlock the chain lock so a new turnstile may take it's place.
683	 */
684	turnstile_unpend(ts, TS_EXCLUSIVE_LOCK);
685	turnstile_chain_unlock(&m->lock_object);
686}
687
688/*
689 * All the unlocking of MTX_SPIN locks is done inline.
690 * See the _rel_spin_lock() macro for the details.
691 */
692
693/*
694 * The backing function for the INVARIANTS-enabled mtx_assert()
695 */
696#ifdef INVARIANT_SUPPORT
697void
698_mtx_assert(struct mtx *m, int what, const char *file, int line)
699{
700
701	if (panicstr != NULL || dumping)
702		return;
703	switch (what) {
704	case MA_OWNED:
705	case MA_OWNED | MA_RECURSED:
706	case MA_OWNED | MA_NOTRECURSED:
707		if (!mtx_owned(m))
708			panic("mutex %s not owned at %s:%d",
709			    m->lock_object.lo_name, file, line);
710		if (mtx_recursed(m)) {
711			if ((what & MA_NOTRECURSED) != 0)
712				panic("mutex %s recursed at %s:%d",
713				    m->lock_object.lo_name, file, line);
714		} else if ((what & MA_RECURSED) != 0) {
715			panic("mutex %s unrecursed at %s:%d",
716			    m->lock_object.lo_name, file, line);
717		}
718		break;
719	case MA_NOTOWNED:
720		if (mtx_owned(m))
721			panic("mutex %s owned at %s:%d",
722			    m->lock_object.lo_name, file, line);
723		break;
724	default:
725		panic("unknown mtx_assert at %s:%d", file, line);
726	}
727}
728#endif
729
730/*
731 * The MUTEX_DEBUG-enabled mtx_validate()
732 *
733 * Most of these checks have been moved off into the LO_INITIALIZED flag
734 * maintained by the witness code.
735 */
736#ifdef MUTEX_DEBUG
737
738void	mtx_validate(struct mtx *);
739
740void
741mtx_validate(struct mtx *m)
742{
743
744/*
745 * XXX: When kernacc() does not require Giant we can reenable this check
746 */
747#ifdef notyet
748	/*
749	 * Can't call kernacc() from early init386(), especially when
750	 * initializing Giant mutex, because some stuff in kernacc()
751	 * requires Giant itself.
752	 */
753	if (!cold)
754		if (!kernacc((caddr_t)m, sizeof(m),
755		    VM_PROT_READ | VM_PROT_WRITE))
756			panic("Can't read and write to mutex %p", m);
757#endif
758}
759#endif
760
761/*
762 * General init routine used by the MTX_SYSINIT() macro.
763 */
764void
765mtx_sysinit(void *arg)
766{
767	struct mtx_args *margs = arg;
768
769	mtx_init(margs->ma_mtx, margs->ma_desc, NULL, margs->ma_opts);
770}
771
772/*
773 * Mutex initialization routine; initialize lock `m' of type contained in
774 * `opts' with options contained in `opts' and name `name.'  The optional
775 * lock type `type' is used as a general lock category name for use with
776 * witness.
777 */
778void
779mtx_init(struct mtx *m, const char *name, const char *type, int opts)
780{
781	struct lock_class *class;
782	int flags;
783
784	MPASS((opts & ~(MTX_SPIN | MTX_QUIET | MTX_RECURSE |
785		MTX_NOWITNESS | MTX_DUPOK | MTX_NOPROFILE)) == 0);
786
787#ifdef MUTEX_DEBUG
788	/* Diagnostic and error correction */
789	mtx_validate(m);
790#endif
791
792	/* Determine lock class and lock flags. */
793	if (opts & MTX_SPIN)
794		class = &lock_class_mtx_spin;
795	else
796		class = &lock_class_mtx_sleep;
797	flags = 0;
798	if (opts & MTX_QUIET)
799		flags |= LO_QUIET;
800	if (opts & MTX_RECURSE)
801		flags |= LO_RECURSABLE;
802	if ((opts & MTX_NOWITNESS) == 0)
803		flags |= LO_WITNESS;
804	if (opts & MTX_DUPOK)
805		flags |= LO_DUPOK;
806	if (opts & MTX_NOPROFILE)
807		flags |= LO_NOPROFILE;
808
809	/* Initialize mutex. */
810	m->mtx_lock = MTX_UNOWNED;
811	m->mtx_recurse = 0;
812
813	lock_init(&m->lock_object, class, name, type, flags);
814}
815
816/*
817 * Remove lock `m' from all_mtx queue.  We don't allow MTX_QUIET to be
818 * passed in as a flag here because if the corresponding mtx_init() was
819 * called with MTX_QUIET set, then it will already be set in the mutex's
820 * flags.
821 */
822void
823mtx_destroy(struct mtx *m)
824{
825
826	if (!mtx_owned(m))
827		MPASS(mtx_unowned(m));
828	else {
829		MPASS((m->mtx_lock & (MTX_RECURSED|MTX_CONTESTED)) == 0);
830
831		/* Perform the non-mtx related part of mtx_unlock_spin(). */
832		if (LOCK_CLASS(&m->lock_object) == &lock_class_mtx_spin)
833			spinlock_exit();
834		else
835			curthread->td_locks--;
836
837		lock_profile_release_lock(&m->lock_object);
838		/* Tell witness this isn't locked to make it happy. */
839		WITNESS_UNLOCK(&m->lock_object, LOP_EXCLUSIVE, __FILE__,
840		    __LINE__);
841	}
842
843	m->mtx_lock = MTX_DESTROYED;
844	lock_destroy(&m->lock_object);
845}
846
847/*
848 * Intialize the mutex code and system mutexes.  This is called from the MD
849 * startup code prior to mi_startup().  The per-CPU data space needs to be
850 * setup before this is called.
851 */
852void
853mutex_init(void)
854{
855
856	/* Setup turnstiles so that sleep mutexes work. */
857	init_turnstiles();
858
859	/*
860	 * Initialize mutexes.
861	 */
862	mtx_init(&Giant, "Giant", NULL, MTX_DEF | MTX_RECURSE);
863	mtx_init(&blocked_lock, "blocked lock", NULL, MTX_SPIN);
864	blocked_lock.mtx_lock = 0xdeadc0de;	/* Always blocked. */
865	mtx_init(&proc0.p_mtx, "process lock", NULL, MTX_DEF | MTX_DUPOK);
866	mtx_init(&proc0.p_slock, "process slock", NULL, MTX_SPIN | MTX_RECURSE);
867	mtx_init(&devmtx, "cdev", NULL, MTX_DEF);
868	mtx_lock(&Giant);
869}
870
871#ifdef DDB
872void
873db_show_mtx(struct lock_object *lock)
874{
875	struct thread *td;
876	struct mtx *m;
877
878	m = (struct mtx *)lock;
879
880	db_printf(" flags: {");
881	if (LOCK_CLASS(lock) == &lock_class_mtx_spin)
882		db_printf("SPIN");
883	else
884		db_printf("DEF");
885	if (m->lock_object.lo_flags & LO_RECURSABLE)
886		db_printf(", RECURSE");
887	if (m->lock_object.lo_flags & LO_DUPOK)
888		db_printf(", DUPOK");
889	db_printf("}\n");
890	db_printf(" state: {");
891	if (mtx_unowned(m))
892		db_printf("UNOWNED");
893	else if (mtx_destroyed(m))
894		db_printf("DESTROYED");
895	else {
896		db_printf("OWNED");
897		if (m->mtx_lock & MTX_CONTESTED)
898			db_printf(", CONTESTED");
899		if (m->mtx_lock & MTX_RECURSED)
900			db_printf(", RECURSED");
901	}
902	db_printf("}\n");
903	if (!mtx_unowned(m) && !mtx_destroyed(m)) {
904		td = mtx_owner(m);
905		db_printf(" owner: %p (tid %d, pid %d, \"%s\")\n", td,
906		    td->td_tid, td->td_proc->p_pid, td->td_name);
907		if (mtx_recursed(m))
908			db_printf(" recursed: %d\n", m->mtx_recurse);
909	}
910}
911#endif
912