xref: /freebsd/sys/kern/subr_turnstile.c (revision 1e413cf93298b5b97441a21d9a50fdcd0ee9945e)
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  * Implementation of turnstiles used to hold queue of threads blocked on
34  * non-sleepable locks.  Sleepable locks use condition variables to
35  * implement their queues.  Turnstiles differ from a sleep queue in that
36  * turnstile queue's are assigned to a lock held by an owning thread.  Thus,
37  * when one thread is enqueued onto a turnstile, it can lend its priority
38  * to the owning thread.
39  *
40  * We wish to avoid bloating locks with an embedded turnstile and we do not
41  * want to use back-pointers in the locks for the same reason.  Thus, we
42  * use a similar approach to that of Solaris 7 as described in Solaris
43  * Internals by Jim Mauro and Richard McDougall.  Turnstiles are looked up
44  * in a hash table based on the address of the lock.  Each entry in the
45  * hash table is a linked-lists of turnstiles and is called a turnstile
46  * chain.  Each chain contains a spin mutex that protects all of the
47  * turnstiles in the chain.
48  *
49  * Each time a thread is created, a turnstile is allocated from a UMA zone
50  * and attached to that thread.  When a thread blocks on a lock, if it is the
51  * first thread to block, it lends its turnstile to the lock.  If the lock
52  * already has a turnstile, then it gives its turnstile to the lock's
53  * turnstile's free list.  When a thread is woken up, it takes a turnstile from
54  * the free list if there are any other waiters.  If it is the only thread
55  * blocked on the lock, then it reclaims the turnstile associated with the lock
56  * and removes it from the hash table.
57  */
58 
59 #include <sys/cdefs.h>
60 __FBSDID("$FreeBSD$");
61 
62 #include "opt_ddb.h"
63 #include "opt_turnstile_profiling.h"
64 #include "opt_sched.h"
65 
66 #include <sys/param.h>
67 #include <sys/systm.h>
68 #include <sys/kernel.h>
69 #include <sys/ktr.h>
70 #include <sys/lock.h>
71 #include <sys/mutex.h>
72 #include <sys/proc.h>
73 #include <sys/queue.h>
74 #include <sys/sched.h>
75 #include <sys/sysctl.h>
76 #include <sys/turnstile.h>
77 
78 #include <vm/uma.h>
79 
80 #ifdef DDB
81 #include <sys/kdb.h>
82 #include <ddb/ddb.h>
83 #include <sys/lockmgr.h>
84 #include <sys/sx.h>
85 #endif
86 
87 /*
88  * Constants for the hash table of turnstile chains.  TC_SHIFT is a magic
89  * number chosen because the sleep queue's use the same value for the
90  * shift.  Basically, we ignore the lower 8 bits of the address.
91  * TC_TABLESIZE must be a power of two for TC_MASK to work properly.
92  */
93 #define	TC_TABLESIZE	128			/* Must be power of 2. */
94 #define	TC_MASK		(TC_TABLESIZE - 1)
95 #define	TC_SHIFT	8
96 #define	TC_HASH(lock)	(((uintptr_t)(lock) >> TC_SHIFT) & TC_MASK)
97 #define	TC_LOOKUP(lock)	&turnstile_chains[TC_HASH(lock)]
98 
99 /*
100  * There are three different lists of turnstiles as follows.  The list
101  * connected by ts_link entries is a per-thread list of all the turnstiles
102  * attached to locks that we own.  This is used to fixup our priority when
103  * a lock is released.  The other two lists use the ts_hash entries.  The
104  * first of these two is the turnstile chain list that a turnstile is on
105  * when it is attached to a lock.  The second list to use ts_hash is the
106  * free list hung off of a turnstile that is attached to a lock.
107  *
108  * Each turnstile contains three lists of threads.  The two ts_blocked lists
109  * are linked list of threads blocked on the turnstile's lock.  One list is
110  * for exclusive waiters, and the other is for shared waiters.  The
111  * ts_pending list is a linked list of threads previously awakened by
112  * turnstile_signal() or turnstile_wait() that are waiting to be put on
113  * the run queue.
114  *
115  * Locking key:
116  *  c - turnstile chain lock
117  *  q - td_contested lock
118  */
119 struct turnstile {
120 	struct mtx ts_lock;			/* Spin lock for self. */
121 	struct threadqueue ts_blocked[2];	/* (c + q) Blocked threads. */
122 	struct threadqueue ts_pending;		/* (c) Pending threads. */
123 	LIST_ENTRY(turnstile) ts_hash;		/* (c) Chain and free list. */
124 	LIST_ENTRY(turnstile) ts_link;		/* (q) Contested locks. */
125 	LIST_HEAD(, turnstile) ts_free;		/* (c) Free turnstiles. */
126 	struct lock_object *ts_lockobj;		/* (c) Lock we reference. */
127 	struct thread *ts_owner;		/* (c + q) Who owns the lock. */
128 };
129 
130 struct turnstile_chain {
131 	LIST_HEAD(, turnstile) tc_turnstiles;	/* List of turnstiles. */
132 	struct mtx tc_lock;			/* Spin lock for this chain. */
133 #ifdef TURNSTILE_PROFILING
134 	u_int	tc_depth;			/* Length of tc_queues. */
135 	u_int	tc_max_depth;			/* Max length of tc_queues. */
136 #endif
137 };
138 
139 #ifdef TURNSTILE_PROFILING
140 u_int turnstile_max_depth;
141 SYSCTL_NODE(_debug, OID_AUTO, turnstile, CTLFLAG_RD, 0, "turnstile profiling");
142 SYSCTL_NODE(_debug_turnstile, OID_AUTO, chains, CTLFLAG_RD, 0,
143     "turnstile chain stats");
144 SYSCTL_UINT(_debug_turnstile, OID_AUTO, max_depth, CTLFLAG_RD,
145     &turnstile_max_depth, 0, "maxmimum depth achieved of a single chain");
146 #endif
147 static struct mtx td_contested_lock;
148 static struct turnstile_chain turnstile_chains[TC_TABLESIZE];
149 static uma_zone_t turnstile_zone;
150 
151 /*
152  * Prototypes for non-exported routines.
153  */
154 static void	init_turnstile0(void *dummy);
155 #ifdef TURNSTILE_PROFILING
156 static void	init_turnstile_profiling(void *arg);
157 #endif
158 static void	propagate_priority(struct thread *td);
159 static int	turnstile_adjust_thread(struct turnstile *ts,
160 		    struct thread *td);
161 static struct thread *turnstile_first_waiter(struct turnstile *ts);
162 static void	turnstile_setowner(struct turnstile *ts, struct thread *owner);
163 #ifdef INVARIANTS
164 static void	turnstile_dtor(void *mem, int size, void *arg);
165 #endif
166 static int	turnstile_init(void *mem, int size, int flags);
167 static void	turnstile_fini(void *mem, int size);
168 
169 /*
170  * Walks the chain of turnstiles and their owners to propagate the priority
171  * of the thread being blocked to all the threads holding locks that have to
172  * release their locks before this thread can run again.
173  */
174 static void
175 propagate_priority(struct thread *td)
176 {
177 	struct turnstile *ts;
178 	int pri;
179 
180 	THREAD_LOCK_ASSERT(td, MA_OWNED);
181 	pri = td->td_priority;
182 	ts = td->td_blocked;
183 	MPASS(td->td_lock == &ts->ts_lock);
184 	/*
185 	 * Grab a recursive lock on this turnstile chain so it stays locked
186 	 * for the whole operation.  The caller expects us to return with
187 	 * the original lock held.  We only ever lock down the chain so
188 	 * the lock order is constant.
189 	 */
190 	mtx_lock_spin(&ts->ts_lock);
191 	for (;;) {
192 		td = ts->ts_owner;
193 
194 		if (td == NULL) {
195 			/*
196 			 * This might be a read lock with no owner.  There's
197 			 * not much we can do, so just bail.
198 			 */
199 			mtx_unlock_spin(&ts->ts_lock);
200 			return;
201 		}
202 
203 		thread_lock_flags(td, MTX_DUPOK);
204 		mtx_unlock_spin(&ts->ts_lock);
205 		MPASS(td->td_proc != NULL);
206 		MPASS(td->td_proc->p_magic == P_MAGIC);
207 
208 		/*
209 		 * If the thread is asleep, then we are probably about
210 		 * to deadlock.  To make debugging this easier, just
211 		 * panic and tell the user which thread misbehaved so
212 		 * they can hopefully get a stack trace from the truly
213 		 * misbehaving thread.
214 		 */
215 		if (TD_IS_SLEEPING(td)) {
216 			printf(
217 		"Sleeping thread (tid %d, pid %d) owns a non-sleepable lock\n",
218 			    td->td_tid, td->td_proc->p_pid);
219 #ifdef DDB
220 			db_trace_thread(td, -1);
221 #endif
222 			panic("sleeping thread");
223 		}
224 
225 		/*
226 		 * If this thread already has higher priority than the
227 		 * thread that is being blocked, we are finished.
228 		 */
229 		if (td->td_priority <= pri) {
230 			thread_unlock(td);
231 			return;
232 		}
233 
234 		/*
235 		 * Bump this thread's priority.
236 		 */
237 		sched_lend_prio(td, pri);
238 
239 		/*
240 		 * If lock holder is actually running or on the run queue
241 		 * then we are done.
242 		 */
243 		if (TD_IS_RUNNING(td) || TD_ON_RUNQ(td)) {
244 			MPASS(td->td_blocked == NULL);
245 			thread_unlock(td);
246 			return;
247 		}
248 
249 #ifndef SMP
250 		/*
251 		 * For UP, we check to see if td is curthread (this shouldn't
252 		 * ever happen however as it would mean we are in a deadlock.)
253 		 */
254 		KASSERT(td != curthread, ("Deadlock detected"));
255 #endif
256 
257 		/*
258 		 * If we aren't blocked on a lock, we should be.
259 		 */
260 		KASSERT(TD_ON_LOCK(td), (
261 		    "thread %d(%s):%d holds %s but isn't blocked on a lock\n",
262 		    td->td_tid, td->td_name, td->td_state,
263 		    ts->ts_lockobj->lo_name));
264 
265 		/*
266 		 * Pick up the lock that td is blocked on.
267 		 */
268 		ts = td->td_blocked;
269 		MPASS(ts != NULL);
270 		MPASS(td->td_lock == &ts->ts_lock);
271 		/* Resort td on the list if needed. */
272 		if (!turnstile_adjust_thread(ts, td)) {
273 			mtx_unlock_spin(&ts->ts_lock);
274 			return;
275 		}
276 		/* The thread lock is released as ts lock above. */
277 	}
278 }
279 
280 /*
281  * Adjust the thread's position on a turnstile after its priority has been
282  * changed.
283  */
284 static int
285 turnstile_adjust_thread(struct turnstile *ts, struct thread *td)
286 {
287 	struct thread *td1, *td2;
288 	int queue;
289 
290 	THREAD_LOCK_ASSERT(td, MA_OWNED);
291 	MPASS(TD_ON_LOCK(td));
292 
293 	/*
294 	 * This thread may not be blocked on this turnstile anymore
295 	 * but instead might already be woken up on another CPU
296 	 * that is waiting on the thread lock in turnstile_unpend() to
297 	 * finish waking this thread up.  We can detect this case
298 	 * by checking to see if this thread has been given a
299 	 * turnstile by either turnstile_signal() or
300 	 * turnstile_broadcast().  In this case, treat the thread as
301 	 * if it was already running.
302 	 */
303 	if (td->td_turnstile != NULL)
304 		return (0);
305 
306 	/*
307 	 * Check if the thread needs to be moved on the blocked chain.
308 	 * It needs to be moved if either its priority is lower than
309 	 * the previous thread or higher than the next thread.
310 	 */
311 	MPASS(td->td_lock == &ts->ts_lock);
312 	td1 = TAILQ_PREV(td, threadqueue, td_lockq);
313 	td2 = TAILQ_NEXT(td, td_lockq);
314 	if ((td1 != NULL && td->td_priority < td1->td_priority) ||
315 	    (td2 != NULL && td->td_priority > td2->td_priority)) {
316 
317 		/*
318 		 * Remove thread from blocked chain and determine where
319 		 * it should be moved to.
320 		 */
321 		queue = td->td_tsqueue;
322 		MPASS(queue == TS_EXCLUSIVE_QUEUE || queue == TS_SHARED_QUEUE);
323 		mtx_lock_spin(&td_contested_lock);
324 		TAILQ_REMOVE(&ts->ts_blocked[queue], td, td_lockq);
325 		TAILQ_FOREACH(td1, &ts->ts_blocked[queue], td_lockq) {
326 			MPASS(td1->td_proc->p_magic == P_MAGIC);
327 			if (td1->td_priority > td->td_priority)
328 				break;
329 		}
330 
331 		if (td1 == NULL)
332 			TAILQ_INSERT_TAIL(&ts->ts_blocked[queue], td, td_lockq);
333 		else
334 			TAILQ_INSERT_BEFORE(td1, td, td_lockq);
335 		mtx_unlock_spin(&td_contested_lock);
336 		if (td1 == NULL)
337 			CTR3(KTR_LOCK,
338 		    "turnstile_adjust_thread: td %d put at tail on [%p] %s",
339 			    td->td_tid, ts->ts_lockobj, ts->ts_lockobj->lo_name);
340 		else
341 			CTR4(KTR_LOCK,
342 		    "turnstile_adjust_thread: td %d moved before %d on [%p] %s",
343 			    td->td_tid, td1->td_tid, ts->ts_lockobj,
344 			    ts->ts_lockobj->lo_name);
345 	}
346 	return (1);
347 }
348 
349 /*
350  * Early initialization of turnstiles.  This is not done via a SYSINIT()
351  * since this needs to be initialized very early when mutexes are first
352  * initialized.
353  */
354 void
355 init_turnstiles(void)
356 {
357 	int i;
358 
359 	for (i = 0; i < TC_TABLESIZE; i++) {
360 		LIST_INIT(&turnstile_chains[i].tc_turnstiles);
361 		mtx_init(&turnstile_chains[i].tc_lock, "turnstile chain",
362 		    NULL, MTX_SPIN);
363 	}
364 	mtx_init(&td_contested_lock, "td_contested", NULL, MTX_SPIN);
365 	LIST_INIT(&thread0.td_contested);
366 	thread0.td_turnstile = NULL;
367 }
368 
369 #ifdef TURNSTILE_PROFILING
370 static void
371 init_turnstile_profiling(void *arg)
372 {
373 	struct sysctl_oid *chain_oid;
374 	char chain_name[10];
375 	int i;
376 
377 	for (i = 0; i < TC_TABLESIZE; i++) {
378 		snprintf(chain_name, sizeof(chain_name), "%d", i);
379 		chain_oid = SYSCTL_ADD_NODE(NULL,
380 		    SYSCTL_STATIC_CHILDREN(_debug_turnstile_chains), OID_AUTO,
381 		    chain_name, CTLFLAG_RD, NULL, "turnstile chain stats");
382 		SYSCTL_ADD_UINT(NULL, SYSCTL_CHILDREN(chain_oid), OID_AUTO,
383 		    "depth", CTLFLAG_RD, &turnstile_chains[i].tc_depth, 0,
384 		    NULL);
385 		SYSCTL_ADD_UINT(NULL, SYSCTL_CHILDREN(chain_oid), OID_AUTO,
386 		    "max_depth", CTLFLAG_RD, &turnstile_chains[i].tc_max_depth,
387 		    0, NULL);
388 	}
389 }
390 SYSINIT(turnstile_profiling, SI_SUB_LOCK, SI_ORDER_ANY,
391     init_turnstile_profiling, NULL);
392 #endif
393 
394 static void
395 init_turnstile0(void *dummy)
396 {
397 
398 	turnstile_zone = uma_zcreate("TURNSTILE", sizeof(struct turnstile),
399 #ifdef INVARIANTS
400 	    NULL, turnstile_dtor, turnstile_init, turnstile_fini,
401 	    UMA_ALIGN_CACHE, 0);
402 #else
403 	    NULL, NULL, turnstile_init, turnstile_fini, UMA_ALIGN_CACHE, 0);
404 #endif
405 	thread0.td_turnstile = turnstile_alloc();
406 }
407 SYSINIT(turnstile0, SI_SUB_LOCK, SI_ORDER_ANY, init_turnstile0, NULL);
408 
409 /*
410  * Update a thread on the turnstile list after it's priority has been changed.
411  * The old priority is passed in as an argument.
412  */
413 void
414 turnstile_adjust(struct thread *td, u_char oldpri)
415 {
416 	struct turnstile *ts;
417 
418 	MPASS(TD_ON_LOCK(td));
419 
420 	/*
421 	 * Pick up the lock that td is blocked on.
422 	 */
423 	ts = td->td_blocked;
424 	MPASS(ts != NULL);
425 	MPASS(td->td_lock == &ts->ts_lock);
426 	mtx_assert(&ts->ts_lock, MA_OWNED);
427 
428 	/* Resort the turnstile on the list. */
429 	if (!turnstile_adjust_thread(ts, td))
430 		return;
431 	/*
432 	 * If our priority was lowered and we are at the head of the
433 	 * turnstile, then propagate our new priority up the chain.
434 	 * Note that we currently don't try to revoke lent priorities
435 	 * when our priority goes up.
436 	 */
437 	MPASS(td->td_tsqueue == TS_EXCLUSIVE_QUEUE ||
438 	    td->td_tsqueue == TS_SHARED_QUEUE);
439 	if (td == TAILQ_FIRST(&ts->ts_blocked[td->td_tsqueue]) &&
440 	    td->td_priority < oldpri) {
441 		propagate_priority(td);
442 	}
443 }
444 
445 /*
446  * Set the owner of the lock this turnstile is attached to.
447  */
448 static void
449 turnstile_setowner(struct turnstile *ts, struct thread *owner)
450 {
451 
452 	mtx_assert(&td_contested_lock, MA_OWNED);
453 	MPASS(ts->ts_owner == NULL);
454 
455 	/* A shared lock might not have an owner. */
456 	if (owner == NULL)
457 		return;
458 
459 	MPASS(owner->td_proc->p_magic == P_MAGIC);
460 	ts->ts_owner = owner;
461 	LIST_INSERT_HEAD(&owner->td_contested, ts, ts_link);
462 }
463 
464 #ifdef INVARIANTS
465 /*
466  * UMA zone item deallocator.
467  */
468 static void
469 turnstile_dtor(void *mem, int size, void *arg)
470 {
471 	struct turnstile *ts;
472 
473 	ts = mem;
474 	MPASS(TAILQ_EMPTY(&ts->ts_blocked[TS_EXCLUSIVE_QUEUE]));
475 	MPASS(TAILQ_EMPTY(&ts->ts_blocked[TS_SHARED_QUEUE]));
476 	MPASS(TAILQ_EMPTY(&ts->ts_pending));
477 }
478 #endif
479 
480 /*
481  * UMA zone item initializer.
482  */
483 static int
484 turnstile_init(void *mem, int size, int flags)
485 {
486 	struct turnstile *ts;
487 
488 	bzero(mem, size);
489 	ts = mem;
490 	TAILQ_INIT(&ts->ts_blocked[TS_EXCLUSIVE_QUEUE]);
491 	TAILQ_INIT(&ts->ts_blocked[TS_SHARED_QUEUE]);
492 	TAILQ_INIT(&ts->ts_pending);
493 	LIST_INIT(&ts->ts_free);
494 	mtx_init(&ts->ts_lock, "turnstile lock", NULL, MTX_SPIN | MTX_RECURSE);
495 	return (0);
496 }
497 
498 static void
499 turnstile_fini(void *mem, int size)
500 {
501 	struct turnstile *ts;
502 
503 	ts = mem;
504 	mtx_destroy(&ts->ts_lock);
505 }
506 
507 /*
508  * Get a turnstile for a new thread.
509  */
510 struct turnstile *
511 turnstile_alloc(void)
512 {
513 
514 	return (uma_zalloc(turnstile_zone, M_WAITOK));
515 }
516 
517 /*
518  * Free a turnstile when a thread is destroyed.
519  */
520 void
521 turnstile_free(struct turnstile *ts)
522 {
523 
524 	uma_zfree(turnstile_zone, ts);
525 }
526 
527 /*
528  * Lock the turnstile chain associated with the specified lock.
529  */
530 void
531 turnstile_chain_lock(struct lock_object *lock)
532 {
533 	struct turnstile_chain *tc;
534 
535 	tc = TC_LOOKUP(lock);
536 	mtx_lock_spin(&tc->tc_lock);
537 }
538 
539 struct turnstile *
540 turnstile_trywait(struct lock_object *lock)
541 {
542 	struct turnstile_chain *tc;
543 	struct turnstile *ts;
544 
545 	tc = TC_LOOKUP(lock);
546 	mtx_lock_spin(&tc->tc_lock);
547 	LIST_FOREACH(ts, &tc->tc_turnstiles, ts_hash)
548 		if (ts->ts_lockobj == lock) {
549 			mtx_lock_spin(&ts->ts_lock);
550 			return (ts);
551 		}
552 
553 	ts = curthread->td_turnstile;
554 	MPASS(ts != NULL);
555 	mtx_lock_spin(&ts->ts_lock);
556 	KASSERT(ts->ts_lockobj == NULL, ("stale ts_lockobj pointer"));
557 	ts->ts_lockobj = lock;
558 
559 	return (ts);
560 }
561 
562 void
563 turnstile_cancel(struct turnstile *ts)
564 {
565 	struct turnstile_chain *tc;
566 	struct lock_object *lock;
567 
568 	mtx_assert(&ts->ts_lock, MA_OWNED);
569 
570 	mtx_unlock_spin(&ts->ts_lock);
571 	lock = ts->ts_lockobj;
572 	if (ts == curthread->td_turnstile)
573 		ts->ts_lockobj = NULL;
574 	tc = TC_LOOKUP(lock);
575 	mtx_unlock_spin(&tc->tc_lock);
576 }
577 
578 /*
579  * Look up the turnstile for a lock in the hash table locking the associated
580  * turnstile chain along the way.  If no turnstile is found in the hash
581  * table, NULL is returned.
582  */
583 struct turnstile *
584 turnstile_lookup(struct lock_object *lock)
585 {
586 	struct turnstile_chain *tc;
587 	struct turnstile *ts;
588 
589 	tc = TC_LOOKUP(lock);
590 	mtx_assert(&tc->tc_lock, MA_OWNED);
591 	LIST_FOREACH(ts, &tc->tc_turnstiles, ts_hash)
592 		if (ts->ts_lockobj == lock) {
593 			mtx_lock_spin(&ts->ts_lock);
594 			return (ts);
595 		}
596 	return (NULL);
597 }
598 
599 /*
600  * Unlock the turnstile chain associated with a given lock.
601  */
602 void
603 turnstile_chain_unlock(struct lock_object *lock)
604 {
605 	struct turnstile_chain *tc;
606 
607 	tc = TC_LOOKUP(lock);
608 	mtx_unlock_spin(&tc->tc_lock);
609 }
610 
611 /*
612  * Return a pointer to the thread waiting on this turnstile with the
613  * most important priority or NULL if the turnstile has no waiters.
614  */
615 static struct thread *
616 turnstile_first_waiter(struct turnstile *ts)
617 {
618 	struct thread *std, *xtd;
619 
620 	std = TAILQ_FIRST(&ts->ts_blocked[TS_SHARED_QUEUE]);
621 	xtd = TAILQ_FIRST(&ts->ts_blocked[TS_EXCLUSIVE_QUEUE]);
622 	if (xtd == NULL || (std != NULL && std->td_priority < xtd->td_priority))
623 		return (std);
624 	return (xtd);
625 }
626 
627 /*
628  * Take ownership of a turnstile and adjust the priority of the new
629  * owner appropriately.
630  */
631 void
632 turnstile_claim(struct turnstile *ts)
633 {
634 	struct thread *td, *owner;
635 	struct turnstile_chain *tc;
636 
637 	mtx_assert(&ts->ts_lock, MA_OWNED);
638 	MPASS(ts != curthread->td_turnstile);
639 
640 	owner = curthread;
641 	mtx_lock_spin(&td_contested_lock);
642 	turnstile_setowner(ts, owner);
643 	mtx_unlock_spin(&td_contested_lock);
644 
645 	td = turnstile_first_waiter(ts);
646 	MPASS(td != NULL);
647 	MPASS(td->td_proc->p_magic == P_MAGIC);
648 	MPASS(td->td_lock == &ts->ts_lock);
649 
650 	/*
651 	 * Update the priority of the new owner if needed.
652 	 */
653 	thread_lock(owner);
654 	if (td->td_priority < owner->td_priority)
655 		sched_lend_prio(owner, td->td_priority);
656 	thread_unlock(owner);
657 	tc = TC_LOOKUP(ts->ts_lockobj);
658 	mtx_unlock_spin(&ts->ts_lock);
659 	mtx_unlock_spin(&tc->tc_lock);
660 }
661 
662 /*
663  * Block the current thread on the turnstile assicated with 'lock'.  This
664  * function will context switch and not return until this thread has been
665  * woken back up.  This function must be called with the appropriate
666  * turnstile chain locked and will return with it unlocked.
667  */
668 void
669 turnstile_wait(struct turnstile *ts, struct thread *owner, int queue)
670 {
671 	struct turnstile_chain *tc;
672 	struct thread *td, *td1;
673 	struct lock_object *lock;
674 
675 	td = curthread;
676 	mtx_assert(&ts->ts_lock, MA_OWNED);
677 	if (queue == TS_SHARED_QUEUE)
678 		MPASS(owner != NULL);
679 	if (owner)
680 		MPASS(owner->td_proc->p_magic == P_MAGIC);
681 	MPASS(queue == TS_SHARED_QUEUE || queue == TS_EXCLUSIVE_QUEUE);
682 
683 	/*
684 	 * If the lock does not already have a turnstile, use this thread's
685 	 * turnstile.  Otherwise insert the current thread into the
686 	 * turnstile already in use by this lock.
687 	 */
688 	tc = TC_LOOKUP(ts->ts_lockobj);
689 	if (ts == td->td_turnstile) {
690 	mtx_assert(&tc->tc_lock, MA_OWNED);
691 #ifdef TURNSTILE_PROFILING
692 		tc->tc_depth++;
693 		if (tc->tc_depth > tc->tc_max_depth) {
694 			tc->tc_max_depth = tc->tc_depth;
695 			if (tc->tc_max_depth > turnstile_max_depth)
696 				turnstile_max_depth = tc->tc_max_depth;
697 		}
698 #endif
699 		tc = TC_LOOKUP(ts->ts_lockobj);
700 		LIST_INSERT_HEAD(&tc->tc_turnstiles, ts, ts_hash);
701 		KASSERT(TAILQ_EMPTY(&ts->ts_pending),
702 		    ("thread's turnstile has pending threads"));
703 		KASSERT(TAILQ_EMPTY(&ts->ts_blocked[TS_EXCLUSIVE_QUEUE]),
704 		    ("thread's turnstile has exclusive waiters"));
705 		KASSERT(TAILQ_EMPTY(&ts->ts_blocked[TS_SHARED_QUEUE]),
706 		    ("thread's turnstile has shared waiters"));
707 		KASSERT(LIST_EMPTY(&ts->ts_free),
708 		    ("thread's turnstile has a non-empty free list"));
709 		MPASS(ts->ts_lockobj != NULL);
710 		mtx_lock_spin(&td_contested_lock);
711 		TAILQ_INSERT_TAIL(&ts->ts_blocked[queue], td, td_lockq);
712 		turnstile_setowner(ts, owner);
713 		mtx_unlock_spin(&td_contested_lock);
714 	} else {
715 		TAILQ_FOREACH(td1, &ts->ts_blocked[queue], td_lockq)
716 			if (td1->td_priority > td->td_priority)
717 				break;
718 		mtx_lock_spin(&td_contested_lock);
719 		if (td1 != NULL)
720 			TAILQ_INSERT_BEFORE(td1, td, td_lockq);
721 		else
722 			TAILQ_INSERT_TAIL(&ts->ts_blocked[queue], td, td_lockq);
723 		MPASS(owner == ts->ts_owner);
724 		mtx_unlock_spin(&td_contested_lock);
725 		MPASS(td->td_turnstile != NULL);
726 		LIST_INSERT_HEAD(&ts->ts_free, td->td_turnstile, ts_hash);
727 	}
728 	thread_lock(td);
729 	thread_lock_set(td, &ts->ts_lock);
730 	td->td_turnstile = NULL;
731 
732 	/* Save who we are blocked on and switch. */
733 	lock = ts->ts_lockobj;
734 	td->td_tsqueue = queue;
735 	td->td_blocked = ts;
736 	td->td_lockname = lock->lo_name;
737 	TD_SET_LOCK(td);
738 	mtx_unlock_spin(&tc->tc_lock);
739 	propagate_priority(td);
740 
741 	if (LOCK_LOG_TEST(lock, 0))
742 		CTR4(KTR_LOCK, "%s: td %d blocked on [%p] %s", __func__,
743 		    td->td_tid, lock, lock->lo_name);
744 
745 	MPASS(td->td_lock == &ts->ts_lock);
746 	SCHED_STAT_INC(switch_turnstile);
747 	mi_switch(SW_VOL, NULL);
748 
749 	if (LOCK_LOG_TEST(lock, 0))
750 		CTR4(KTR_LOCK, "%s: td %d free from blocked on [%p] %s",
751 		    __func__, td->td_tid, lock, lock->lo_name);
752 	thread_unlock(td);
753 }
754 
755 /*
756  * Pick the highest priority thread on this turnstile and put it on the
757  * pending list.  This must be called with the turnstile chain locked.
758  */
759 int
760 turnstile_signal(struct turnstile *ts, int queue)
761 {
762 	struct turnstile_chain *tc;
763 	struct thread *td;
764 	int empty;
765 
766 	MPASS(ts != NULL);
767 	mtx_assert(&ts->ts_lock, MA_OWNED);
768 	MPASS(curthread->td_proc->p_magic == P_MAGIC);
769 	MPASS(ts->ts_owner == curthread ||
770 	    (queue == TS_EXCLUSIVE_QUEUE && ts->ts_owner == NULL));
771 	MPASS(queue == TS_SHARED_QUEUE || queue == TS_EXCLUSIVE_QUEUE);
772 
773 	/*
774 	 * Pick the highest priority thread blocked on this lock and
775 	 * move it to the pending list.
776 	 */
777 	td = TAILQ_FIRST(&ts->ts_blocked[queue]);
778 	MPASS(td->td_proc->p_magic == P_MAGIC);
779 	mtx_lock_spin(&td_contested_lock);
780 	TAILQ_REMOVE(&ts->ts_blocked[queue], td, td_lockq);
781 	mtx_unlock_spin(&td_contested_lock);
782 	TAILQ_INSERT_TAIL(&ts->ts_pending, td, td_lockq);
783 
784 	/*
785 	 * If the turnstile is now empty, remove it from its chain and
786 	 * give it to the about-to-be-woken thread.  Otherwise take a
787 	 * turnstile from the free list and give it to the thread.
788 	 */
789 	empty = TAILQ_EMPTY(&ts->ts_blocked[TS_EXCLUSIVE_QUEUE]) &&
790 	    TAILQ_EMPTY(&ts->ts_blocked[TS_SHARED_QUEUE]);
791 	if (empty) {
792 		tc = TC_LOOKUP(ts->ts_lockobj);
793 		mtx_assert(&tc->tc_lock, MA_OWNED);
794 		MPASS(LIST_EMPTY(&ts->ts_free));
795 #ifdef TURNSTILE_PROFILING
796 		tc->tc_depth--;
797 #endif
798 	} else
799 		ts = LIST_FIRST(&ts->ts_free);
800 	MPASS(ts != NULL);
801 	LIST_REMOVE(ts, ts_hash);
802 	td->td_turnstile = ts;
803 
804 	return (empty);
805 }
806 
807 /*
808  * Put all blocked threads on the pending list.  This must be called with
809  * the turnstile chain locked.
810  */
811 void
812 turnstile_broadcast(struct turnstile *ts, int queue)
813 {
814 	struct turnstile_chain *tc;
815 	struct turnstile *ts1;
816 	struct thread *td;
817 
818 	MPASS(ts != NULL);
819 	mtx_assert(&ts->ts_lock, MA_OWNED);
820 	MPASS(curthread->td_proc->p_magic == P_MAGIC);
821 	MPASS(ts->ts_owner == curthread ||
822 	    (queue == TS_EXCLUSIVE_QUEUE && ts->ts_owner == NULL));
823 	/*
824 	 * We must have the chain locked so that we can remove the empty
825 	 * turnstile from the hash queue.
826 	 */
827 	tc = TC_LOOKUP(ts->ts_lockobj);
828 	mtx_assert(&tc->tc_lock, MA_OWNED);
829 	MPASS(queue == TS_SHARED_QUEUE || queue == TS_EXCLUSIVE_QUEUE);
830 
831 	/*
832 	 * Transfer the blocked list to the pending list.
833 	 */
834 	mtx_lock_spin(&td_contested_lock);
835 	TAILQ_CONCAT(&ts->ts_pending, &ts->ts_blocked[queue], td_lockq);
836 	mtx_unlock_spin(&td_contested_lock);
837 
838 	/*
839 	 * Give a turnstile to each thread.  The last thread gets
840 	 * this turnstile if the turnstile is empty.
841 	 */
842 	TAILQ_FOREACH(td, &ts->ts_pending, td_lockq) {
843 		if (LIST_EMPTY(&ts->ts_free)) {
844 			MPASS(TAILQ_NEXT(td, td_lockq) == NULL);
845 			ts1 = ts;
846 #ifdef TURNSTILE_PROFILING
847 			tc->tc_depth--;
848 #endif
849 		} else
850 			ts1 = LIST_FIRST(&ts->ts_free);
851 		MPASS(ts1 != NULL);
852 		LIST_REMOVE(ts1, ts_hash);
853 		td->td_turnstile = ts1;
854 	}
855 }
856 
857 /*
858  * Wakeup all threads on the pending list and adjust the priority of the
859  * current thread appropriately.  This must be called with the turnstile
860  * chain locked.
861  */
862 void
863 turnstile_unpend(struct turnstile *ts, int owner_type)
864 {
865 	TAILQ_HEAD( ,thread) pending_threads;
866 	struct turnstile *nts;
867 	struct thread *td;
868 	u_char cp, pri;
869 
870 	MPASS(ts != NULL);
871 	mtx_assert(&ts->ts_lock, MA_OWNED);
872 	MPASS(ts->ts_owner == curthread ||
873 	    (owner_type == TS_SHARED_LOCK && ts->ts_owner == NULL));
874 	MPASS(!TAILQ_EMPTY(&ts->ts_pending));
875 
876 	/*
877 	 * Move the list of pending threads out of the turnstile and
878 	 * into a local variable.
879 	 */
880 	TAILQ_INIT(&pending_threads);
881 	TAILQ_CONCAT(&pending_threads, &ts->ts_pending, td_lockq);
882 #ifdef INVARIANTS
883 	if (TAILQ_EMPTY(&ts->ts_blocked[TS_EXCLUSIVE_QUEUE]) &&
884 	    TAILQ_EMPTY(&ts->ts_blocked[TS_SHARED_QUEUE]))
885 		ts->ts_lockobj = NULL;
886 #endif
887 	/*
888 	 * Adjust the priority of curthread based on other contested
889 	 * locks it owns.  Don't lower the priority below the base
890 	 * priority however.
891 	 */
892 	td = curthread;
893 	pri = PRI_MAX;
894 	thread_lock(td);
895 	mtx_lock_spin(&td_contested_lock);
896 	/*
897 	 * Remove the turnstile from this thread's list of contested locks
898 	 * since this thread doesn't own it anymore.  New threads will
899 	 * not be blocking on the turnstile until it is claimed by a new
900 	 * owner.  There might not be a current owner if this is a shared
901 	 * lock.
902 	 */
903 	if (ts->ts_owner != NULL) {
904 		ts->ts_owner = NULL;
905 		LIST_REMOVE(ts, ts_link);
906 	}
907 	LIST_FOREACH(nts, &td->td_contested, ts_link) {
908 		cp = turnstile_first_waiter(nts)->td_priority;
909 		if (cp < pri)
910 			pri = cp;
911 	}
912 	mtx_unlock_spin(&td_contested_lock);
913 	sched_unlend_prio(td, pri);
914 	thread_unlock(td);
915 	/*
916 	 * Wake up all the pending threads.  If a thread is not blocked
917 	 * on a lock, then it is currently executing on another CPU in
918 	 * turnstile_wait() or sitting on a run queue waiting to resume
919 	 * in turnstile_wait().  Set a flag to force it to try to acquire
920 	 * the lock again instead of blocking.
921 	 */
922 	while (!TAILQ_EMPTY(&pending_threads)) {
923 		td = TAILQ_FIRST(&pending_threads);
924 		TAILQ_REMOVE(&pending_threads, td, td_lockq);
925 		thread_lock(td);
926 		MPASS(td->td_lock == &ts->ts_lock);
927 		MPASS(td->td_proc->p_magic == P_MAGIC);
928 		MPASS(TD_ON_LOCK(td));
929 		TD_CLR_LOCK(td);
930 		MPASS(TD_CAN_RUN(td));
931 		td->td_blocked = NULL;
932 		td->td_lockname = NULL;
933 #ifdef INVARIANTS
934 		td->td_tsqueue = 0xff;
935 #endif
936 		sched_add(td, SRQ_BORING);
937 		thread_unlock(td);
938 	}
939 	mtx_unlock_spin(&ts->ts_lock);
940 }
941 
942 /*
943  * Give up ownership of a turnstile.  This must be called with the
944  * turnstile chain locked.
945  */
946 void
947 turnstile_disown(struct turnstile *ts)
948 {
949 	struct thread *td;
950 	u_char cp, pri;
951 
952 	MPASS(ts != NULL);
953 	mtx_assert(&ts->ts_lock, MA_OWNED);
954 	MPASS(ts->ts_owner == curthread);
955 	MPASS(TAILQ_EMPTY(&ts->ts_pending));
956 	MPASS(!TAILQ_EMPTY(&ts->ts_blocked[TS_EXCLUSIVE_QUEUE]) ||
957 	    !TAILQ_EMPTY(&ts->ts_blocked[TS_SHARED_QUEUE]));
958 
959 	/*
960 	 * Remove the turnstile from this thread's list of contested locks
961 	 * since this thread doesn't own it anymore.  New threads will
962 	 * not be blocking on the turnstile until it is claimed by a new
963 	 * owner.
964 	 */
965 	mtx_lock_spin(&td_contested_lock);
966 	ts->ts_owner = NULL;
967 	LIST_REMOVE(ts, ts_link);
968 	mtx_unlock_spin(&td_contested_lock);
969 
970 	/*
971 	 * Adjust the priority of curthread based on other contested
972 	 * locks it owns.  Don't lower the priority below the base
973 	 * priority however.
974 	 */
975 	td = curthread;
976 	pri = PRI_MAX;
977 	thread_lock(td);
978 	mtx_unlock_spin(&ts->ts_lock);
979 	mtx_lock_spin(&td_contested_lock);
980 	LIST_FOREACH(ts, &td->td_contested, ts_link) {
981 		cp = turnstile_first_waiter(ts)->td_priority;
982 		if (cp < pri)
983 			pri = cp;
984 	}
985 	mtx_unlock_spin(&td_contested_lock);
986 	sched_unlend_prio(td, pri);
987 	thread_unlock(td);
988 }
989 
990 /*
991  * Return the first thread in a turnstile.
992  */
993 struct thread *
994 turnstile_head(struct turnstile *ts, int queue)
995 {
996 #ifdef INVARIANTS
997 
998 	MPASS(ts != NULL);
999 	MPASS(queue == TS_SHARED_QUEUE || queue == TS_EXCLUSIVE_QUEUE);
1000 	mtx_assert(&ts->ts_lock, MA_OWNED);
1001 #endif
1002 	return (TAILQ_FIRST(&ts->ts_blocked[queue]));
1003 }
1004 
1005 /*
1006  * Returns true if a sub-queue of a turnstile is empty.
1007  */
1008 int
1009 turnstile_empty(struct turnstile *ts, int queue)
1010 {
1011 #ifdef INVARIANTS
1012 
1013 	MPASS(ts != NULL);
1014 	MPASS(queue == TS_SHARED_QUEUE || queue == TS_EXCLUSIVE_QUEUE);
1015 	mtx_assert(&ts->ts_lock, MA_OWNED);
1016 #endif
1017 	return (TAILQ_EMPTY(&ts->ts_blocked[queue]));
1018 }
1019 
1020 #ifdef DDB
1021 static void
1022 print_thread(struct thread *td, const char *prefix)
1023 {
1024 
1025 	db_printf("%s%p (tid %d, pid %d, \"%s\")\n", prefix, td, td->td_tid,
1026 	    td->td_proc->p_pid, td->td_name[0] != '\0' ? td->td_name :
1027 	    td->td_name);
1028 }
1029 
1030 static void
1031 print_queue(struct threadqueue *queue, const char *header, const char *prefix)
1032 {
1033 	struct thread *td;
1034 
1035 	db_printf("%s:\n", header);
1036 	if (TAILQ_EMPTY(queue)) {
1037 		db_printf("%sempty\n", prefix);
1038 		return;
1039 	}
1040 	TAILQ_FOREACH(td, queue, td_lockq) {
1041 		print_thread(td, prefix);
1042 	}
1043 }
1044 
1045 DB_SHOW_COMMAND(turnstile, db_show_turnstile)
1046 {
1047 	struct turnstile_chain *tc;
1048 	struct turnstile *ts;
1049 	struct lock_object *lock;
1050 	int i;
1051 
1052 	if (!have_addr)
1053 		return;
1054 
1055 	/*
1056 	 * First, see if there is an active turnstile for the lock indicated
1057 	 * by the address.
1058 	 */
1059 	lock = (struct lock_object *)addr;
1060 	tc = TC_LOOKUP(lock);
1061 	LIST_FOREACH(ts, &tc->tc_turnstiles, ts_hash)
1062 		if (ts->ts_lockobj == lock)
1063 			goto found;
1064 
1065 	/*
1066 	 * Second, see if there is an active turnstile at the address
1067 	 * indicated.
1068 	 */
1069 	for (i = 0; i < TC_TABLESIZE; i++)
1070 		LIST_FOREACH(ts, &turnstile_chains[i].tc_turnstiles, ts_hash) {
1071 			if (ts == (struct turnstile *)addr)
1072 				goto found;
1073 		}
1074 
1075 	db_printf("Unable to locate a turnstile via %p\n", (void *)addr);
1076 	return;
1077 found:
1078 	lock = ts->ts_lockobj;
1079 	db_printf("Lock: %p - (%s) %s\n", lock, LOCK_CLASS(lock)->lc_name,
1080 	    lock->lo_name);
1081 	if (ts->ts_owner)
1082 		print_thread(ts->ts_owner, "Lock Owner: ");
1083 	else
1084 		db_printf("Lock Owner: none\n");
1085 	print_queue(&ts->ts_blocked[TS_SHARED_QUEUE], "Shared Waiters", "\t");
1086 	print_queue(&ts->ts_blocked[TS_EXCLUSIVE_QUEUE], "Exclusive Waiters",
1087 	    "\t");
1088 	print_queue(&ts->ts_pending, "Pending Threads", "\t");
1089 
1090 }
1091 
1092 /*
1093  * Show all the threads a particular thread is waiting on based on
1094  * non-sleepable and non-spin locks.
1095  */
1096 static void
1097 print_lockchain(struct thread *td, const char *prefix)
1098 {
1099 	struct lock_object *lock;
1100 	struct lock_class *class;
1101 	struct turnstile *ts;
1102 
1103 	/*
1104 	 * Follow the chain.  We keep walking as long as the thread is
1105 	 * blocked on a turnstile that has an owner.
1106 	 */
1107 	while (!db_pager_quit) {
1108 		db_printf("%sthread %d (pid %d, %s) ", prefix, td->td_tid,
1109 		    td->td_proc->p_pid, td->td_name[0] != '\0' ? td->td_name :
1110 		    td->td_name);
1111 		switch (td->td_state) {
1112 		case TDS_INACTIVE:
1113 			db_printf("is inactive\n");
1114 			return;
1115 		case TDS_CAN_RUN:
1116 			db_printf("can run\n");
1117 			return;
1118 		case TDS_RUNQ:
1119 			db_printf("is on a run queue\n");
1120 			return;
1121 		case TDS_RUNNING:
1122 			db_printf("running on CPU %d\n", td->td_oncpu);
1123 			return;
1124 		case TDS_INHIBITED:
1125 			if (TD_ON_LOCK(td)) {
1126 				ts = td->td_blocked;
1127 				lock = ts->ts_lockobj;
1128 				class = LOCK_CLASS(lock);
1129 				db_printf("blocked on lock %p (%s) \"%s\"\n",
1130 				    lock, class->lc_name, lock->lo_name);
1131 				if (ts->ts_owner == NULL)
1132 					return;
1133 				td = ts->ts_owner;
1134 				break;
1135 			}
1136 			db_printf("inhibited\n");
1137 			return;
1138 		default:
1139 			db_printf("??? (%#x)\n", td->td_state);
1140 			return;
1141 		}
1142 	}
1143 }
1144 
1145 DB_SHOW_COMMAND(lockchain, db_show_lockchain)
1146 {
1147 	struct thread *td;
1148 
1149 	/* Figure out which thread to start with. */
1150 	if (have_addr)
1151 		td = db_lookup_thread(addr, TRUE);
1152 	else
1153 		td = kdb_thread;
1154 
1155 	print_lockchain(td, "");
1156 }
1157 
1158 DB_SHOW_COMMAND(allchains, db_show_allchains)
1159 {
1160 	struct thread *td;
1161 	struct proc *p;
1162 	int i;
1163 
1164 	i = 1;
1165 	FOREACH_PROC_IN_SYSTEM(p) {
1166 		FOREACH_THREAD_IN_PROC(p, td) {
1167 			if (TD_ON_LOCK(td) && LIST_EMPTY(&td->td_contested)) {
1168 				db_printf("chain %d:\n", i++);
1169 				print_lockchain(td, " ");
1170 			}
1171 			if (db_pager_quit)
1172 				return;
1173 		}
1174 	}
1175 }
1176 
1177 /*
1178  * Show all the threads a particular thread is waiting on based on
1179  * sleepable locks.
1180  */
1181 static void
1182 print_sleepchain(struct thread *td, const char *prefix)
1183 {
1184 	struct thread *owner;
1185 
1186 	/*
1187 	 * Follow the chain.  We keep walking as long as the thread is
1188 	 * blocked on a sleep lock that has an owner.
1189 	 */
1190 	while (!db_pager_quit) {
1191 		db_printf("%sthread %d (pid %d, %s) ", prefix, td->td_tid,
1192 		    td->td_proc->p_pid, td->td_name[0] != '\0' ? td->td_name :
1193 		    td->td_name);
1194 		switch (td->td_state) {
1195 		case TDS_INACTIVE:
1196 			db_printf("is inactive\n");
1197 			return;
1198 		case TDS_CAN_RUN:
1199 			db_printf("can run\n");
1200 			return;
1201 		case TDS_RUNQ:
1202 			db_printf("is on a run queue\n");
1203 			return;
1204 		case TDS_RUNNING:
1205 			db_printf("running on CPU %d\n", td->td_oncpu);
1206 			return;
1207 		case TDS_INHIBITED:
1208 			if (TD_ON_SLEEPQ(td)) {
1209 				if (lockmgr_chain(td, &owner) ||
1210 				    sx_chain(td, &owner)) {
1211 					if (owner == NULL)
1212 						return;
1213 					td = owner;
1214 					break;
1215 				}
1216 				db_printf("sleeping on %p \"%s\"\n",
1217 				    td->td_wchan, td->td_wmesg);
1218 				return;
1219 			}
1220 			db_printf("inhibited\n");
1221 			return;
1222 		default:
1223 			db_printf("??? (%#x)\n", td->td_state);
1224 			return;
1225 		}
1226 	}
1227 }
1228 
1229 DB_SHOW_COMMAND(sleepchain, db_show_sleepchain)
1230 {
1231 	struct thread *td;
1232 
1233 	/* Figure out which thread to start with. */
1234 	if (have_addr)
1235 		td = db_lookup_thread(addr, TRUE);
1236 	else
1237 		td = kdb_thread;
1238 
1239 	print_sleepchain(td, "");
1240 }
1241 
1242 static void	print_waiters(struct turnstile *ts, int indent);
1243 
1244 static void
1245 print_waiter(struct thread *td, int indent)
1246 {
1247 	struct turnstile *ts;
1248 	int i;
1249 
1250 	if (db_pager_quit)
1251 		return;
1252 	for (i = 0; i < indent; i++)
1253 		db_printf(" ");
1254 	print_thread(td, "thread ");
1255 	LIST_FOREACH(ts, &td->td_contested, ts_link)
1256 		print_waiters(ts, indent + 1);
1257 }
1258 
1259 static void
1260 print_waiters(struct turnstile *ts, int indent)
1261 {
1262 	struct lock_object *lock;
1263 	struct lock_class *class;
1264 	struct thread *td;
1265 	int i;
1266 
1267 	if (db_pager_quit)
1268 		return;
1269 	lock = ts->ts_lockobj;
1270 	class = LOCK_CLASS(lock);
1271 	for (i = 0; i < indent; i++)
1272 		db_printf(" ");
1273 	db_printf("lock %p (%s) \"%s\"\n", lock, class->lc_name, lock->lo_name);
1274 	TAILQ_FOREACH(td, &ts->ts_blocked[TS_EXCLUSIVE_QUEUE], td_lockq)
1275 		print_waiter(td, indent + 1);
1276 	TAILQ_FOREACH(td, &ts->ts_blocked[TS_SHARED_QUEUE], td_lockq)
1277 		print_waiter(td, indent + 1);
1278 	TAILQ_FOREACH(td, &ts->ts_pending, td_lockq)
1279 		print_waiter(td, indent + 1);
1280 }
1281 
1282 DB_SHOW_COMMAND(locktree, db_show_locktree)
1283 {
1284 	struct lock_object *lock;
1285 	struct lock_class *class;
1286 	struct turnstile_chain *tc;
1287 	struct turnstile *ts;
1288 
1289 	if (!have_addr)
1290 		return;
1291 	lock = (struct lock_object *)addr;
1292 	tc = TC_LOOKUP(lock);
1293 	LIST_FOREACH(ts, &tc->tc_turnstiles, ts_hash)
1294 		if (ts->ts_lockobj == lock)
1295 			break;
1296 	if (ts == NULL) {
1297 		class = LOCK_CLASS(lock);
1298 		db_printf("lock %p (%s) \"%s\"\n", lock, class->lc_name,
1299 		    lock->lo_name);
1300 	} else
1301 		print_waiters(ts, 0);
1302 }
1303 #endif
1304