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