xref: /titanic_41/usr/src/lib/libc/port/threads/synch.c (revision 71269a2275bf5a143dad6461eee2710a344e7261)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #include "lint.h"
28 #include "thr_uberdata.h"
29 #include <sys/rtpriocntl.h>
30 #include <sys/sdt.h>
31 #include <atomic.h>
32 
33 #if defined(THREAD_DEBUG)
34 #define	INCR32(x)	(((x) != UINT32_MAX)? (x)++ : 0)
35 #define	INCR(x)		((x)++)
36 #define	DECR(x)		((x)--)
37 #define	MAXINCR(m, x)	((m < ++x)? (m = x) : 0)
38 #else
39 #define	INCR32(x)
40 #define	INCR(x)
41 #define	DECR(x)
42 #define	MAXINCR(m, x)
43 #endif
44 
45 /*
46  * This mutex is initialized to be held by lwp#1.
47  * It is used to block a thread that has returned from a mutex_lock()
48  * of a LOCK_PRIO_INHERIT mutex with an unrecoverable error.
49  */
50 mutex_t	stall_mutex = DEFAULTMUTEX;
51 
52 static int shared_mutex_held(mutex_t *);
53 static int mutex_queuelock_adaptive(mutex_t *);
54 static void mutex_wakeup_all(mutex_t *);
55 
56 /*
57  * Lock statistics support functions.
58  */
59 void
60 record_begin_hold(tdb_mutex_stats_t *msp)
61 {
62 	tdb_incr(msp->mutex_lock);
63 	msp->mutex_begin_hold = gethrtime();
64 }
65 
66 hrtime_t
67 record_hold_time(tdb_mutex_stats_t *msp)
68 {
69 	hrtime_t now = gethrtime();
70 
71 	if (msp->mutex_begin_hold)
72 		msp->mutex_hold_time += now - msp->mutex_begin_hold;
73 	msp->mutex_begin_hold = 0;
74 	return (now);
75 }
76 
77 /*
78  * Called once at library initialization.
79  */
80 void
81 mutex_setup(void)
82 {
83 	if (set_lock_byte(&stall_mutex.mutex_lockw))
84 		thr_panic("mutex_setup() cannot acquire stall_mutex");
85 	stall_mutex.mutex_owner = (uintptr_t)curthread;
86 }
87 
88 /*
89  * The default spin count of 1000 is experimentally determined.
90  * On sun4u machines with any number of processors it could be raised
91  * to 10,000 but that (experimentally) makes almost no difference.
92  * The environment variable:
93  *	_THREAD_ADAPTIVE_SPIN=count
94  * can be used to override and set the count in the range [0 .. 1,000,000].
95  */
96 int	thread_adaptive_spin = 1000;
97 uint_t	thread_max_spinners = 100;
98 int	thread_queue_verify = 0;
99 static	int	ncpus;
100 
101 /*
102  * Distinguish spinning for queue locks from spinning for regular locks.
103  * We try harder to acquire queue locks by spinning.
104  * The environment variable:
105  *	_THREAD_QUEUE_SPIN=count
106  * can be used to override and set the count in the range [0 .. 1,000,000].
107  */
108 int	thread_queue_spin = 10000;
109 
110 #define	ALL_ATTRIBUTES				\
111 	(LOCK_RECURSIVE | LOCK_ERRORCHECK |	\
112 	LOCK_PRIO_INHERIT | LOCK_PRIO_PROTECT |	\
113 	LOCK_ROBUST)
114 
115 /*
116  * 'type' can be one of USYNC_THREAD, USYNC_PROCESS, or USYNC_PROCESS_ROBUST,
117  * augmented by zero or more the flags:
118  *	LOCK_RECURSIVE
119  *	LOCK_ERRORCHECK
120  *	LOCK_PRIO_INHERIT
121  *	LOCK_PRIO_PROTECT
122  *	LOCK_ROBUST
123  */
124 #pragma weak _mutex_init = mutex_init
125 /* ARGSUSED2 */
126 int
127 mutex_init(mutex_t *mp, int type, void *arg)
128 {
129 	int basetype = (type & ~ALL_ATTRIBUTES);
130 	const pcclass_t *pccp;
131 	int error = 0;
132 	int ceil;
133 
134 	if (basetype == USYNC_PROCESS_ROBUST) {
135 		/*
136 		 * USYNC_PROCESS_ROBUST is a deprecated historical type.
137 		 * We change it into (USYNC_PROCESS | LOCK_ROBUST) but
138 		 * retain the USYNC_PROCESS_ROBUST flag so we can return
139 		 * ELOCKUNMAPPED when necessary (only USYNC_PROCESS_ROBUST
140 		 * mutexes will ever draw ELOCKUNMAPPED).
141 		 */
142 		type |= (USYNC_PROCESS | LOCK_ROBUST);
143 		basetype = USYNC_PROCESS;
144 	}
145 
146 	if (type & LOCK_PRIO_PROTECT)
147 		pccp = get_info_by_policy(SCHED_FIFO);
148 	if ((basetype != USYNC_THREAD && basetype != USYNC_PROCESS) ||
149 	    (type & (LOCK_PRIO_INHERIT | LOCK_PRIO_PROTECT))
150 	    == (LOCK_PRIO_INHERIT | LOCK_PRIO_PROTECT) ||
151 	    ((type & LOCK_PRIO_PROTECT) &&
152 	    ((ceil = *(int *)arg) < pccp->pcc_primin ||
153 	    ceil > pccp->pcc_primax))) {
154 		error = EINVAL;
155 	} else if (type & LOCK_ROBUST) {
156 		/*
157 		 * Callers of mutex_init() with the LOCK_ROBUST attribute
158 		 * are required to pass an initially all-zero mutex.
159 		 * Multiple calls to mutex_init() are allowed; all but
160 		 * the first return EBUSY.  A call to mutex_init() is
161 		 * allowed to make an inconsistent robust lock consistent
162 		 * (for historical usage, even though the proper interface
163 		 * for this is mutex_consistent()).  Note that we use
164 		 * atomic_or_16() to set the LOCK_INITED flag so as
165 		 * not to disturb surrounding bits (LOCK_OWNERDEAD, etc).
166 		 */
167 		if (!(mp->mutex_flag & LOCK_INITED)) {
168 			mp->mutex_type = (uint8_t)type;
169 			atomic_or_16(&mp->mutex_flag, LOCK_INITED);
170 			mp->mutex_magic = MUTEX_MAGIC;
171 		} else if (type != mp->mutex_type ||
172 		    ((type & LOCK_PRIO_PROTECT) && mp->mutex_ceiling != ceil)) {
173 			error = EINVAL;
174 		} else if (mutex_consistent(mp) != 0) {
175 			error = EBUSY;
176 		}
177 		/* register a process robust mutex with the kernel */
178 		if (basetype == USYNC_PROCESS)
179 			register_lock(mp);
180 	} else {
181 		(void) memset(mp, 0, sizeof (*mp));
182 		mp->mutex_type = (uint8_t)type;
183 		mp->mutex_flag = LOCK_INITED;
184 		mp->mutex_magic = MUTEX_MAGIC;
185 	}
186 
187 	if (error == 0 && (type & LOCK_PRIO_PROTECT)) {
188 		mp->mutex_ceiling = ceil;
189 	}
190 
191 	/*
192 	 * This should be at the beginning of the function,
193 	 * but for the sake of old broken applications that
194 	 * do not have proper alignment for their mutexes
195 	 * (and don't check the return code from mutex_init),
196 	 * we put it here, after initializing the mutex regardless.
197 	 */
198 	if (error == 0 &&
199 	    ((uintptr_t)mp & (_LONG_LONG_ALIGNMENT - 1)) &&
200 	    curthread->ul_misaligned == 0)
201 		error = EINVAL;
202 
203 	return (error);
204 }
205 
206 /*
207  * Delete mp from list of ceiling mutexes owned by curthread.
208  * Return 1 if the head of the chain was updated.
209  */
210 int
211 _ceil_mylist_del(mutex_t *mp)
212 {
213 	ulwp_t *self = curthread;
214 	mxchain_t **mcpp;
215 	mxchain_t *mcp;
216 
217 	for (mcpp = &self->ul_mxchain;
218 	    (mcp = *mcpp) != NULL;
219 	    mcpp = &mcp->mxchain_next) {
220 		if (mcp->mxchain_mx == mp) {
221 			*mcpp = mcp->mxchain_next;
222 			lfree(mcp, sizeof (*mcp));
223 			return (mcpp == &self->ul_mxchain);
224 		}
225 	}
226 	return (0);
227 }
228 
229 /*
230  * Add mp to the list of ceiling mutexes owned by curthread.
231  * Return ENOMEM if no memory could be allocated.
232  */
233 int
234 _ceil_mylist_add(mutex_t *mp)
235 {
236 	ulwp_t *self = curthread;
237 	mxchain_t *mcp;
238 
239 	if ((mcp = lmalloc(sizeof (*mcp))) == NULL)
240 		return (ENOMEM);
241 	mcp->mxchain_mx = mp;
242 	mcp->mxchain_next = self->ul_mxchain;
243 	self->ul_mxchain = mcp;
244 	return (0);
245 }
246 
247 /*
248  * Helper function for _ceil_prio_inherit() and _ceil_prio_waive(), below.
249  */
250 static void
251 set_rt_priority(ulwp_t *self, int prio)
252 {
253 	pcparms_t pcparm;
254 
255 	pcparm.pc_cid = self->ul_rtclassid;
256 	((rtparms_t *)pcparm.pc_clparms)->rt_tqnsecs = RT_NOCHANGE;
257 	((rtparms_t *)pcparm.pc_clparms)->rt_pri = prio;
258 	(void) priocntl(P_LWPID, self->ul_lwpid, PC_SETPARMS, &pcparm);
259 }
260 
261 /*
262  * Inherit priority from ceiling.
263  * This changes the effective priority, not the assigned priority.
264  */
265 void
266 _ceil_prio_inherit(int prio)
267 {
268 	ulwp_t *self = curthread;
269 
270 	self->ul_epri = prio;
271 	set_rt_priority(self, prio);
272 }
273 
274 /*
275  * Waive inherited ceiling priority.  Inherit from head of owned ceiling locks
276  * if holding at least one ceiling lock.  If no ceiling locks are held at this
277  * point, disinherit completely, reverting back to assigned priority.
278  */
279 void
280 _ceil_prio_waive(void)
281 {
282 	ulwp_t *self = curthread;
283 	mxchain_t *mcp = self->ul_mxchain;
284 	int prio;
285 
286 	if (mcp == NULL) {
287 		prio = self->ul_pri;
288 		self->ul_epri = 0;
289 	} else {
290 		prio = mcp->mxchain_mx->mutex_ceiling;
291 		self->ul_epri = prio;
292 	}
293 	set_rt_priority(self, prio);
294 }
295 
296 /*
297  * Clear the lock byte.  Retain the waiters byte and the spinners byte.
298  * Return the old value of the lock word.
299  */
300 static uint32_t
301 clear_lockbyte(volatile uint32_t *lockword)
302 {
303 	uint32_t old;
304 	uint32_t new;
305 
306 	do {
307 		old = *lockword;
308 		new = old & ~LOCKMASK;
309 	} while (atomic_cas_32(lockword, old, new) != old);
310 
311 	return (old);
312 }
313 
314 /*
315  * Same as clear_lockbyte(), but operates on mutex_lockword64.
316  * The mutex_ownerpid field is cleared along with the lock byte.
317  */
318 static uint64_t
319 clear_lockbyte64(volatile uint64_t *lockword64)
320 {
321 	uint64_t old;
322 	uint64_t new;
323 
324 	do {
325 		old = *lockword64;
326 		new = old & ~LOCKMASK64;
327 	} while (atomic_cas_64(lockword64, old, new) != old);
328 
329 	return (old);
330 }
331 
332 /*
333  * Similar to set_lock_byte(), which only tries to set the lock byte.
334  * Here, we attempt to set the lock byte AND the mutex_ownerpid, keeping
335  * the remaining bytes constant.  This atomic operation is required for the
336  * correctness of process-shared robust locks, otherwise there would be
337  * a window or vulnerability in which the lock byte had been set but the
338  * mutex_ownerpid had not yet been set.  If the process were to die in
339  * this window of vulnerability (due to some other thread calling exit()
340  * or the process receiving a fatal signal), the mutex would be left locked
341  * but without a process-ID to determine which process was holding the lock.
342  * The kernel would then be unable to mark the robust mutex as LOCK_OWNERDEAD
343  * when the process died.  For all other cases of process-shared locks, this
344  * operation is just a convenience, for the sake of common code.
345  *
346  * This operation requires process-shared robust locks to be properly
347  * aligned on an 8-byte boundary, at least on sparc machines, lest the
348  * operation incur an alignment fault.  This is automatic when locks
349  * are declared properly using the mutex_t or pthread_mutex_t data types
350  * and the application does not allocate dynamic memory on less than an
351  * 8-byte boundary.  See the 'horrible hack' comments below for cases
352  * dealing with such broken applications.
353  */
354 static int
355 set_lock_byte64(volatile uint64_t *lockword64, pid_t ownerpid)
356 {
357 	uint64_t old;
358 	uint64_t new;
359 
360 	old = *lockword64 & ~LOCKMASK64;
361 	new = old | ((uint64_t)(uint_t)ownerpid << PIDSHIFT) | LOCKBYTE64;
362 	if (atomic_cas_64(lockword64, old, new) == old)
363 		return (LOCKCLEAR);
364 
365 	return (LOCKSET);
366 }
367 
368 /*
369  * Increment the spinners count in the mutex lock word.
370  * Return 0 on success.  Return -1 if the count would overflow.
371  */
372 static int
373 spinners_incr(volatile uint32_t *lockword, uint8_t max_spinners)
374 {
375 	uint32_t old;
376 	uint32_t new;
377 
378 	do {
379 		old = *lockword;
380 		if (((old & SPINNERMASK) >> SPINNERSHIFT) >= max_spinners)
381 			return (-1);
382 		new = old + (1 << SPINNERSHIFT);
383 	} while (atomic_cas_32(lockword, old, new) != old);
384 
385 	return (0);
386 }
387 
388 /*
389  * Decrement the spinners count in the mutex lock word.
390  * Return the new value of the lock word.
391  */
392 static uint32_t
393 spinners_decr(volatile uint32_t *lockword)
394 {
395 	uint32_t old;
396 	uint32_t new;
397 
398 	do {
399 		new = old = *lockword;
400 		if (new & SPINNERMASK)
401 			new -= (1 << SPINNERSHIFT);
402 	} while (atomic_cas_32(lockword, old, new) != old);
403 
404 	return (new);
405 }
406 
407 /*
408  * Non-preemptive spin locks.  Used by queue_lock().
409  * No lock statistics are gathered for these locks.
410  * No DTrace probes are provided for these locks.
411  */
412 void
413 spin_lock_set(mutex_t *mp)
414 {
415 	ulwp_t *self = curthread;
416 
417 	no_preempt(self);
418 	if (set_lock_byte(&mp->mutex_lockw) == 0) {
419 		mp->mutex_owner = (uintptr_t)self;
420 		return;
421 	}
422 	/*
423 	 * Spin for a while, attempting to acquire the lock.
424 	 */
425 	INCR32(self->ul_spin_lock_spin);
426 	if (mutex_queuelock_adaptive(mp) == 0 ||
427 	    set_lock_byte(&mp->mutex_lockw) == 0) {
428 		mp->mutex_owner = (uintptr_t)self;
429 		return;
430 	}
431 	/*
432 	 * Try harder if we were previously at a no premption level.
433 	 */
434 	if (self->ul_preempt > 1) {
435 		INCR32(self->ul_spin_lock_spin2);
436 		if (mutex_queuelock_adaptive(mp) == 0 ||
437 		    set_lock_byte(&mp->mutex_lockw) == 0) {
438 			mp->mutex_owner = (uintptr_t)self;
439 			return;
440 		}
441 	}
442 	/*
443 	 * Give up and block in the kernel for the mutex.
444 	 */
445 	INCR32(self->ul_spin_lock_sleep);
446 	(void) ___lwp_mutex_timedlock(mp, NULL);
447 	mp->mutex_owner = (uintptr_t)self;
448 }
449 
450 void
451 spin_lock_clear(mutex_t *mp)
452 {
453 	ulwp_t *self = curthread;
454 
455 	mp->mutex_owner = 0;
456 	if (atomic_swap_32(&mp->mutex_lockword, 0) & WAITERMASK) {
457 		(void) ___lwp_mutex_wakeup(mp, 0);
458 		INCR32(self->ul_spin_lock_wakeup);
459 	}
460 	preempt(self);
461 }
462 
463 /*
464  * Allocate the sleep queue hash table.
465  */
466 void
467 queue_alloc(void)
468 {
469 	ulwp_t *self = curthread;
470 	uberdata_t *udp = self->ul_uberdata;
471 	queue_head_t *qp;
472 	void *data;
473 	int i;
474 
475 	/*
476 	 * No locks are needed; we call here only when single-threaded.
477 	 */
478 	ASSERT(self == udp->ulwp_one);
479 	ASSERT(!udp->uberflags.uf_mt);
480 	if ((data = mmap(NULL, 2 * QHASHSIZE * sizeof (queue_head_t),
481 	    PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, (off_t)0))
482 	    == MAP_FAILED)
483 		thr_panic("cannot allocate thread queue_head table");
484 	udp->queue_head = qp = (queue_head_t *)data;
485 	for (i = 0; i < 2 * QHASHSIZE; qp++, i++) {
486 		qp->qh_type = (i < QHASHSIZE)? MX : CV;
487 		qp->qh_lock.mutex_flag = LOCK_INITED;
488 		qp->qh_lock.mutex_magic = MUTEX_MAGIC;
489 		qp->qh_hlist = &qp->qh_def_root;
490 #if defined(THREAD_DEBUG)
491 		qp->qh_hlen = 1;
492 		qp->qh_hmax = 1;
493 #endif
494 	}
495 }
496 
497 #if defined(THREAD_DEBUG)
498 
499 /*
500  * Debugging: verify correctness of a sleep queue.
501  */
502 void
503 QVERIFY(queue_head_t *qp)
504 {
505 	ulwp_t *self = curthread;
506 	uberdata_t *udp = self->ul_uberdata;
507 	queue_root_t *qrp;
508 	ulwp_t *ulwp;
509 	ulwp_t *prev;
510 	uint_t index;
511 	uint32_t cnt;
512 	char qtype;
513 	void *wchan;
514 
515 	ASSERT(qp >= udp->queue_head && (qp - udp->queue_head) < 2 * QHASHSIZE);
516 	ASSERT(MUTEX_OWNED(&qp->qh_lock, self));
517 	for (cnt = 0, qrp = qp->qh_hlist; qrp != NULL; qrp = qrp->qr_next) {
518 		cnt++;
519 		ASSERT((qrp->qr_head != NULL && qrp->qr_tail != NULL) ||
520 		    (qrp->qr_head == NULL && qrp->qr_tail == NULL));
521 	}
522 	ASSERT(qp->qh_hlen == cnt && qp->qh_hmax >= cnt);
523 	qtype = ((qp - udp->queue_head) < QHASHSIZE)? MX : CV;
524 	ASSERT(qp->qh_type == qtype);
525 	if (!thread_queue_verify)
526 		return;
527 	/* real expensive stuff, only for _THREAD_QUEUE_VERIFY */
528 	for (cnt = 0, qrp = qp->qh_hlist; qrp != NULL; qrp = qrp->qr_next) {
529 		for (prev = NULL, ulwp = qrp->qr_head; ulwp != NULL;
530 		    prev = ulwp, ulwp = ulwp->ul_link) {
531 			cnt++;
532 			if (ulwp->ul_writer)
533 				ASSERT(prev == NULL || prev->ul_writer);
534 			ASSERT(ulwp->ul_qtype == qtype);
535 			ASSERT(ulwp->ul_wchan != NULL);
536 			ASSERT(ulwp->ul_sleepq == qp);
537 			wchan = ulwp->ul_wchan;
538 			ASSERT(qrp->qr_wchan == wchan);
539 			index = QUEUE_HASH(wchan, qtype);
540 			ASSERT(&udp->queue_head[index] == qp);
541 		}
542 		ASSERT(qrp->qr_tail == prev);
543 	}
544 	ASSERT(qp->qh_qlen == cnt);
545 }
546 
547 #else	/* THREAD_DEBUG */
548 
549 #define	QVERIFY(qp)
550 
551 #endif	/* THREAD_DEBUG */
552 
553 /*
554  * Acquire a queue head.
555  */
556 queue_head_t *
557 queue_lock(void *wchan, int qtype)
558 {
559 	uberdata_t *udp = curthread->ul_uberdata;
560 	queue_head_t *qp;
561 	queue_root_t *qrp;
562 
563 	ASSERT(qtype == MX || qtype == CV);
564 
565 	/*
566 	 * It is possible that we could be called while still single-threaded.
567 	 * If so, we call queue_alloc() to allocate the queue_head[] array.
568 	 */
569 	if ((qp = udp->queue_head) == NULL) {
570 		queue_alloc();
571 		qp = udp->queue_head;
572 	}
573 	qp += QUEUE_HASH(wchan, qtype);
574 	spin_lock_set(&qp->qh_lock);
575 	for (qrp = qp->qh_hlist; qrp != NULL; qrp = qrp->qr_next)
576 		if (qrp->qr_wchan == wchan)
577 			break;
578 	if (qrp == NULL && qp->qh_def_root.qr_head == NULL) {
579 		/* the default queue root is available; use it */
580 		qrp = &qp->qh_def_root;
581 		qrp->qr_wchan = wchan;
582 		ASSERT(qrp->qr_next == NULL);
583 		ASSERT(qrp->qr_tail == NULL &&
584 		    qrp->qr_rtcount == 0 && qrp->qr_qlen == 0);
585 	}
586 	qp->qh_wchan = wchan;	/* valid until queue_unlock() is called */
587 	qp->qh_root = qrp;	/* valid until queue_unlock() is called */
588 	INCR32(qp->qh_lockcount);
589 	QVERIFY(qp);
590 	return (qp);
591 }
592 
593 /*
594  * Release a queue head.
595  */
596 void
597 queue_unlock(queue_head_t *qp)
598 {
599 	QVERIFY(qp);
600 	spin_lock_clear(&qp->qh_lock);
601 }
602 
603 /*
604  * For rwlock queueing, we must queue writers ahead of readers of the
605  * same priority.  We do this by making writers appear to have a half
606  * point higher priority for purposes of priority comparisons below.
607  */
608 #define	CMP_PRIO(ulwp)	((real_priority(ulwp) << 1) + (ulwp)->ul_writer)
609 
610 void
611 enqueue(queue_head_t *qp, ulwp_t *ulwp, int force_fifo)
612 {
613 	queue_root_t *qrp;
614 	ulwp_t **ulwpp;
615 	ulwp_t *next;
616 	int pri = CMP_PRIO(ulwp);
617 
618 	ASSERT(MUTEX_OWNED(&qp->qh_lock, curthread));
619 	ASSERT(ulwp->ul_sleepq != qp);
620 
621 	if ((qrp = qp->qh_root) == NULL) {
622 		/* use the thread's queue root for the linkage */
623 		qrp = &ulwp->ul_queue_root;
624 		qrp->qr_next = qp->qh_hlist;
625 		qrp->qr_prev = NULL;
626 		qrp->qr_head = NULL;
627 		qrp->qr_tail = NULL;
628 		qrp->qr_wchan = qp->qh_wchan;
629 		qrp->qr_rtcount = 0;
630 		qrp->qr_qlen = 0;
631 		qrp->qr_qmax = 0;
632 		qp->qh_hlist->qr_prev = qrp;
633 		qp->qh_hlist = qrp;
634 		qp->qh_root = qrp;
635 		MAXINCR(qp->qh_hmax, qp->qh_hlen);
636 	}
637 
638 	/*
639 	 * LIFO queue ordering is unfair and can lead to starvation,
640 	 * but it gives better performance for heavily contended locks.
641 	 * We use thread_queue_fifo (range is 0..8) to determine
642 	 * the frequency of FIFO vs LIFO queuing:
643 	 *	0 : every 256th time	(almost always LIFO)
644 	 *	1 : every 128th time
645 	 *	2 : every 64th  time
646 	 *	3 : every 32nd  time
647 	 *	4 : every 16th  time	(the default value, mostly LIFO)
648 	 *	5 : every 8th   time
649 	 *	6 : every 4th   time
650 	 *	7 : every 2nd   time
651 	 *	8 : every time		(never LIFO, always FIFO)
652 	 * Note that there is always some degree of FIFO ordering.
653 	 * This breaks live lock conditions that occur in applications
654 	 * that are written assuming (incorrectly) that threads acquire
655 	 * locks fairly, that is, in roughly round-robin order.
656 	 * In any event, the queue is maintained in kernel priority order.
657 	 *
658 	 * If force_fifo is non-zero, fifo queueing is forced.
659 	 * SUSV3 requires this for semaphores.
660 	 */
661 	if (qrp->qr_head == NULL) {
662 		/*
663 		 * The queue is empty.  LIFO/FIFO doesn't matter.
664 		 */
665 		ASSERT(qrp->qr_tail == NULL);
666 		ulwpp = &qrp->qr_head;
667 	} else if (force_fifo |
668 	    (((++qp->qh_qcnt << curthread->ul_queue_fifo) & 0xff) == 0)) {
669 		/*
670 		 * Enqueue after the last thread whose priority is greater
671 		 * than or equal to the priority of the thread being queued.
672 		 * Attempt first to go directly onto the tail of the queue.
673 		 */
674 		if (pri <= CMP_PRIO(qrp->qr_tail))
675 			ulwpp = &qrp->qr_tail->ul_link;
676 		else {
677 			for (ulwpp = &qrp->qr_head; (next = *ulwpp) != NULL;
678 			    ulwpp = &next->ul_link)
679 				if (pri > CMP_PRIO(next))
680 					break;
681 		}
682 	} else {
683 		/*
684 		 * Enqueue before the first thread whose priority is less
685 		 * than or equal to the priority of the thread being queued.
686 		 * Hopefully we can go directly onto the head of the queue.
687 		 */
688 		for (ulwpp = &qrp->qr_head; (next = *ulwpp) != NULL;
689 		    ulwpp = &next->ul_link)
690 			if (pri >= CMP_PRIO(next))
691 				break;
692 	}
693 	if ((ulwp->ul_link = *ulwpp) == NULL)
694 		qrp->qr_tail = ulwp;
695 	*ulwpp = ulwp;
696 
697 	ulwp->ul_sleepq = qp;
698 	ulwp->ul_wchan = qp->qh_wchan;
699 	ulwp->ul_qtype = qp->qh_type;
700 	if ((ulwp->ul_schedctl != NULL &&
701 	    ulwp->ul_schedctl->sc_cid == ulwp->ul_rtclassid) |
702 	    ulwp->ul_pilocks) {
703 		ulwp->ul_rtqueued = 1;
704 		qrp->qr_rtcount++;
705 	}
706 	MAXINCR(qrp->qr_qmax, qrp->qr_qlen);
707 	MAXINCR(qp->qh_qmax, qp->qh_qlen);
708 }
709 
710 /*
711  * Helper function for queue_slot() and queue_slot_rt().
712  * Try to find a non-suspended thread on the queue.
713  */
714 static ulwp_t **
715 queue_slot_runnable(ulwp_t **ulwpp, ulwp_t **prevp, int rt)
716 {
717 	ulwp_t *ulwp;
718 	ulwp_t **foundpp = NULL;
719 	int priority = -1;
720 	ulwp_t *prev;
721 	int tpri;
722 
723 	for (prev = NULL;
724 	    (ulwp = *ulwpp) != NULL;
725 	    prev = ulwp, ulwpp = &ulwp->ul_link) {
726 		if (ulwp->ul_stop)	/* skip suspended threads */
727 			continue;
728 		tpri = rt? CMP_PRIO(ulwp) : 0;
729 		if (tpri > priority) {
730 			foundpp = ulwpp;
731 			*prevp = prev;
732 			priority = tpri;
733 			if (!rt)
734 				break;
735 		}
736 	}
737 	return (foundpp);
738 }
739 
740 /*
741  * For real-time, we search the entire queue because the dispatch
742  * (kernel) priorities may have changed since enqueueing.
743  */
744 static ulwp_t **
745 queue_slot_rt(ulwp_t **ulwpp_org, ulwp_t **prevp)
746 {
747 	ulwp_t **ulwpp = ulwpp_org;
748 	ulwp_t *ulwp = *ulwpp;
749 	ulwp_t **foundpp = ulwpp;
750 	int priority = CMP_PRIO(ulwp);
751 	ulwp_t *prev;
752 	int tpri;
753 
754 	for (prev = ulwp, ulwpp = &ulwp->ul_link;
755 	    (ulwp = *ulwpp) != NULL;
756 	    prev = ulwp, ulwpp = &ulwp->ul_link) {
757 		tpri = CMP_PRIO(ulwp);
758 		if (tpri > priority) {
759 			foundpp = ulwpp;
760 			*prevp = prev;
761 			priority = tpri;
762 		}
763 	}
764 	ulwp = *foundpp;
765 
766 	/*
767 	 * Try not to return a suspended thread.
768 	 * This mimics the old libthread's behavior.
769 	 */
770 	if (ulwp->ul_stop &&
771 	    (ulwpp = queue_slot_runnable(ulwpp_org, prevp, 1)) != NULL) {
772 		foundpp = ulwpp;
773 		ulwp = *foundpp;
774 	}
775 	ulwp->ul_rt = 1;
776 	return (foundpp);
777 }
778 
779 ulwp_t **
780 queue_slot(queue_head_t *qp, ulwp_t **prevp, int *more)
781 {
782 	queue_root_t *qrp;
783 	ulwp_t **ulwpp;
784 	ulwp_t *ulwp;
785 	int rt;
786 
787 	ASSERT(MUTEX_OWNED(&qp->qh_lock, curthread));
788 
789 	if ((qrp = qp->qh_root) == NULL || (ulwp = qrp->qr_head) == NULL) {
790 		*more = 0;
791 		return (NULL);		/* no lwps on the queue */
792 	}
793 	rt = (qrp->qr_rtcount != 0);
794 	*prevp = NULL;
795 	if (ulwp->ul_link == NULL) {	/* only one lwp on the queue */
796 		*more = 0;
797 		ulwp->ul_rt = rt;
798 		return (&qrp->qr_head);
799 	}
800 	*more = 1;
801 
802 	if (rt)		/* real-time queue */
803 		return (queue_slot_rt(&qrp->qr_head, prevp));
804 	/*
805 	 * Try not to return a suspended thread.
806 	 * This mimics the old libthread's behavior.
807 	 */
808 	if (ulwp->ul_stop &&
809 	    (ulwpp = queue_slot_runnable(&qrp->qr_head, prevp, 0)) != NULL) {
810 		ulwp = *ulwpp;
811 		ulwp->ul_rt = 0;
812 		return (ulwpp);
813 	}
814 	/*
815 	 * The common case; just pick the first thread on the queue.
816 	 */
817 	ulwp->ul_rt = 0;
818 	return (&qrp->qr_head);
819 }
820 
821 /*
822  * Common code for unlinking an lwp from a user-level sleep queue.
823  */
824 void
825 queue_unlink(queue_head_t *qp, ulwp_t **ulwpp, ulwp_t *prev)
826 {
827 	queue_root_t *qrp = qp->qh_root;
828 	queue_root_t *nqrp;
829 	ulwp_t *ulwp = *ulwpp;
830 	ulwp_t *next;
831 
832 	ASSERT(MUTEX_OWNED(&qp->qh_lock, curthread));
833 	ASSERT(qp->qh_wchan != NULL && ulwp->ul_wchan == qp->qh_wchan);
834 
835 	DECR(qp->qh_qlen);
836 	DECR(qrp->qr_qlen);
837 	if (ulwp->ul_rtqueued) {
838 		ulwp->ul_rtqueued = 0;
839 		qrp->qr_rtcount--;
840 	}
841 	next = ulwp->ul_link;
842 	*ulwpp = next;
843 	ulwp->ul_link = NULL;
844 	if (qrp->qr_tail == ulwp)
845 		qrp->qr_tail = prev;
846 	if (qrp == &ulwp->ul_queue_root) {
847 		/*
848 		 * We can't continue to use the unlinked thread's
849 		 * queue root for the linkage.
850 		 */
851 		queue_root_t *qr_next = qrp->qr_next;
852 		queue_root_t *qr_prev = qrp->qr_prev;
853 
854 		if (qrp->qr_tail) {
855 			/* switch to using the last thread's queue root */
856 			ASSERT(qrp->qr_qlen != 0);
857 			nqrp = &qrp->qr_tail->ul_queue_root;
858 			*nqrp = *qrp;
859 			if (qr_next)
860 				qr_next->qr_prev = nqrp;
861 			if (qr_prev)
862 				qr_prev->qr_next = nqrp;
863 			else
864 				qp->qh_hlist = nqrp;
865 			qp->qh_root = nqrp;
866 		} else {
867 			/* empty queue root; just delete from the hash list */
868 			ASSERT(qrp->qr_qlen == 0);
869 			if (qr_next)
870 				qr_next->qr_prev = qr_prev;
871 			if (qr_prev)
872 				qr_prev->qr_next = qr_next;
873 			else
874 				qp->qh_hlist = qr_next;
875 			qp->qh_root = NULL;
876 			DECR(qp->qh_hlen);
877 		}
878 	}
879 }
880 
881 ulwp_t *
882 dequeue(queue_head_t *qp, int *more)
883 {
884 	ulwp_t **ulwpp;
885 	ulwp_t *ulwp;
886 	ulwp_t *prev;
887 
888 	if ((ulwpp = queue_slot(qp, &prev, more)) == NULL)
889 		return (NULL);
890 	ulwp = *ulwpp;
891 	queue_unlink(qp, ulwpp, prev);
892 	ulwp->ul_sleepq = NULL;
893 	ulwp->ul_wchan = NULL;
894 	return (ulwp);
895 }
896 
897 /*
898  * Return a pointer to the highest priority thread sleeping on wchan.
899  */
900 ulwp_t *
901 queue_waiter(queue_head_t *qp)
902 {
903 	ulwp_t **ulwpp;
904 	ulwp_t *prev;
905 	int more;
906 
907 	if ((ulwpp = queue_slot(qp, &prev, &more)) == NULL)
908 		return (NULL);
909 	return (*ulwpp);
910 }
911 
912 int
913 dequeue_self(queue_head_t *qp)
914 {
915 	ulwp_t *self = curthread;
916 	queue_root_t *qrp;
917 	ulwp_t **ulwpp;
918 	ulwp_t *ulwp;
919 	ulwp_t *prev;
920 	int found = 0;
921 
922 	ASSERT(MUTEX_OWNED(&qp->qh_lock, self));
923 
924 	/* find self on the sleep queue */
925 	if ((qrp = qp->qh_root) != NULL) {
926 		for (prev = NULL, ulwpp = &qrp->qr_head;
927 		    (ulwp = *ulwpp) != NULL;
928 		    prev = ulwp, ulwpp = &ulwp->ul_link) {
929 			if (ulwp == self) {
930 				queue_unlink(qp, ulwpp, prev);
931 				self->ul_cvmutex = NULL;
932 				self->ul_sleepq = NULL;
933 				self->ul_wchan = NULL;
934 				found = 1;
935 				break;
936 			}
937 		}
938 	}
939 
940 	if (!found)
941 		thr_panic("dequeue_self(): curthread not found on queue");
942 
943 	return ((qrp = qp->qh_root) != NULL && qrp->qr_head != NULL);
944 }
945 
946 /*
947  * Called from call_user_handler() and _thrp_suspend() to take
948  * ourself off of our sleep queue so we can grab locks.
949  */
950 void
951 unsleep_self(void)
952 {
953 	ulwp_t *self = curthread;
954 	queue_head_t *qp;
955 
956 	/*
957 	 * Calling enter_critical()/exit_critical() here would lead
958 	 * to recursion.  Just manipulate self->ul_critical directly.
959 	 */
960 	self->ul_critical++;
961 	while (self->ul_sleepq != NULL) {
962 		qp = queue_lock(self->ul_wchan, self->ul_qtype);
963 		/*
964 		 * We may have been moved from a CV queue to a
965 		 * mutex queue while we were attempting queue_lock().
966 		 * If so, just loop around and try again.
967 		 * dequeue_self() clears self->ul_sleepq.
968 		 */
969 		if (qp == self->ul_sleepq)
970 			(void) dequeue_self(qp);
971 		queue_unlock(qp);
972 	}
973 	self->ul_writer = 0;
974 	self->ul_critical--;
975 }
976 
977 /*
978  * Common code for calling the the ___lwp_mutex_timedlock() system call.
979  * Returns with mutex_owner and mutex_ownerpid set correctly.
980  */
981 static int
982 mutex_lock_kernel(mutex_t *mp, timespec_t *tsp, tdb_mutex_stats_t *msp)
983 {
984 	ulwp_t *self = curthread;
985 	uberdata_t *udp = self->ul_uberdata;
986 	int mtype = mp->mutex_type;
987 	hrtime_t begin_sleep;
988 	int acquired;
989 	int error;
990 
991 	self->ul_sp = stkptr();
992 	self->ul_wchan = mp;
993 	if (__td_event_report(self, TD_SLEEP, udp)) {
994 		self->ul_td_evbuf.eventnum = TD_SLEEP;
995 		self->ul_td_evbuf.eventdata = mp;
996 		tdb_event(TD_SLEEP, udp);
997 	}
998 	if (msp) {
999 		tdb_incr(msp->mutex_sleep);
1000 		begin_sleep = gethrtime();
1001 	}
1002 
1003 	DTRACE_PROBE1(plockstat, mutex__block, mp);
1004 
1005 	/* defer signals until the assignment of mp->mutex_owner */
1006 	sigoff(self);
1007 	for (;;) {
1008 		/*
1009 		 * A return value of EOWNERDEAD or ELOCKUNMAPPED
1010 		 * means we successfully acquired the lock.
1011 		 */
1012 		if ((error = ___lwp_mutex_timedlock(mp, tsp)) != 0 &&
1013 		    error != EOWNERDEAD && error != ELOCKUNMAPPED) {
1014 			acquired = 0;
1015 			break;
1016 		}
1017 
1018 		if (mtype & USYNC_PROCESS) {
1019 			/*
1020 			 * Defend against forkall().  We may be the child,
1021 			 * in which case we don't actually own the mutex.
1022 			 */
1023 			enter_critical(self);
1024 			if (mp->mutex_ownerpid == udp->pid) {
1025 				mp->mutex_owner = (uintptr_t)self;
1026 				exit_critical(self);
1027 				acquired = 1;
1028 				break;
1029 			}
1030 			exit_critical(self);
1031 		} else {
1032 			mp->mutex_owner = (uintptr_t)self;
1033 			acquired = 1;
1034 			break;
1035 		}
1036 	}
1037 	sigon(self);
1038 
1039 	if (msp)
1040 		msp->mutex_sleep_time += gethrtime() - begin_sleep;
1041 	self->ul_wchan = NULL;
1042 	self->ul_sp = 0;
1043 
1044 	if (acquired) {
1045 		DTRACE_PROBE2(plockstat, mutex__blocked, mp, 1);
1046 		DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
1047 	} else {
1048 		DTRACE_PROBE2(plockstat, mutex__blocked, mp, 0);
1049 		DTRACE_PROBE2(plockstat, mutex__error, mp, error);
1050 	}
1051 
1052 	return (error);
1053 }
1054 
1055 /*
1056  * Common code for calling the ___lwp_mutex_trylock() system call.
1057  * Returns with mutex_owner and mutex_ownerpid set correctly.
1058  */
1059 int
1060 mutex_trylock_kernel(mutex_t *mp)
1061 {
1062 	ulwp_t *self = curthread;
1063 	uberdata_t *udp = self->ul_uberdata;
1064 	int mtype = mp->mutex_type;
1065 	int error;
1066 	int acquired;
1067 
1068 	sigoff(self);
1069 	for (;;) {
1070 		/*
1071 		 * A return value of EOWNERDEAD or ELOCKUNMAPPED
1072 		 * means we successfully acquired the lock.
1073 		 */
1074 		if ((error = ___lwp_mutex_trylock(mp)) != 0 &&
1075 		    error != EOWNERDEAD && error != ELOCKUNMAPPED) {
1076 			acquired = 0;
1077 			break;
1078 		}
1079 
1080 		if (mtype & USYNC_PROCESS) {
1081 			/*
1082 			 * Defend against forkall().  We may be the child,
1083 			 * in which case we don't actually own the mutex.
1084 			 */
1085 			enter_critical(self);
1086 			if (mp->mutex_ownerpid == udp->pid) {
1087 				mp->mutex_owner = (uintptr_t)self;
1088 				exit_critical(self);
1089 				acquired = 1;
1090 				break;
1091 			}
1092 			exit_critical(self);
1093 		} else {
1094 			mp->mutex_owner = (uintptr_t)self;
1095 			acquired = 1;
1096 			break;
1097 		}
1098 	}
1099 	sigon(self);
1100 
1101 	if (acquired) {
1102 		DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
1103 	} else if (error != EBUSY) {
1104 		DTRACE_PROBE2(plockstat, mutex__error, mp, error);
1105 	}
1106 
1107 	return (error);
1108 }
1109 
1110 volatile sc_shared_t *
1111 setup_schedctl(void)
1112 {
1113 	ulwp_t *self = curthread;
1114 	volatile sc_shared_t *scp;
1115 	sc_shared_t *tmp;
1116 
1117 	if ((scp = self->ul_schedctl) == NULL && /* no shared state yet */
1118 	    !self->ul_vfork &&			/* not a child of vfork() */
1119 	    !self->ul_schedctl_called) {	/* haven't been called before */
1120 		enter_critical(self);
1121 		self->ul_schedctl_called = &self->ul_uberdata->uberflags;
1122 		if ((tmp = __schedctl()) != (sc_shared_t *)(-1))
1123 			self->ul_schedctl = scp = tmp;
1124 		exit_critical(self);
1125 	}
1126 	/*
1127 	 * Unless the call to setup_schedctl() is surrounded
1128 	 * by enter_critical()/exit_critical(), the address
1129 	 * we are returning could be invalid due to a forkall()
1130 	 * having occurred in another thread.
1131 	 */
1132 	return (scp);
1133 }
1134 
1135 /*
1136  * Interfaces from libsched, incorporated into libc.
1137  * libsched.so.1 is now a filter library onto libc.
1138  */
1139 #pragma weak schedctl_lookup = schedctl_init
1140 schedctl_t *
1141 schedctl_init(void)
1142 {
1143 	volatile sc_shared_t *scp = setup_schedctl();
1144 	return ((scp == NULL)? NULL : (schedctl_t *)&scp->sc_preemptctl);
1145 }
1146 
1147 void
1148 schedctl_exit(void)
1149 {
1150 }
1151 
1152 /*
1153  * Contract private interface for java.
1154  * Set up the schedctl data if it doesn't exist yet.
1155  * Return a pointer to the pointer to the schedctl data.
1156  */
1157 volatile sc_shared_t *volatile *
1158 _thr_schedctl(void)
1159 {
1160 	ulwp_t *self = curthread;
1161 	volatile sc_shared_t *volatile *ptr;
1162 
1163 	if (self->ul_vfork)
1164 		return (NULL);
1165 	if (*(ptr = &self->ul_schedctl) == NULL)
1166 		(void) setup_schedctl();
1167 	return (ptr);
1168 }
1169 
1170 /*
1171  * Block signals and attempt to block preemption.
1172  * no_preempt()/preempt() must be used in pairs but can be nested.
1173  */
1174 void
1175 no_preempt(ulwp_t *self)
1176 {
1177 	volatile sc_shared_t *scp;
1178 
1179 	if (self->ul_preempt++ == 0) {
1180 		enter_critical(self);
1181 		if ((scp = self->ul_schedctl) != NULL ||
1182 		    (scp = setup_schedctl()) != NULL) {
1183 			/*
1184 			 * Save the pre-existing preempt value.
1185 			 */
1186 			self->ul_savpreempt = scp->sc_preemptctl.sc_nopreempt;
1187 			scp->sc_preemptctl.sc_nopreempt = 1;
1188 		}
1189 	}
1190 }
1191 
1192 /*
1193  * Undo the effects of no_preempt().
1194  */
1195 void
1196 preempt(ulwp_t *self)
1197 {
1198 	volatile sc_shared_t *scp;
1199 
1200 	ASSERT(self->ul_preempt > 0);
1201 	if (--self->ul_preempt == 0) {
1202 		if ((scp = self->ul_schedctl) != NULL) {
1203 			/*
1204 			 * Restore the pre-existing preempt value.
1205 			 */
1206 			scp->sc_preemptctl.sc_nopreempt = self->ul_savpreempt;
1207 			if (scp->sc_preemptctl.sc_yield &&
1208 			    scp->sc_preemptctl.sc_nopreempt == 0) {
1209 				yield();
1210 				if (scp->sc_preemptctl.sc_yield) {
1211 					/*
1212 					 * Shouldn't happen.  This is either
1213 					 * a race condition or the thread
1214 					 * just entered the real-time class.
1215 					 */
1216 					yield();
1217 					scp->sc_preemptctl.sc_yield = 0;
1218 				}
1219 			}
1220 		}
1221 		exit_critical(self);
1222 	}
1223 }
1224 
1225 /*
1226  * If a call to preempt() would cause the current thread to yield or to
1227  * take deferred actions in exit_critical(), then unpark the specified
1228  * lwp so it can run while we delay.  Return the original lwpid if the
1229  * unpark was not performed, else return zero.  The tests are a repeat
1230  * of some of the tests in preempt(), above.  This is a statistical
1231  * optimization solely for cond_sleep_queue(), below.
1232  */
1233 static lwpid_t
1234 preempt_unpark(ulwp_t *self, lwpid_t lwpid)
1235 {
1236 	volatile sc_shared_t *scp = self->ul_schedctl;
1237 
1238 	ASSERT(self->ul_preempt == 1 && self->ul_critical > 0);
1239 	if ((scp != NULL && scp->sc_preemptctl.sc_yield) ||
1240 	    (self->ul_curplease && self->ul_critical == 1)) {
1241 		(void) __lwp_unpark(lwpid);
1242 		lwpid = 0;
1243 	}
1244 	return (lwpid);
1245 }
1246 
1247 /*
1248  * Spin for a while (if 'tryhard' is true), trying to grab the lock.
1249  * If this fails, return EBUSY and let the caller deal with it.
1250  * If this succeeds, return 0 with mutex_owner set to curthread.
1251  */
1252 static int
1253 mutex_trylock_adaptive(mutex_t *mp, int tryhard)
1254 {
1255 	ulwp_t *self = curthread;
1256 	int error = EBUSY;
1257 	ulwp_t *ulwp;
1258 	volatile sc_shared_t *scp;
1259 	volatile uint8_t *lockp = (volatile uint8_t *)&mp->mutex_lockw;
1260 	volatile uint64_t *ownerp = (volatile uint64_t *)&mp->mutex_owner;
1261 	uint32_t new_lockword;
1262 	int count = 0;
1263 	int max_count;
1264 	uint8_t max_spinners;
1265 
1266 	ASSERT(!(mp->mutex_type & USYNC_PROCESS));
1267 
1268 	if (MUTEX_OWNED(mp, self))
1269 		return (EBUSY);
1270 
1271 	enter_critical(self);
1272 
1273 	/* short-cut, not definitive (see below) */
1274 	if (mp->mutex_flag & LOCK_NOTRECOVERABLE) {
1275 		ASSERT(mp->mutex_type & LOCK_ROBUST);
1276 		error = ENOTRECOVERABLE;
1277 		goto done;
1278 	}
1279 
1280 	/*
1281 	 * Make one attempt to acquire the lock before
1282 	 * incurring the overhead of the spin loop.
1283 	 */
1284 	if (set_lock_byte(lockp) == 0) {
1285 		*ownerp = (uintptr_t)self;
1286 		error = 0;
1287 		goto done;
1288 	}
1289 	if (!tryhard)
1290 		goto done;
1291 	if (ncpus == 0)
1292 		ncpus = (int)_sysconf(_SC_NPROCESSORS_ONLN);
1293 	if ((max_spinners = self->ul_max_spinners) >= ncpus)
1294 		max_spinners = ncpus - 1;
1295 	max_count = (max_spinners != 0)? self->ul_adaptive_spin : 0;
1296 	if (max_count == 0)
1297 		goto done;
1298 
1299 	/*
1300 	 * This spin loop is unfair to lwps that have already dropped into
1301 	 * the kernel to sleep.  They will starve on a highly-contended mutex.
1302 	 * This is just too bad.  The adaptive spin algorithm is intended
1303 	 * to allow programs with highly-contended locks (that is, broken
1304 	 * programs) to execute with reasonable speed despite their contention.
1305 	 * Being fair would reduce the speed of such programs and well-written
1306 	 * programs will not suffer in any case.
1307 	 */
1308 	if (spinners_incr(&mp->mutex_lockword, max_spinners) == -1)
1309 		goto done;
1310 	DTRACE_PROBE1(plockstat, mutex__spin, mp);
1311 	for (count = 1; ; count++) {
1312 		if (*lockp == 0 && set_lock_byte(lockp) == 0) {
1313 			*ownerp = (uintptr_t)self;
1314 			error = 0;
1315 			break;
1316 		}
1317 		if (count == max_count)
1318 			break;
1319 		SMT_PAUSE();
1320 		/*
1321 		 * Stop spinning if the mutex owner is not running on
1322 		 * a processor; it will not drop the lock any time soon
1323 		 * and we would just be wasting time to keep spinning.
1324 		 *
1325 		 * Note that we are looking at another thread (ulwp_t)
1326 		 * without ensuring that the other thread does not exit.
1327 		 * The scheme relies on ulwp_t structures never being
1328 		 * deallocated by the library (the library employs a free
1329 		 * list of ulwp_t structs that are reused when new threads
1330 		 * are created) and on schedctl shared memory never being
1331 		 * deallocated once created via __schedctl().
1332 		 *
1333 		 * Thus, the worst that can happen when the spinning thread
1334 		 * looks at the owner's schedctl data is that it is looking
1335 		 * at some other thread's schedctl data.  This almost never
1336 		 * happens and is benign when it does.
1337 		 */
1338 		if ((ulwp = (ulwp_t *)(uintptr_t)*ownerp) != NULL &&
1339 		    ((scp = ulwp->ul_schedctl) == NULL ||
1340 		    scp->sc_state != SC_ONPROC))
1341 			break;
1342 	}
1343 	new_lockword = spinners_decr(&mp->mutex_lockword);
1344 	if (error && (new_lockword & (LOCKMASK | SPINNERMASK)) == 0) {
1345 		/*
1346 		 * We haven't yet acquired the lock, the lock
1347 		 * is free, and there are no other spinners.
1348 		 * Make one final attempt to acquire the lock.
1349 		 *
1350 		 * This isn't strictly necessary since mutex_lock_queue()
1351 		 * (the next action this thread will take if it doesn't
1352 		 * acquire the lock here) makes one attempt to acquire
1353 		 * the lock before putting the thread to sleep.
1354 		 *
1355 		 * If the next action for this thread (on failure here)
1356 		 * were not to call mutex_lock_queue(), this would be
1357 		 * necessary for correctness, to avoid ending up with an
1358 		 * unheld mutex with waiters but no one to wake them up.
1359 		 */
1360 		if (set_lock_byte(lockp) == 0) {
1361 			*ownerp = (uintptr_t)self;
1362 			error = 0;
1363 		}
1364 		count++;
1365 	}
1366 
1367 done:
1368 	if (error == 0 && (mp->mutex_flag & LOCK_NOTRECOVERABLE)) {
1369 		ASSERT(mp->mutex_type & LOCK_ROBUST);
1370 		/*
1371 		 * We shouldn't own the mutex.
1372 		 * Just clear the lock; everyone has already been waked up.
1373 		 */
1374 		*ownerp = 0;
1375 		(void) clear_lockbyte(&mp->mutex_lockword);
1376 		error = ENOTRECOVERABLE;
1377 	}
1378 
1379 	exit_critical(self);
1380 
1381 	if (error) {
1382 		if (count) {
1383 			DTRACE_PROBE2(plockstat, mutex__spun, 0, count);
1384 		}
1385 		if (error != EBUSY) {
1386 			DTRACE_PROBE2(plockstat, mutex__error, mp, error);
1387 		}
1388 	} else {
1389 		if (count) {
1390 			DTRACE_PROBE2(plockstat, mutex__spun, 1, count);
1391 		}
1392 		DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, count);
1393 		if (mp->mutex_flag & LOCK_OWNERDEAD) {
1394 			ASSERT(mp->mutex_type & LOCK_ROBUST);
1395 			error = EOWNERDEAD;
1396 		}
1397 	}
1398 
1399 	return (error);
1400 }
1401 
1402 /*
1403  * Same as mutex_trylock_adaptive(), except specifically for queue locks.
1404  * The owner field is not set here; the caller (spin_lock_set()) sets it.
1405  */
1406 static int
1407 mutex_queuelock_adaptive(mutex_t *mp)
1408 {
1409 	ulwp_t *ulwp;
1410 	volatile sc_shared_t *scp;
1411 	volatile uint8_t *lockp;
1412 	volatile uint64_t *ownerp;
1413 	int count = curthread->ul_queue_spin;
1414 
1415 	ASSERT(mp->mutex_type == USYNC_THREAD);
1416 
1417 	if (count == 0)
1418 		return (EBUSY);
1419 
1420 	lockp = (volatile uint8_t *)&mp->mutex_lockw;
1421 	ownerp = (volatile uint64_t *)&mp->mutex_owner;
1422 	while (--count >= 0) {
1423 		if (*lockp == 0 && set_lock_byte(lockp) == 0)
1424 			return (0);
1425 		SMT_PAUSE();
1426 		if ((ulwp = (ulwp_t *)(uintptr_t)*ownerp) != NULL &&
1427 		    ((scp = ulwp->ul_schedctl) == NULL ||
1428 		    scp->sc_state != SC_ONPROC))
1429 			break;
1430 	}
1431 
1432 	return (EBUSY);
1433 }
1434 
1435 /*
1436  * Like mutex_trylock_adaptive(), but for process-shared mutexes.
1437  * Spin for a while (if 'tryhard' is true), trying to grab the lock.
1438  * If this fails, return EBUSY and let the caller deal with it.
1439  * If this succeeds, return 0 with mutex_owner set to curthread
1440  * and mutex_ownerpid set to the current pid.
1441  */
1442 static int
1443 mutex_trylock_process(mutex_t *mp, int tryhard)
1444 {
1445 	ulwp_t *self = curthread;
1446 	uberdata_t *udp = self->ul_uberdata;
1447 	int error = EBUSY;
1448 	volatile uint64_t *lockp = (volatile uint64_t *)&mp->mutex_lockword64;
1449 	uint32_t new_lockword;
1450 	int count = 0;
1451 	int max_count;
1452 	uint8_t max_spinners;
1453 
1454 #if defined(__sparc) && !defined(_LP64)
1455 	/* horrible hack, necessary only on 32-bit sparc */
1456 	int fix_alignment_problem =
1457 	    (((uintptr_t)mp & (_LONG_LONG_ALIGNMENT - 1)) &&
1458 	    self->ul_misaligned && !(mp->mutex_type & LOCK_ROBUST));
1459 #endif
1460 
1461 	ASSERT(mp->mutex_type & USYNC_PROCESS);
1462 
1463 	if (shared_mutex_held(mp))
1464 		return (EBUSY);
1465 
1466 	enter_critical(self);
1467 
1468 	/* short-cut, not definitive (see below) */
1469 	if (mp->mutex_flag & LOCK_NOTRECOVERABLE) {
1470 		ASSERT(mp->mutex_type & LOCK_ROBUST);
1471 		error = ENOTRECOVERABLE;
1472 		goto done;
1473 	}
1474 
1475 	/*
1476 	 * Make one attempt to acquire the lock before
1477 	 * incurring the overhead of the spin loop.
1478 	 */
1479 #if defined(__sparc) && !defined(_LP64)
1480 	/* horrible hack, necessary only on 32-bit sparc */
1481 	if (fix_alignment_problem) {
1482 		if (set_lock_byte(&mp->mutex_lockw) == 0) {
1483 			mp->mutex_ownerpid = udp->pid;
1484 			mp->mutex_owner = (uintptr_t)self;
1485 			error = 0;
1486 			goto done;
1487 		}
1488 	} else
1489 #endif
1490 	if (set_lock_byte64(lockp, udp->pid) == 0) {
1491 		mp->mutex_owner = (uintptr_t)self;
1492 		/* mp->mutex_ownerpid was set by set_lock_byte64() */
1493 		error = 0;
1494 		goto done;
1495 	}
1496 	if (!tryhard)
1497 		goto done;
1498 	if (ncpus == 0)
1499 		ncpus = (int)_sysconf(_SC_NPROCESSORS_ONLN);
1500 	if ((max_spinners = self->ul_max_spinners) >= ncpus)
1501 		max_spinners = ncpus - 1;
1502 	max_count = (max_spinners != 0)? self->ul_adaptive_spin : 0;
1503 	if (max_count == 0)
1504 		goto done;
1505 
1506 	/*
1507 	 * This is a process-shared mutex.
1508 	 * We cannot know if the owner is running on a processor.
1509 	 * We just spin and hope that it is on a processor.
1510 	 */
1511 	if (spinners_incr(&mp->mutex_lockword, max_spinners) == -1)
1512 		goto done;
1513 	DTRACE_PROBE1(plockstat, mutex__spin, mp);
1514 	for (count = 1; ; count++) {
1515 #if defined(__sparc) && !defined(_LP64)
1516 		/* horrible hack, necessary only on 32-bit sparc */
1517 		if (fix_alignment_problem) {
1518 			if ((*lockp & LOCKMASK64) == 0 &&
1519 			    set_lock_byte(&mp->mutex_lockw) == 0) {
1520 				mp->mutex_ownerpid = udp->pid;
1521 				mp->mutex_owner = (uintptr_t)self;
1522 				error = 0;
1523 				break;
1524 			}
1525 		} else
1526 #endif
1527 		if ((*lockp & LOCKMASK64) == 0 &&
1528 		    set_lock_byte64(lockp, udp->pid) == 0) {
1529 			mp->mutex_owner = (uintptr_t)self;
1530 			/* mp->mutex_ownerpid was set by set_lock_byte64() */
1531 			error = 0;
1532 			break;
1533 		}
1534 		if (count == max_count)
1535 			break;
1536 		SMT_PAUSE();
1537 	}
1538 	new_lockword = spinners_decr(&mp->mutex_lockword);
1539 	if (error && (new_lockword & (LOCKMASK | SPINNERMASK)) == 0) {
1540 		/*
1541 		 * We haven't yet acquired the lock, the lock
1542 		 * is free, and there are no other spinners.
1543 		 * Make one final attempt to acquire the lock.
1544 		 *
1545 		 * This isn't strictly necessary since mutex_lock_kernel()
1546 		 * (the next action this thread will take if it doesn't
1547 		 * acquire the lock here) makes one attempt to acquire
1548 		 * the lock before putting the thread to sleep.
1549 		 *
1550 		 * If the next action for this thread (on failure here)
1551 		 * were not to call mutex_lock_kernel(), this would be
1552 		 * necessary for correctness, to avoid ending up with an
1553 		 * unheld mutex with waiters but no one to wake them up.
1554 		 */
1555 #if defined(__sparc) && !defined(_LP64)
1556 		/* horrible hack, necessary only on 32-bit sparc */
1557 		if (fix_alignment_problem) {
1558 			if (set_lock_byte(&mp->mutex_lockw) == 0) {
1559 				mp->mutex_ownerpid = udp->pid;
1560 				mp->mutex_owner = (uintptr_t)self;
1561 				error = 0;
1562 			}
1563 		} else
1564 #endif
1565 		if (set_lock_byte64(lockp, udp->pid) == 0) {
1566 			mp->mutex_owner = (uintptr_t)self;
1567 			/* mp->mutex_ownerpid was set by set_lock_byte64() */
1568 			error = 0;
1569 		}
1570 		count++;
1571 	}
1572 
1573 done:
1574 	if (error == 0 && (mp->mutex_flag & LOCK_NOTRECOVERABLE)) {
1575 		ASSERT(mp->mutex_type & LOCK_ROBUST);
1576 		/*
1577 		 * We shouldn't own the mutex.
1578 		 * Just clear the lock; everyone has already been waked up.
1579 		 */
1580 		mp->mutex_owner = 0;
1581 		/* mp->mutex_ownerpid is cleared by clear_lockbyte64() */
1582 		(void) clear_lockbyte64(&mp->mutex_lockword64);
1583 		error = ENOTRECOVERABLE;
1584 	}
1585 
1586 	exit_critical(self);
1587 
1588 	if (error) {
1589 		if (count) {
1590 			DTRACE_PROBE2(plockstat, mutex__spun, 0, count);
1591 		}
1592 		if (error != EBUSY) {
1593 			DTRACE_PROBE2(plockstat, mutex__error, mp, error);
1594 		}
1595 	} else {
1596 		if (count) {
1597 			DTRACE_PROBE2(plockstat, mutex__spun, 1, count);
1598 		}
1599 		DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, count);
1600 		if (mp->mutex_flag & (LOCK_OWNERDEAD | LOCK_UNMAPPED)) {
1601 			ASSERT(mp->mutex_type & LOCK_ROBUST);
1602 			if (mp->mutex_flag & LOCK_OWNERDEAD)
1603 				error = EOWNERDEAD;
1604 			else if (mp->mutex_type & USYNC_PROCESS_ROBUST)
1605 				error = ELOCKUNMAPPED;
1606 			else
1607 				error = EOWNERDEAD;
1608 		}
1609 	}
1610 
1611 	return (error);
1612 }
1613 
1614 /*
1615  * Mutex wakeup code for releasing a USYNC_THREAD mutex.
1616  * Returns the lwpid of the thread that was dequeued, if any.
1617  * The caller of mutex_wakeup() must call __lwp_unpark(lwpid)
1618  * to wake up the specified lwp.
1619  */
1620 static lwpid_t
1621 mutex_wakeup(mutex_t *mp)
1622 {
1623 	lwpid_t lwpid = 0;
1624 	int more;
1625 	queue_head_t *qp;
1626 	ulwp_t *ulwp;
1627 
1628 	/*
1629 	 * Dequeue a waiter from the sleep queue.  Don't touch the mutex
1630 	 * waiters bit if no one was found on the queue because the mutex
1631 	 * might have been deallocated or reallocated for another purpose.
1632 	 */
1633 	qp = queue_lock(mp, MX);
1634 	if ((ulwp = dequeue(qp, &more)) != NULL) {
1635 		lwpid = ulwp->ul_lwpid;
1636 		mp->mutex_waiters = more;
1637 	}
1638 	queue_unlock(qp);
1639 	return (lwpid);
1640 }
1641 
1642 /*
1643  * Mutex wakeup code for releasing all waiters on a USYNC_THREAD mutex.
1644  */
1645 static void
1646 mutex_wakeup_all(mutex_t *mp)
1647 {
1648 	queue_head_t *qp;
1649 	queue_root_t *qrp;
1650 	int nlwpid = 0;
1651 	int maxlwps = MAXLWPS;
1652 	ulwp_t *ulwp;
1653 	lwpid_t buffer[MAXLWPS];
1654 	lwpid_t *lwpid = buffer;
1655 
1656 	/*
1657 	 * Walk the list of waiters and prepare to wake up all of them.
1658 	 * The waiters flag has already been cleared from the mutex.
1659 	 *
1660 	 * We keep track of lwpids that are to be unparked in lwpid[].
1661 	 * __lwp_unpark_all() is called to unpark all of them after
1662 	 * they have been removed from the sleep queue and the sleep
1663 	 * queue lock has been dropped.  If we run out of space in our
1664 	 * on-stack buffer, we need to allocate more but we can't call
1665 	 * lmalloc() because we are holding a queue lock when the overflow
1666 	 * occurs and lmalloc() acquires a lock.  We can't use alloca()
1667 	 * either because the application may have allocated a small
1668 	 * stack and we don't want to overrun the stack.  So we call
1669 	 * alloc_lwpids() to allocate a bigger buffer using the mmap()
1670 	 * system call directly since that path acquires no locks.
1671 	 */
1672 	qp = queue_lock(mp, MX);
1673 	for (;;) {
1674 		if ((qrp = qp->qh_root) == NULL ||
1675 		    (ulwp = qrp->qr_head) == NULL)
1676 			break;
1677 		ASSERT(ulwp->ul_wchan == mp);
1678 		queue_unlink(qp, &qrp->qr_head, NULL);
1679 		ulwp->ul_sleepq = NULL;
1680 		ulwp->ul_wchan = NULL;
1681 		if (nlwpid == maxlwps)
1682 			lwpid = alloc_lwpids(lwpid, &nlwpid, &maxlwps);
1683 		lwpid[nlwpid++] = ulwp->ul_lwpid;
1684 	}
1685 
1686 	if (nlwpid == 0) {
1687 		queue_unlock(qp);
1688 	} else {
1689 		mp->mutex_waiters = 0;
1690 		no_preempt(curthread);
1691 		queue_unlock(qp);
1692 		if (nlwpid == 1)
1693 			(void) __lwp_unpark(lwpid[0]);
1694 		else
1695 			(void) __lwp_unpark_all(lwpid, nlwpid);
1696 		preempt(curthread);
1697 	}
1698 
1699 	if (lwpid != buffer)
1700 		(void) munmap((caddr_t)lwpid, maxlwps * sizeof (lwpid_t));
1701 }
1702 
1703 /*
1704  * Release a process-private mutex.
1705  * As an optimization, if there are waiters but there are also spinners
1706  * attempting to acquire the mutex, then don't bother waking up a waiter;
1707  * one of the spinners will acquire the mutex soon and it would be a waste
1708  * of resources to wake up some thread just to have it spin for a while
1709  * and then possibly go back to sleep.  See mutex_trylock_adaptive().
1710  */
1711 static lwpid_t
1712 mutex_unlock_queue(mutex_t *mp, int release_all)
1713 {
1714 	ulwp_t *self = curthread;
1715 	lwpid_t lwpid = 0;
1716 	uint32_t old_lockword;
1717 
1718 	DTRACE_PROBE2(plockstat, mutex__release, mp, 0);
1719 	sigoff(self);
1720 	mp->mutex_owner = 0;
1721 	old_lockword = clear_lockbyte(&mp->mutex_lockword);
1722 	if ((old_lockword & WAITERMASK) &&
1723 	    (release_all || (old_lockword & SPINNERMASK) == 0)) {
1724 		no_preempt(self);	/* ensure a prompt wakeup */
1725 		if (release_all)
1726 			mutex_wakeup_all(mp);
1727 		else
1728 			lwpid = mutex_wakeup(mp);
1729 		if (lwpid == 0)
1730 			preempt(self);
1731 	}
1732 	sigon(self);
1733 	return (lwpid);
1734 }
1735 
1736 /*
1737  * Like mutex_unlock_queue(), but for process-shared mutexes.
1738  */
1739 static void
1740 mutex_unlock_process(mutex_t *mp, int release_all)
1741 {
1742 	ulwp_t *self = curthread;
1743 	uint64_t old_lockword64;
1744 
1745 	DTRACE_PROBE2(plockstat, mutex__release, mp, 0);
1746 	sigoff(self);
1747 	mp->mutex_owner = 0;
1748 #if defined(__sparc) && !defined(_LP64)
1749 	/* horrible hack, necessary only on 32-bit sparc */
1750 	if (((uintptr_t)mp & (_LONG_LONG_ALIGNMENT - 1)) &&
1751 	    self->ul_misaligned && !(mp->mutex_type & LOCK_ROBUST)) {
1752 		uint32_t old_lockword;
1753 		mp->mutex_ownerpid = 0;
1754 		old_lockword = clear_lockbyte(&mp->mutex_lockword);
1755 		if ((old_lockword & WAITERMASK) &&
1756 		    (release_all || (old_lockword & SPINNERMASK) == 0)) {
1757 			no_preempt(self);	/* ensure a prompt wakeup */
1758 			(void) ___lwp_mutex_wakeup(mp, release_all);
1759 			preempt(self);
1760 		}
1761 		sigon(self);
1762 		return;
1763 	}
1764 #endif
1765 	/* mp->mutex_ownerpid is cleared by clear_lockbyte64() */
1766 	old_lockword64 = clear_lockbyte64(&mp->mutex_lockword64);
1767 	if ((old_lockword64 & WAITERMASK64) &&
1768 	    (release_all || (old_lockword64 & SPINNERMASK64) == 0)) {
1769 		no_preempt(self);	/* ensure a prompt wakeup */
1770 		(void) ___lwp_mutex_wakeup(mp, release_all);
1771 		preempt(self);
1772 	}
1773 	sigon(self);
1774 }
1775 
1776 void
1777 stall(void)
1778 {
1779 	for (;;)
1780 		(void) mutex_lock_kernel(&stall_mutex, NULL, NULL);
1781 }
1782 
1783 /*
1784  * Acquire a USYNC_THREAD mutex via user-level sleep queues.
1785  * We failed set_lock_byte(&mp->mutex_lockw) before coming here.
1786  * If successful, returns with mutex_owner set correctly.
1787  */
1788 int
1789 mutex_lock_queue(ulwp_t *self, tdb_mutex_stats_t *msp, mutex_t *mp,
1790 	timespec_t *tsp)
1791 {
1792 	uberdata_t *udp = curthread->ul_uberdata;
1793 	queue_head_t *qp;
1794 	hrtime_t begin_sleep;
1795 	int error = 0;
1796 
1797 	self->ul_sp = stkptr();
1798 	if (__td_event_report(self, TD_SLEEP, udp)) {
1799 		self->ul_wchan = mp;
1800 		self->ul_td_evbuf.eventnum = TD_SLEEP;
1801 		self->ul_td_evbuf.eventdata = mp;
1802 		tdb_event(TD_SLEEP, udp);
1803 	}
1804 	if (msp) {
1805 		tdb_incr(msp->mutex_sleep);
1806 		begin_sleep = gethrtime();
1807 	}
1808 
1809 	DTRACE_PROBE1(plockstat, mutex__block, mp);
1810 
1811 	/*
1812 	 * Put ourself on the sleep queue, and while we are
1813 	 * unable to grab the lock, go park in the kernel.
1814 	 * Take ourself off the sleep queue after we acquire the lock.
1815 	 * The waiter bit can be set/cleared only while holding the queue lock.
1816 	 */
1817 	qp = queue_lock(mp, MX);
1818 	enqueue(qp, self, 0);
1819 	mp->mutex_waiters = 1;
1820 	for (;;) {
1821 		if (set_lock_byte(&mp->mutex_lockw) == 0) {
1822 			mp->mutex_owner = (uintptr_t)self;
1823 			mp->mutex_waiters = dequeue_self(qp);
1824 			break;
1825 		}
1826 		set_parking_flag(self, 1);
1827 		queue_unlock(qp);
1828 		/*
1829 		 * __lwp_park() will return the residual time in tsp
1830 		 * if we are unparked before the timeout expires.
1831 		 */
1832 		error = __lwp_park(tsp, 0);
1833 		set_parking_flag(self, 0);
1834 		/*
1835 		 * We could have taken a signal or suspended ourself.
1836 		 * If we did, then we removed ourself from the queue.
1837 		 * Someone else may have removed us from the queue
1838 		 * as a consequence of mutex_unlock().  We may have
1839 		 * gotten a timeout from __lwp_park().  Or we may still
1840 		 * be on the queue and this is just a spurious wakeup.
1841 		 */
1842 		qp = queue_lock(mp, MX);
1843 		if (self->ul_sleepq == NULL) {
1844 			if (error) {
1845 				mp->mutex_waiters = queue_waiter(qp)? 1 : 0;
1846 				if (error != EINTR)
1847 					break;
1848 				error = 0;
1849 			}
1850 			if (set_lock_byte(&mp->mutex_lockw) == 0) {
1851 				mp->mutex_owner = (uintptr_t)self;
1852 				break;
1853 			}
1854 			enqueue(qp, self, 0);
1855 			mp->mutex_waiters = 1;
1856 		}
1857 		ASSERT(self->ul_sleepq == qp &&
1858 		    self->ul_qtype == MX &&
1859 		    self->ul_wchan == mp);
1860 		if (error) {
1861 			if (error != EINTR) {
1862 				mp->mutex_waiters = dequeue_self(qp);
1863 				break;
1864 			}
1865 			error = 0;
1866 		}
1867 	}
1868 	ASSERT(self->ul_sleepq == NULL && self->ul_link == NULL &&
1869 	    self->ul_wchan == NULL);
1870 	self->ul_sp = 0;
1871 
1872 	ASSERT(error == 0 || error == EINVAL || error == ETIME);
1873 
1874 	if (error == 0 && (mp->mutex_flag & LOCK_NOTRECOVERABLE)) {
1875 		ASSERT(mp->mutex_type & LOCK_ROBUST);
1876 		/*
1877 		 * We shouldn't own the mutex.
1878 		 * Just clear the lock; everyone has already been waked up.
1879 		 */
1880 		mp->mutex_owner = 0;
1881 		(void) clear_lockbyte(&mp->mutex_lockword);
1882 		error = ENOTRECOVERABLE;
1883 	}
1884 
1885 	queue_unlock(qp);
1886 
1887 	if (msp)
1888 		msp->mutex_sleep_time += gethrtime() - begin_sleep;
1889 
1890 	if (error) {
1891 		DTRACE_PROBE2(plockstat, mutex__blocked, mp, 0);
1892 		DTRACE_PROBE2(plockstat, mutex__error, mp, error);
1893 	} else {
1894 		DTRACE_PROBE2(plockstat, mutex__blocked, mp, 1);
1895 		DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
1896 		if (mp->mutex_flag & LOCK_OWNERDEAD) {
1897 			ASSERT(mp->mutex_type & LOCK_ROBUST);
1898 			error = EOWNERDEAD;
1899 		}
1900 	}
1901 
1902 	return (error);
1903 }
1904 
1905 static int
1906 mutex_recursion(mutex_t *mp, int mtype, int try)
1907 {
1908 	ASSERT(mutex_held(mp));
1909 	ASSERT(mtype & (LOCK_RECURSIVE|LOCK_ERRORCHECK));
1910 	ASSERT(try == MUTEX_TRY || try == MUTEX_LOCK);
1911 
1912 	if (mtype & LOCK_RECURSIVE) {
1913 		if (mp->mutex_rcount == RECURSION_MAX) {
1914 			DTRACE_PROBE2(plockstat, mutex__error, mp, EAGAIN);
1915 			return (EAGAIN);
1916 		}
1917 		mp->mutex_rcount++;
1918 		DTRACE_PROBE3(plockstat, mutex__acquire, mp, 1, 0);
1919 		return (0);
1920 	}
1921 	if (try == MUTEX_LOCK) {
1922 		DTRACE_PROBE2(plockstat, mutex__error, mp, EDEADLK);
1923 		return (EDEADLK);
1924 	}
1925 	return (EBUSY);
1926 }
1927 
1928 /*
1929  * Register this USYNC_PROCESS|LOCK_ROBUST mutex with the kernel so
1930  * it can apply LOCK_OWNERDEAD|LOCK_UNMAPPED if it becomes necessary.
1931  * We use tdb_hash_lock here and in the synch object tracking code in
1932  * the tdb_agent.c file.  There is no conflict between these two usages.
1933  */
1934 void
1935 register_lock(mutex_t *mp)
1936 {
1937 	uberdata_t *udp = curthread->ul_uberdata;
1938 	uint_t hash = LOCK_HASH(mp);
1939 	robust_t *rlp;
1940 	robust_t **rlpp;
1941 	robust_t **table;
1942 
1943 	if ((table = udp->robustlocks) == NULL) {
1944 		lmutex_lock(&udp->tdb_hash_lock);
1945 		if ((table = udp->robustlocks) == NULL) {
1946 			table = lmalloc(LOCKHASHSZ * sizeof (robust_t *));
1947 			membar_producer();
1948 			udp->robustlocks = table;
1949 		}
1950 		lmutex_unlock(&udp->tdb_hash_lock);
1951 	}
1952 	membar_consumer();
1953 
1954 	/*
1955 	 * First search the registered table with no locks held.
1956 	 * This is safe because the table never shrinks
1957 	 * and we can only get a false negative.
1958 	 */
1959 	for (rlp = table[hash]; rlp != NULL; rlp = rlp->robust_next) {
1960 		if (rlp->robust_lock == mp)	/* already registered */
1961 			return;
1962 	}
1963 
1964 	/*
1965 	 * The lock was not found.
1966 	 * Repeat the operation with tdb_hash_lock held.
1967 	 */
1968 	lmutex_lock(&udp->tdb_hash_lock);
1969 
1970 	for (rlpp = &table[hash];
1971 	    (rlp = *rlpp) != NULL;
1972 	    rlpp = &rlp->robust_next) {
1973 		if (rlp->robust_lock == mp) {	/* already registered */
1974 			lmutex_unlock(&udp->tdb_hash_lock);
1975 			return;
1976 		}
1977 	}
1978 
1979 	/*
1980 	 * The lock has never been registered.
1981 	 * Register it now and add it to the table.
1982 	 */
1983 	(void) ___lwp_mutex_register(mp);
1984 	rlp = lmalloc(sizeof (*rlp));
1985 	rlp->robust_lock = mp;
1986 	membar_producer();
1987 	*rlpp = rlp;
1988 
1989 	lmutex_unlock(&udp->tdb_hash_lock);
1990 }
1991 
1992 /*
1993  * This is called in the child of fork()/forkall() to start over
1994  * with a clean slate.  (Each process must register its own locks.)
1995  * No locks are needed because all other threads are suspended or gone.
1996  */
1997 void
1998 unregister_locks(void)
1999 {
2000 	uberdata_t *udp = curthread->ul_uberdata;
2001 	uint_t hash;
2002 	robust_t **table;
2003 	robust_t *rlp;
2004 	robust_t *next;
2005 
2006 	if ((table = udp->robustlocks) != NULL) {
2007 		for (hash = 0; hash < LOCKHASHSZ; hash++) {
2008 			rlp = table[hash];
2009 			while (rlp != NULL) {
2010 				next = rlp->robust_next;
2011 				lfree(rlp, sizeof (*rlp));
2012 				rlp = next;
2013 			}
2014 		}
2015 		lfree(table, LOCKHASHSZ * sizeof (robust_t *));
2016 		udp->robustlocks = NULL;
2017 	}
2018 }
2019 
2020 /*
2021  * Returns with mutex_owner set correctly.
2022  */
2023 int
2024 mutex_lock_internal(mutex_t *mp, timespec_t *tsp, int try)
2025 {
2026 	ulwp_t *self = curthread;
2027 	uberdata_t *udp = self->ul_uberdata;
2028 	int mtype = mp->mutex_type;
2029 	tdb_mutex_stats_t *msp = MUTEX_STATS(mp, udp);
2030 	int error = 0;
2031 	int noceil = try & MUTEX_NOCEIL;
2032 	uint8_t ceil;
2033 	int myprio;
2034 
2035 	try &= ~MUTEX_NOCEIL;
2036 	ASSERT(try == MUTEX_TRY || try == MUTEX_LOCK);
2037 
2038 	if (!self->ul_schedctl_called)
2039 		(void) setup_schedctl();
2040 
2041 	if (msp && try == MUTEX_TRY)
2042 		tdb_incr(msp->mutex_try);
2043 
2044 	if ((mtype & (LOCK_RECURSIVE|LOCK_ERRORCHECK)) && mutex_held(mp))
2045 		return (mutex_recursion(mp, mtype, try));
2046 
2047 	if (self->ul_error_detection && try == MUTEX_LOCK &&
2048 	    tsp == NULL && mutex_held(mp))
2049 		lock_error(mp, "mutex_lock", NULL, NULL);
2050 
2051 	if ((mtype & LOCK_PRIO_PROTECT) && noceil == 0) {
2052 		update_sched(self);
2053 		if (self->ul_cid != self->ul_rtclassid) {
2054 			DTRACE_PROBE2(plockstat, mutex__error, mp, EPERM);
2055 			return (EPERM);
2056 		}
2057 		ceil = mp->mutex_ceiling;
2058 		myprio = self->ul_epri? self->ul_epri : self->ul_pri;
2059 		if (myprio > ceil) {
2060 			DTRACE_PROBE2(plockstat, mutex__error, mp, EINVAL);
2061 			return (EINVAL);
2062 		}
2063 		if ((error = _ceil_mylist_add(mp)) != 0) {
2064 			DTRACE_PROBE2(plockstat, mutex__error, mp, error);
2065 			return (error);
2066 		}
2067 		if (myprio < ceil)
2068 			_ceil_prio_inherit(ceil);
2069 	}
2070 
2071 	if ((mtype & (USYNC_PROCESS | LOCK_ROBUST))
2072 	    == (USYNC_PROCESS | LOCK_ROBUST))
2073 		register_lock(mp);
2074 
2075 	if (mtype & LOCK_PRIO_INHERIT) {
2076 		/* go straight to the kernel */
2077 		if (try == MUTEX_TRY)
2078 			error = mutex_trylock_kernel(mp);
2079 		else	/* MUTEX_LOCK */
2080 			error = mutex_lock_kernel(mp, tsp, msp);
2081 		/*
2082 		 * The kernel never sets or clears the lock byte
2083 		 * for LOCK_PRIO_INHERIT mutexes.
2084 		 * Set it here for consistency.
2085 		 */
2086 		switch (error) {
2087 		case 0:
2088 			self->ul_pilocks++;
2089 			mp->mutex_lockw = LOCKSET;
2090 			break;
2091 		case EOWNERDEAD:
2092 		case ELOCKUNMAPPED:
2093 			self->ul_pilocks++;
2094 			mp->mutex_lockw = LOCKSET;
2095 			/* FALLTHROUGH */
2096 		case ENOTRECOVERABLE:
2097 			ASSERT(mtype & LOCK_ROBUST);
2098 			break;
2099 		case EDEADLK:
2100 			if (try == MUTEX_TRY) {
2101 				error = EBUSY;
2102 			} else if (tsp != NULL) {	/* simulate a timeout */
2103 				/*
2104 				 * Note: mutex_timedlock() never returns EINTR.
2105 				 */
2106 				timespec_t ts = *tsp;
2107 				timespec_t rts;
2108 
2109 				while (__nanosleep(&ts, &rts) == EINTR)
2110 					ts = rts;
2111 				error = ETIME;
2112 			} else {		/* simulate a deadlock */
2113 				stall();
2114 			}
2115 			break;
2116 		}
2117 	} else if (mtype & USYNC_PROCESS) {
2118 		error = mutex_trylock_process(mp, try == MUTEX_LOCK);
2119 		if (error == EBUSY && try == MUTEX_LOCK)
2120 			error = mutex_lock_kernel(mp, tsp, msp);
2121 	} else {	/* USYNC_THREAD */
2122 		error = mutex_trylock_adaptive(mp, try == MUTEX_LOCK);
2123 		if (error == EBUSY && try == MUTEX_LOCK)
2124 			error = mutex_lock_queue(self, msp, mp, tsp);
2125 	}
2126 
2127 	switch (error) {
2128 	case 0:
2129 	case EOWNERDEAD:
2130 	case ELOCKUNMAPPED:
2131 		if (mtype & LOCK_ROBUST)
2132 			remember_lock(mp);
2133 		if (msp)
2134 			record_begin_hold(msp);
2135 		break;
2136 	default:
2137 		if ((mtype & LOCK_PRIO_PROTECT) && noceil == 0) {
2138 			(void) _ceil_mylist_del(mp);
2139 			if (myprio < ceil)
2140 				_ceil_prio_waive();
2141 		}
2142 		if (try == MUTEX_TRY) {
2143 			if (msp)
2144 				tdb_incr(msp->mutex_try_fail);
2145 			if (__td_event_report(self, TD_LOCK_TRY, udp)) {
2146 				self->ul_td_evbuf.eventnum = TD_LOCK_TRY;
2147 				tdb_event(TD_LOCK_TRY, udp);
2148 			}
2149 		}
2150 		break;
2151 	}
2152 
2153 	return (error);
2154 }
2155 
2156 int
2157 fast_process_lock(mutex_t *mp, timespec_t *tsp, int mtype, int try)
2158 {
2159 	ulwp_t *self = curthread;
2160 	uberdata_t *udp = self->ul_uberdata;
2161 
2162 	/*
2163 	 * We know that USYNC_PROCESS is set in mtype and that
2164 	 * zero, one, or both of the flags LOCK_RECURSIVE and
2165 	 * LOCK_ERRORCHECK are set, and that no other flags are set.
2166 	 */
2167 	ASSERT((mtype & ~(USYNC_PROCESS|LOCK_RECURSIVE|LOCK_ERRORCHECK)) == 0);
2168 	enter_critical(self);
2169 #if defined(__sparc) && !defined(_LP64)
2170 	/* horrible hack, necessary only on 32-bit sparc */
2171 	if (((uintptr_t)mp & (_LONG_LONG_ALIGNMENT - 1)) &&
2172 	    self->ul_misaligned) {
2173 		if (set_lock_byte(&mp->mutex_lockw) == 0) {
2174 			mp->mutex_ownerpid = udp->pid;
2175 			mp->mutex_owner = (uintptr_t)self;
2176 			exit_critical(self);
2177 			DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
2178 			return (0);
2179 		}
2180 	} else
2181 #endif
2182 	if (set_lock_byte64(&mp->mutex_lockword64, udp->pid) == 0) {
2183 		mp->mutex_owner = (uintptr_t)self;
2184 		/* mp->mutex_ownerpid was set by set_lock_byte64() */
2185 		exit_critical(self);
2186 		DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
2187 		return (0);
2188 	}
2189 	exit_critical(self);
2190 
2191 	if ((mtype & (LOCK_RECURSIVE|LOCK_ERRORCHECK)) && shared_mutex_held(mp))
2192 		return (mutex_recursion(mp, mtype, try));
2193 
2194 	if (try == MUTEX_LOCK) {
2195 		if (mutex_trylock_process(mp, 1) == 0)
2196 			return (0);
2197 		return (mutex_lock_kernel(mp, tsp, NULL));
2198 	}
2199 
2200 	if (__td_event_report(self, TD_LOCK_TRY, udp)) {
2201 		self->ul_td_evbuf.eventnum = TD_LOCK_TRY;
2202 		tdb_event(TD_LOCK_TRY, udp);
2203 	}
2204 	return (EBUSY);
2205 }
2206 
2207 static int
2208 mutex_lock_impl(mutex_t *mp, timespec_t *tsp)
2209 {
2210 	ulwp_t *self = curthread;
2211 	int mtype = mp->mutex_type;
2212 	uberflags_t *gflags;
2213 
2214 	if (((uintptr_t)mp & (_LONG_LONG_ALIGNMENT - 1)) &&
2215 	    self->ul_error_detection && self->ul_misaligned == 0)
2216 		lock_error(mp, "mutex_lock", NULL, "mutex is misaligned");
2217 
2218 	/*
2219 	 * Optimize the case of USYNC_THREAD, including
2220 	 * the LOCK_RECURSIVE and LOCK_ERRORCHECK cases,
2221 	 * no error detection, no lock statistics,
2222 	 * and the process has only a single thread.
2223 	 * (Most likely a traditional single-threaded application.)
2224 	 */
2225 	if (((mtype & ~(LOCK_RECURSIVE|LOCK_ERRORCHECK)) |
2226 	    self->ul_uberdata->uberflags.uf_all) == 0) {
2227 		/*
2228 		 * Only one thread exists so we don't need an atomic operation.
2229 		 * We do, however, need to protect against signals.
2230 		 */
2231 		if (mp->mutex_lockw == 0) {
2232 			sigoff(self);
2233 			mp->mutex_lockw = LOCKSET;
2234 			mp->mutex_owner = (uintptr_t)self;
2235 			sigon(self);
2236 			DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
2237 			return (0);
2238 		}
2239 		if (mtype && MUTEX_OWNER(mp) == self)
2240 			return (mutex_recursion(mp, mtype, MUTEX_LOCK));
2241 		/*
2242 		 * We have reached a deadlock, probably because the
2243 		 * process is executing non-async-signal-safe code in
2244 		 * a signal handler and is attempting to acquire a lock
2245 		 * that it already owns.  This is not surprising, given
2246 		 * bad programming practices over the years that has
2247 		 * resulted in applications calling printf() and such
2248 		 * in their signal handlers.  Unless the user has told
2249 		 * us that the signal handlers are safe by setting:
2250 		 *	export _THREAD_ASYNC_SAFE=1
2251 		 * we return EDEADLK rather than actually deadlocking.
2252 		 */
2253 		if (tsp == NULL &&
2254 		    MUTEX_OWNER(mp) == self && !self->ul_async_safe) {
2255 			DTRACE_PROBE2(plockstat, mutex__error, mp, EDEADLK);
2256 			return (EDEADLK);
2257 		}
2258 	}
2259 
2260 	/*
2261 	 * Optimize the common cases of USYNC_THREAD or USYNC_PROCESS,
2262 	 * no error detection, and no lock statistics.
2263 	 * Include LOCK_RECURSIVE and LOCK_ERRORCHECK cases.
2264 	 */
2265 	if ((gflags = self->ul_schedctl_called) != NULL &&
2266 	    (gflags->uf_trs_ted |
2267 	    (mtype & ~(USYNC_PROCESS|LOCK_RECURSIVE|LOCK_ERRORCHECK))) == 0) {
2268 		if (mtype & USYNC_PROCESS)
2269 			return (fast_process_lock(mp, tsp, mtype, MUTEX_LOCK));
2270 		sigoff(self);
2271 		if (set_lock_byte(&mp->mutex_lockw) == 0) {
2272 			mp->mutex_owner = (uintptr_t)self;
2273 			sigon(self);
2274 			DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
2275 			return (0);
2276 		}
2277 		sigon(self);
2278 		if (mtype && MUTEX_OWNER(mp) == self)
2279 			return (mutex_recursion(mp, mtype, MUTEX_LOCK));
2280 		if (mutex_trylock_adaptive(mp, 1) != 0)
2281 			return (mutex_lock_queue(self, NULL, mp, tsp));
2282 		return (0);
2283 	}
2284 
2285 	/* else do it the long way */
2286 	return (mutex_lock_internal(mp, tsp, MUTEX_LOCK));
2287 }
2288 
2289 #pragma weak pthread_mutex_lock = mutex_lock
2290 #pragma weak _mutex_lock = mutex_lock
2291 int
2292 mutex_lock(mutex_t *mp)
2293 {
2294 	ASSERT(!curthread->ul_critical || curthread->ul_bindflags);
2295 	return (mutex_lock_impl(mp, NULL));
2296 }
2297 
2298 int
2299 pthread_mutex_timedlock(pthread_mutex_t *_RESTRICT_KYWD mp,
2300 	const struct timespec *_RESTRICT_KYWD abstime)
2301 {
2302 	timespec_t tslocal;
2303 	int error;
2304 
2305 	ASSERT(!curthread->ul_critical || curthread->ul_bindflags);
2306 	abstime_to_reltime(CLOCK_REALTIME, abstime, &tslocal);
2307 	error = mutex_lock_impl((mutex_t *)mp, &tslocal);
2308 	if (error == ETIME)
2309 		error = ETIMEDOUT;
2310 	return (error);
2311 }
2312 
2313 int
2314 pthread_mutex_reltimedlock_np(pthread_mutex_t *_RESTRICT_KYWD mp,
2315 	const struct timespec *_RESTRICT_KYWD reltime)
2316 {
2317 	timespec_t tslocal;
2318 	int error;
2319 
2320 	ASSERT(!curthread->ul_critical || curthread->ul_bindflags);
2321 	tslocal = *reltime;
2322 	error = mutex_lock_impl((mutex_t *)mp, &tslocal);
2323 	if (error == ETIME)
2324 		error = ETIMEDOUT;
2325 	return (error);
2326 }
2327 
2328 #pragma weak pthread_mutex_trylock = mutex_trylock
2329 int
2330 mutex_trylock(mutex_t *mp)
2331 {
2332 	ulwp_t *self = curthread;
2333 	uberdata_t *udp = self->ul_uberdata;
2334 	int mtype = mp->mutex_type;
2335 	uberflags_t *gflags;
2336 
2337 	ASSERT(!curthread->ul_critical || curthread->ul_bindflags);
2338 
2339 	/*
2340 	 * Optimize the case of USYNC_THREAD, including
2341 	 * the LOCK_RECURSIVE and LOCK_ERRORCHECK cases,
2342 	 * no error detection, no lock statistics,
2343 	 * and the process has only a single thread.
2344 	 * (Most likely a traditional single-threaded application.)
2345 	 */
2346 	if (((mtype & ~(LOCK_RECURSIVE|LOCK_ERRORCHECK)) |
2347 	    udp->uberflags.uf_all) == 0) {
2348 		/*
2349 		 * Only one thread exists so we don't need an atomic operation.
2350 		 * We do, however, need to protect against signals.
2351 		 */
2352 		if (mp->mutex_lockw == 0) {
2353 			sigoff(self);
2354 			mp->mutex_lockw = LOCKSET;
2355 			mp->mutex_owner = (uintptr_t)self;
2356 			sigon(self);
2357 			DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
2358 			return (0);
2359 		}
2360 		if (mtype && MUTEX_OWNER(mp) == self)
2361 			return (mutex_recursion(mp, mtype, MUTEX_TRY));
2362 		return (EBUSY);
2363 	}
2364 
2365 	/*
2366 	 * Optimize the common cases of USYNC_THREAD or USYNC_PROCESS,
2367 	 * no error detection, and no lock statistics.
2368 	 * Include LOCK_RECURSIVE and LOCK_ERRORCHECK cases.
2369 	 */
2370 	if ((gflags = self->ul_schedctl_called) != NULL &&
2371 	    (gflags->uf_trs_ted |
2372 	    (mtype & ~(USYNC_PROCESS|LOCK_RECURSIVE|LOCK_ERRORCHECK))) == 0) {
2373 		if (mtype & USYNC_PROCESS)
2374 			return (fast_process_lock(mp, NULL, mtype, MUTEX_TRY));
2375 		sigoff(self);
2376 		if (set_lock_byte(&mp->mutex_lockw) == 0) {
2377 			mp->mutex_owner = (uintptr_t)self;
2378 			sigon(self);
2379 			DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
2380 			return (0);
2381 		}
2382 		sigon(self);
2383 		if (mtype && MUTEX_OWNER(mp) == self)
2384 			return (mutex_recursion(mp, mtype, MUTEX_TRY));
2385 		if (__td_event_report(self, TD_LOCK_TRY, udp)) {
2386 			self->ul_td_evbuf.eventnum = TD_LOCK_TRY;
2387 			tdb_event(TD_LOCK_TRY, udp);
2388 		}
2389 		return (EBUSY);
2390 	}
2391 
2392 	/* else do it the long way */
2393 	return (mutex_lock_internal(mp, NULL, MUTEX_TRY));
2394 }
2395 
2396 int
2397 mutex_unlock_internal(mutex_t *mp, int retain_robust_flags)
2398 {
2399 	ulwp_t *self = curthread;
2400 	uberdata_t *udp = self->ul_uberdata;
2401 	int mtype = mp->mutex_type;
2402 	tdb_mutex_stats_t *msp;
2403 	int error = 0;
2404 	int release_all;
2405 	lwpid_t lwpid;
2406 
2407 	if ((mtype & (LOCK_ERRORCHECK | LOCK_ROBUST)) &&
2408 	    !mutex_held(mp))
2409 		return (EPERM);
2410 
2411 	if (self->ul_error_detection && !mutex_held(mp))
2412 		lock_error(mp, "mutex_unlock", NULL, NULL);
2413 
2414 	if ((mtype & LOCK_RECURSIVE) && mp->mutex_rcount != 0) {
2415 		mp->mutex_rcount--;
2416 		DTRACE_PROBE2(plockstat, mutex__release, mp, 1);
2417 		return (0);
2418 	}
2419 
2420 	if ((msp = MUTEX_STATS(mp, udp)) != NULL)
2421 		(void) record_hold_time(msp);
2422 
2423 	if (!retain_robust_flags && !(mtype & LOCK_PRIO_INHERIT) &&
2424 	    (mp->mutex_flag & (LOCK_OWNERDEAD | LOCK_UNMAPPED))) {
2425 		ASSERT(mtype & LOCK_ROBUST);
2426 		mp->mutex_flag &= ~(LOCK_OWNERDEAD | LOCK_UNMAPPED);
2427 		mp->mutex_flag |= LOCK_NOTRECOVERABLE;
2428 	}
2429 	release_all = ((mp->mutex_flag & LOCK_NOTRECOVERABLE) != 0);
2430 
2431 	if (mtype & LOCK_PRIO_INHERIT) {
2432 		no_preempt(self);
2433 		mp->mutex_owner = 0;
2434 		/* mp->mutex_ownerpid is cleared by ___lwp_mutex_unlock() */
2435 		DTRACE_PROBE2(plockstat, mutex__release, mp, 0);
2436 		mp->mutex_lockw = LOCKCLEAR;
2437 		self->ul_pilocks--;
2438 		error = ___lwp_mutex_unlock(mp);
2439 		preempt(self);
2440 	} else if (mtype & USYNC_PROCESS) {
2441 		mutex_unlock_process(mp, release_all);
2442 	} else {	/* USYNC_THREAD */
2443 		if ((lwpid = mutex_unlock_queue(mp, release_all)) != 0) {
2444 			(void) __lwp_unpark(lwpid);
2445 			preempt(self);
2446 		}
2447 	}
2448 
2449 	if (mtype & LOCK_ROBUST)
2450 		forget_lock(mp);
2451 
2452 	if ((mtype & LOCK_PRIO_PROTECT) && _ceil_mylist_del(mp))
2453 		_ceil_prio_waive();
2454 
2455 	return (error);
2456 }
2457 
2458 #pragma weak pthread_mutex_unlock = mutex_unlock
2459 #pragma weak _mutex_unlock = mutex_unlock
2460 int
2461 mutex_unlock(mutex_t *mp)
2462 {
2463 	ulwp_t *self = curthread;
2464 	int mtype = mp->mutex_type;
2465 	uberflags_t *gflags;
2466 	lwpid_t lwpid;
2467 	short el;
2468 
2469 	/*
2470 	 * Optimize the case of USYNC_THREAD, including
2471 	 * the LOCK_RECURSIVE and LOCK_ERRORCHECK cases,
2472 	 * no error detection, no lock statistics,
2473 	 * and the process has only a single thread.
2474 	 * (Most likely a traditional single-threaded application.)
2475 	 */
2476 	if (((mtype & ~(LOCK_RECURSIVE|LOCK_ERRORCHECK)) |
2477 	    self->ul_uberdata->uberflags.uf_all) == 0) {
2478 		if (mtype) {
2479 			/*
2480 			 * At this point we know that one or both of the
2481 			 * flags LOCK_RECURSIVE or LOCK_ERRORCHECK is set.
2482 			 */
2483 			if ((mtype & LOCK_ERRORCHECK) && !MUTEX_OWNED(mp, self))
2484 				return (EPERM);
2485 			if ((mtype & LOCK_RECURSIVE) && mp->mutex_rcount != 0) {
2486 				mp->mutex_rcount--;
2487 				DTRACE_PROBE2(plockstat, mutex__release, mp, 1);
2488 				return (0);
2489 			}
2490 		}
2491 		/*
2492 		 * Only one thread exists so we don't need an atomic operation.
2493 		 * Also, there can be no waiters.
2494 		 */
2495 		sigoff(self);
2496 		mp->mutex_owner = 0;
2497 		mp->mutex_lockword = 0;
2498 		sigon(self);
2499 		DTRACE_PROBE2(plockstat, mutex__release, mp, 0);
2500 		return (0);
2501 	}
2502 
2503 	/*
2504 	 * Optimize the common cases of USYNC_THREAD or USYNC_PROCESS,
2505 	 * no error detection, and no lock statistics.
2506 	 * Include LOCK_RECURSIVE and LOCK_ERRORCHECK cases.
2507 	 */
2508 	if ((gflags = self->ul_schedctl_called) != NULL) {
2509 		if (((el = gflags->uf_trs_ted) | mtype) == 0) {
2510 fast_unlock:
2511 			if ((lwpid = mutex_unlock_queue(mp, 0)) != 0) {
2512 				(void) __lwp_unpark(lwpid);
2513 				preempt(self);
2514 			}
2515 			return (0);
2516 		}
2517 		if (el)		/* error detection or lock statistics */
2518 			goto slow_unlock;
2519 		if ((mtype & ~(LOCK_RECURSIVE|LOCK_ERRORCHECK)) == 0) {
2520 			/*
2521 			 * At this point we know that one or both of the
2522 			 * flags LOCK_RECURSIVE or LOCK_ERRORCHECK is set.
2523 			 */
2524 			if ((mtype & LOCK_ERRORCHECK) && !MUTEX_OWNED(mp, self))
2525 				return (EPERM);
2526 			if ((mtype & LOCK_RECURSIVE) && mp->mutex_rcount != 0) {
2527 				mp->mutex_rcount--;
2528 				DTRACE_PROBE2(plockstat, mutex__release, mp, 1);
2529 				return (0);
2530 			}
2531 			goto fast_unlock;
2532 		}
2533 		if ((mtype &
2534 		    ~(USYNC_PROCESS|LOCK_RECURSIVE|LOCK_ERRORCHECK)) == 0) {
2535 			/*
2536 			 * At this point we know that zero, one, or both of the
2537 			 * flags LOCK_RECURSIVE or LOCK_ERRORCHECK is set and
2538 			 * that the USYNC_PROCESS flag is set.
2539 			 */
2540 			if ((mtype & LOCK_ERRORCHECK) && !shared_mutex_held(mp))
2541 				return (EPERM);
2542 			if ((mtype & LOCK_RECURSIVE) && mp->mutex_rcount != 0) {
2543 				mp->mutex_rcount--;
2544 				DTRACE_PROBE2(plockstat, mutex__release, mp, 1);
2545 				return (0);
2546 			}
2547 			mutex_unlock_process(mp, 0);
2548 			return (0);
2549 		}
2550 	}
2551 
2552 	/* else do it the long way */
2553 slow_unlock:
2554 	return (mutex_unlock_internal(mp, 0));
2555 }
2556 
2557 /*
2558  * Internally to the library, almost all mutex lock/unlock actions
2559  * go through these lmutex_ functions, to protect critical regions.
2560  * We replicate a bit of code from mutex_lock() and mutex_unlock()
2561  * to make these functions faster since we know that the mutex type
2562  * of all internal locks is USYNC_THREAD.  We also know that internal
2563  * locking can never fail, so we panic if it does.
2564  */
2565 void
2566 lmutex_lock(mutex_t *mp)
2567 {
2568 	ulwp_t *self = curthread;
2569 	uberdata_t *udp = self->ul_uberdata;
2570 
2571 	ASSERT(mp->mutex_type == USYNC_THREAD);
2572 
2573 	enter_critical(self);
2574 	/*
2575 	 * Optimize the case of no lock statistics and only a single thread.
2576 	 * (Most likely a traditional single-threaded application.)
2577 	 */
2578 	if (udp->uberflags.uf_all == 0) {
2579 		/*
2580 		 * Only one thread exists; the mutex must be free.
2581 		 */
2582 		ASSERT(mp->mutex_lockw == 0);
2583 		mp->mutex_lockw = LOCKSET;
2584 		mp->mutex_owner = (uintptr_t)self;
2585 		DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
2586 	} else {
2587 		tdb_mutex_stats_t *msp = MUTEX_STATS(mp, udp);
2588 
2589 		if (!self->ul_schedctl_called)
2590 			(void) setup_schedctl();
2591 
2592 		if (set_lock_byte(&mp->mutex_lockw) == 0) {
2593 			mp->mutex_owner = (uintptr_t)self;
2594 			DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
2595 		} else if (mutex_trylock_adaptive(mp, 1) != 0) {
2596 			(void) mutex_lock_queue(self, msp, mp, NULL);
2597 		}
2598 
2599 		if (msp)
2600 			record_begin_hold(msp);
2601 	}
2602 }
2603 
2604 void
2605 lmutex_unlock(mutex_t *mp)
2606 {
2607 	ulwp_t *self = curthread;
2608 	uberdata_t *udp = self->ul_uberdata;
2609 
2610 	ASSERT(mp->mutex_type == USYNC_THREAD);
2611 
2612 	/*
2613 	 * Optimize the case of no lock statistics and only a single thread.
2614 	 * (Most likely a traditional single-threaded application.)
2615 	 */
2616 	if (udp->uberflags.uf_all == 0) {
2617 		/*
2618 		 * Only one thread exists so there can be no waiters.
2619 		 */
2620 		mp->mutex_owner = 0;
2621 		mp->mutex_lockword = 0;
2622 		DTRACE_PROBE2(plockstat, mutex__release, mp, 0);
2623 	} else {
2624 		tdb_mutex_stats_t *msp = MUTEX_STATS(mp, udp);
2625 		lwpid_t lwpid;
2626 
2627 		if (msp)
2628 			(void) record_hold_time(msp);
2629 		if ((lwpid = mutex_unlock_queue(mp, 0)) != 0) {
2630 			(void) __lwp_unpark(lwpid);
2631 			preempt(self);
2632 		}
2633 	}
2634 	exit_critical(self);
2635 }
2636 
2637 /*
2638  * For specialized code in libc, like the asynchronous i/o code,
2639  * the following sig_*() locking primitives are used in order
2640  * to make the code asynchronous signal safe.  Signals are
2641  * deferred while locks acquired by these functions are held.
2642  */
2643 void
2644 sig_mutex_lock(mutex_t *mp)
2645 {
2646 	sigoff(curthread);
2647 	(void) mutex_lock(mp);
2648 }
2649 
2650 void
2651 sig_mutex_unlock(mutex_t *mp)
2652 {
2653 	(void) mutex_unlock(mp);
2654 	sigon(curthread);
2655 }
2656 
2657 int
2658 sig_mutex_trylock(mutex_t *mp)
2659 {
2660 	int error;
2661 
2662 	sigoff(curthread);
2663 	if ((error = mutex_trylock(mp)) != 0)
2664 		sigon(curthread);
2665 	return (error);
2666 }
2667 
2668 /*
2669  * sig_cond_wait() is a cancellation point.
2670  */
2671 int
2672 sig_cond_wait(cond_t *cv, mutex_t *mp)
2673 {
2674 	int error;
2675 
2676 	ASSERT(curthread->ul_sigdefer != 0);
2677 	pthread_testcancel();
2678 	error = __cond_wait(cv, mp);
2679 	if (error == EINTR && curthread->ul_cursig) {
2680 		sig_mutex_unlock(mp);
2681 		/* take the deferred signal here */
2682 		sig_mutex_lock(mp);
2683 	}
2684 	pthread_testcancel();
2685 	return (error);
2686 }
2687 
2688 /*
2689  * sig_cond_reltimedwait() is a cancellation point.
2690  */
2691 int
2692 sig_cond_reltimedwait(cond_t *cv, mutex_t *mp, const timespec_t *ts)
2693 {
2694 	int error;
2695 
2696 	ASSERT(curthread->ul_sigdefer != 0);
2697 	pthread_testcancel();
2698 	error = __cond_reltimedwait(cv, mp, ts);
2699 	if (error == EINTR && curthread->ul_cursig) {
2700 		sig_mutex_unlock(mp);
2701 		/* take the deferred signal here */
2702 		sig_mutex_lock(mp);
2703 	}
2704 	pthread_testcancel();
2705 	return (error);
2706 }
2707 
2708 /*
2709  * For specialized code in libc, like the stdio code.
2710  * the following cancel_safe_*() locking primitives are used in
2711  * order to make the code cancellation-safe.  Cancellation is
2712  * deferred while locks acquired by these functions are held.
2713  */
2714 void
2715 cancel_safe_mutex_lock(mutex_t *mp)
2716 {
2717 	(void) mutex_lock(mp);
2718 	curthread->ul_libc_locks++;
2719 }
2720 
2721 int
2722 cancel_safe_mutex_trylock(mutex_t *mp)
2723 {
2724 	int error;
2725 
2726 	if ((error = mutex_trylock(mp)) == 0)
2727 		curthread->ul_libc_locks++;
2728 	return (error);
2729 }
2730 
2731 void
2732 cancel_safe_mutex_unlock(mutex_t *mp)
2733 {
2734 	ulwp_t *self = curthread;
2735 
2736 	ASSERT(self->ul_libc_locks != 0);
2737 
2738 	(void) mutex_unlock(mp);
2739 
2740 	/*
2741 	 * Decrement the count of locks held by cancel_safe_mutex_lock().
2742 	 * If we are then in a position to terminate cleanly and
2743 	 * if there is a pending cancellation and cancellation
2744 	 * is not disabled and we received EINTR from a recent
2745 	 * system call then perform the cancellation action now.
2746 	 */
2747 	if (--self->ul_libc_locks == 0 &&
2748 	    !(self->ul_vfork | self->ul_nocancel |
2749 	    self->ul_critical | self->ul_sigdefer) &&
2750 	    cancel_active())
2751 		pthread_exit(PTHREAD_CANCELED);
2752 }
2753 
2754 static int
2755 shared_mutex_held(mutex_t *mparg)
2756 {
2757 	/*
2758 	 * The 'volatile' is necessary to make sure the compiler doesn't
2759 	 * reorder the tests of the various components of the mutex.
2760 	 * They must be tested in this order:
2761 	 *	mutex_lockw
2762 	 *	mutex_owner
2763 	 *	mutex_ownerpid
2764 	 * This relies on the fact that everywhere mutex_lockw is cleared,
2765 	 * mutex_owner and mutex_ownerpid are cleared before mutex_lockw
2766 	 * is cleared, and that everywhere mutex_lockw is set, mutex_owner
2767 	 * and mutex_ownerpid are set after mutex_lockw is set, and that
2768 	 * mutex_lockw is set or cleared with a memory barrier.
2769 	 */
2770 	volatile mutex_t *mp = (volatile mutex_t *)mparg;
2771 	ulwp_t *self = curthread;
2772 	uberdata_t *udp = self->ul_uberdata;
2773 
2774 	return (MUTEX_OWNED(mp, self) && mp->mutex_ownerpid == udp->pid);
2775 }
2776 
2777 #pragma weak _mutex_held = mutex_held
2778 int
2779 mutex_held(mutex_t *mparg)
2780 {
2781 	volatile mutex_t *mp = (volatile mutex_t *)mparg;
2782 
2783 	if (mparg->mutex_type & USYNC_PROCESS)
2784 		return (shared_mutex_held(mparg));
2785 	return (MUTEX_OWNED(mp, curthread));
2786 }
2787 
2788 #pragma weak pthread_mutex_destroy = mutex_destroy
2789 #pragma weak _mutex_destroy = mutex_destroy
2790 int
2791 mutex_destroy(mutex_t *mp)
2792 {
2793 	if (mp->mutex_type & USYNC_PROCESS)
2794 		forget_lock(mp);
2795 	(void) memset(mp, 0, sizeof (*mp));
2796 	tdb_sync_obj_deregister(mp);
2797 	return (0);
2798 }
2799 
2800 #pragma weak pthread_mutex_consistent_np = mutex_consistent
2801 #pragma weak pthread_mutex_consistent = mutex_consistent
2802 int
2803 mutex_consistent(mutex_t *mp)
2804 {
2805 	/*
2806 	 * Do this only for an inconsistent, initialized robust lock
2807 	 * that we hold.  For all other cases, return EINVAL.
2808 	 */
2809 	if (mutex_held(mp) &&
2810 	    (mp->mutex_type & LOCK_ROBUST) &&
2811 	    (mp->mutex_flag & LOCK_INITED) &&
2812 	    (mp->mutex_flag & (LOCK_OWNERDEAD | LOCK_UNMAPPED))) {
2813 		mp->mutex_flag &= ~(LOCK_OWNERDEAD | LOCK_UNMAPPED);
2814 		mp->mutex_rcount = 0;
2815 		return (0);
2816 	}
2817 	return (EINVAL);
2818 }
2819 
2820 /*
2821  * Spin locks are separate from ordinary mutexes,
2822  * but we use the same data structure for them.
2823  */
2824 
2825 int
2826 pthread_spin_init(pthread_spinlock_t *lock, int pshared)
2827 {
2828 	mutex_t *mp = (mutex_t *)lock;
2829 
2830 	(void) memset(mp, 0, sizeof (*mp));
2831 	if (pshared == PTHREAD_PROCESS_SHARED)
2832 		mp->mutex_type = USYNC_PROCESS;
2833 	else
2834 		mp->mutex_type = USYNC_THREAD;
2835 	mp->mutex_flag = LOCK_INITED;
2836 	mp->mutex_magic = MUTEX_MAGIC;
2837 
2838 	/*
2839 	 * This should be at the beginning of the function,
2840 	 * but for the sake of old broken applications that
2841 	 * do not have proper alignment for their mutexes
2842 	 * (and don't check the return code from pthread_spin_init),
2843 	 * we put it here, after initializing the mutex regardless.
2844 	 */
2845 	if (((uintptr_t)mp & (_LONG_LONG_ALIGNMENT - 1)) &&
2846 	    curthread->ul_misaligned == 0)
2847 		return (EINVAL);
2848 
2849 	return (0);
2850 }
2851 
2852 int
2853 pthread_spin_destroy(pthread_spinlock_t *lock)
2854 {
2855 	(void) memset(lock, 0, sizeof (*lock));
2856 	return (0);
2857 }
2858 
2859 int
2860 pthread_spin_trylock(pthread_spinlock_t *lock)
2861 {
2862 	mutex_t *mp = (mutex_t *)lock;
2863 	ulwp_t *self = curthread;
2864 	int error = 0;
2865 
2866 	no_preempt(self);
2867 	if (set_lock_byte(&mp->mutex_lockw) != 0)
2868 		error = EBUSY;
2869 	else {
2870 		mp->mutex_owner = (uintptr_t)self;
2871 		if (mp->mutex_type == USYNC_PROCESS)
2872 			mp->mutex_ownerpid = self->ul_uberdata->pid;
2873 		DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
2874 	}
2875 	preempt(self);
2876 	return (error);
2877 }
2878 
2879 int
2880 pthread_spin_lock(pthread_spinlock_t *lock)
2881 {
2882 	mutex_t *mp = (mutex_t *)lock;
2883 	ulwp_t *self = curthread;
2884 	volatile uint8_t *lockp = (volatile uint8_t *)&mp->mutex_lockw;
2885 	int count = 0;
2886 
2887 	ASSERT(!self->ul_critical || self->ul_bindflags);
2888 
2889 	DTRACE_PROBE1(plockstat, mutex__spin, mp);
2890 
2891 	/*
2892 	 * We don't care whether the owner is running on a processor.
2893 	 * We just spin because that's what this interface requires.
2894 	 */
2895 	for (;;) {
2896 		if (*lockp == 0) {	/* lock byte appears to be clear */
2897 			no_preempt(self);
2898 			if (set_lock_byte(lockp) == 0)
2899 				break;
2900 			preempt(self);
2901 		}
2902 		if (count < INT_MAX)
2903 			count++;
2904 		SMT_PAUSE();
2905 	}
2906 	mp->mutex_owner = (uintptr_t)self;
2907 	if (mp->mutex_type == USYNC_PROCESS)
2908 		mp->mutex_ownerpid = self->ul_uberdata->pid;
2909 	preempt(self);
2910 	if (count) {
2911 		DTRACE_PROBE2(plockstat, mutex__spun, 1, count);
2912 	}
2913 	DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, count);
2914 	return (0);
2915 }
2916 
2917 int
2918 pthread_spin_unlock(pthread_spinlock_t *lock)
2919 {
2920 	mutex_t *mp = (mutex_t *)lock;
2921 	ulwp_t *self = curthread;
2922 
2923 	no_preempt(self);
2924 	mp->mutex_owner = 0;
2925 	mp->mutex_ownerpid = 0;
2926 	DTRACE_PROBE2(plockstat, mutex__release, mp, 0);
2927 	(void) atomic_swap_32(&mp->mutex_lockword, 0);
2928 	preempt(self);
2929 	return (0);
2930 }
2931 
2932 #define	INITIAL_LOCKS	8	/* initial size of ul_heldlocks.array */
2933 
2934 /*
2935  * Find/allocate an entry for 'lock' in our array of held locks.
2936  */
2937 static mutex_t **
2938 find_lock_entry(mutex_t *lock)
2939 {
2940 	ulwp_t *self = curthread;
2941 	mutex_t **remembered = NULL;
2942 	mutex_t **lockptr;
2943 	uint_t nlocks;
2944 
2945 	if ((nlocks = self->ul_heldlockcnt) != 0)
2946 		lockptr = self->ul_heldlocks.array;
2947 	else {
2948 		nlocks = 1;
2949 		lockptr = &self->ul_heldlocks.single;
2950 	}
2951 
2952 	for (; nlocks; nlocks--, lockptr++) {
2953 		if (*lockptr == lock)
2954 			return (lockptr);
2955 		if (*lockptr == NULL && remembered == NULL)
2956 			remembered = lockptr;
2957 	}
2958 	if (remembered != NULL) {
2959 		*remembered = lock;
2960 		return (remembered);
2961 	}
2962 
2963 	/*
2964 	 * No entry available.  Allocate more space, converting
2965 	 * the single entry into an array of entries if necessary.
2966 	 */
2967 	if ((nlocks = self->ul_heldlockcnt) == 0) {
2968 		/*
2969 		 * Initial allocation of the array.
2970 		 * Convert the single entry into an array.
2971 		 */
2972 		self->ul_heldlockcnt = nlocks = INITIAL_LOCKS;
2973 		lockptr = lmalloc(nlocks * sizeof (mutex_t *));
2974 		/*
2975 		 * The single entry becomes the first entry in the array.
2976 		 */
2977 		*lockptr = self->ul_heldlocks.single;
2978 		self->ul_heldlocks.array = lockptr;
2979 		/*
2980 		 * Return the next available entry in the array.
2981 		 */
2982 		*++lockptr = lock;
2983 		return (lockptr);
2984 	}
2985 	/*
2986 	 * Reallocate the array, double the size each time.
2987 	 */
2988 	lockptr = lmalloc(nlocks * 2 * sizeof (mutex_t *));
2989 	(void) memcpy(lockptr, self->ul_heldlocks.array,
2990 	    nlocks * sizeof (mutex_t *));
2991 	lfree(self->ul_heldlocks.array, nlocks * sizeof (mutex_t *));
2992 	self->ul_heldlocks.array = lockptr;
2993 	self->ul_heldlockcnt *= 2;
2994 	/*
2995 	 * Return the next available entry in the newly allocated array.
2996 	 */
2997 	*(lockptr += nlocks) = lock;
2998 	return (lockptr);
2999 }
3000 
3001 /*
3002  * Insert 'lock' into our list of held locks.
3003  * Currently only used for LOCK_ROBUST mutexes.
3004  */
3005 void
3006 remember_lock(mutex_t *lock)
3007 {
3008 	(void) find_lock_entry(lock);
3009 }
3010 
3011 /*
3012  * Remove 'lock' from our list of held locks.
3013  * Currently only used for LOCK_ROBUST mutexes.
3014  */
3015 void
3016 forget_lock(mutex_t *lock)
3017 {
3018 	*find_lock_entry(lock) = NULL;
3019 }
3020 
3021 /*
3022  * Free the array of held locks.
3023  */
3024 void
3025 heldlock_free(ulwp_t *ulwp)
3026 {
3027 	uint_t nlocks;
3028 
3029 	if ((nlocks = ulwp->ul_heldlockcnt) != 0)
3030 		lfree(ulwp->ul_heldlocks.array, nlocks * sizeof (mutex_t *));
3031 	ulwp->ul_heldlockcnt = 0;
3032 	ulwp->ul_heldlocks.array = NULL;
3033 }
3034 
3035 /*
3036  * Mark all held LOCK_ROBUST mutexes LOCK_OWNERDEAD.
3037  * Called from _thrp_exit() to deal with abandoned locks.
3038  */
3039 void
3040 heldlock_exit(void)
3041 {
3042 	ulwp_t *self = curthread;
3043 	mutex_t **lockptr;
3044 	uint_t nlocks;
3045 	mutex_t *mp;
3046 
3047 	if ((nlocks = self->ul_heldlockcnt) != 0)
3048 		lockptr = self->ul_heldlocks.array;
3049 	else {
3050 		nlocks = 1;
3051 		lockptr = &self->ul_heldlocks.single;
3052 	}
3053 
3054 	for (; nlocks; nlocks--, lockptr++) {
3055 		/*
3056 		 * The kernel takes care of transitioning held
3057 		 * LOCK_PRIO_INHERIT mutexes to LOCK_OWNERDEAD.
3058 		 * We avoid that case here.
3059 		 */
3060 		if ((mp = *lockptr) != NULL &&
3061 		    mutex_held(mp) &&
3062 		    (mp->mutex_type & (LOCK_ROBUST | LOCK_PRIO_INHERIT)) ==
3063 		    LOCK_ROBUST) {
3064 			mp->mutex_rcount = 0;
3065 			if (!(mp->mutex_flag & LOCK_UNMAPPED))
3066 				mp->mutex_flag |= LOCK_OWNERDEAD;
3067 			(void) mutex_unlock_internal(mp, 1);
3068 		}
3069 	}
3070 
3071 	heldlock_free(self);
3072 }
3073 
3074 #pragma weak _cond_init = cond_init
3075 /* ARGSUSED2 */
3076 int
3077 cond_init(cond_t *cvp, int type, void *arg)
3078 {
3079 	if (type != USYNC_THREAD && type != USYNC_PROCESS)
3080 		return (EINVAL);
3081 	(void) memset(cvp, 0, sizeof (*cvp));
3082 	cvp->cond_type = (uint16_t)type;
3083 	cvp->cond_magic = COND_MAGIC;
3084 
3085 	/*
3086 	 * This should be at the beginning of the function,
3087 	 * but for the sake of old broken applications that
3088 	 * do not have proper alignment for their condvars
3089 	 * (and don't check the return code from cond_init),
3090 	 * we put it here, after initializing the condvar regardless.
3091 	 */
3092 	if (((uintptr_t)cvp & (_LONG_LONG_ALIGNMENT - 1)) &&
3093 	    curthread->ul_misaligned == 0)
3094 		return (EINVAL);
3095 
3096 	return (0);
3097 }
3098 
3099 /*
3100  * cond_sleep_queue(): utility function for cond_wait_queue().
3101  *
3102  * Go to sleep on a condvar sleep queue, expect to be waked up
3103  * by someone calling cond_signal() or cond_broadcast() or due
3104  * to receiving a UNIX signal or being cancelled, or just simply
3105  * due to a spurious wakeup (like someome calling forkall()).
3106  *
3107  * The associated mutex is *not* reacquired before returning.
3108  * That must be done by the caller of cond_sleep_queue().
3109  */
3110 static int
3111 cond_sleep_queue(cond_t *cvp, mutex_t *mp, timespec_t *tsp)
3112 {
3113 	ulwp_t *self = curthread;
3114 	queue_head_t *qp;
3115 	queue_head_t *mqp;
3116 	lwpid_t lwpid;
3117 	int signalled;
3118 	int error;
3119 	int cv_wake;
3120 	int release_all;
3121 
3122 	/*
3123 	 * Put ourself on the CV sleep queue, unlock the mutex, then
3124 	 * park ourself and unpark a candidate lwp to grab the mutex.
3125 	 * We must go onto the CV sleep queue before dropping the
3126 	 * mutex in order to guarantee atomicity of the operation.
3127 	 */
3128 	self->ul_sp = stkptr();
3129 	qp = queue_lock(cvp, CV);
3130 	enqueue(qp, self, 0);
3131 	cvp->cond_waiters_user = 1;
3132 	self->ul_cvmutex = mp;
3133 	self->ul_cv_wake = cv_wake = (tsp != NULL);
3134 	self->ul_signalled = 0;
3135 	if (mp->mutex_flag & LOCK_OWNERDEAD) {
3136 		mp->mutex_flag &= ~LOCK_OWNERDEAD;
3137 		mp->mutex_flag |= LOCK_NOTRECOVERABLE;
3138 	}
3139 	release_all = ((mp->mutex_flag & LOCK_NOTRECOVERABLE) != 0);
3140 	lwpid = mutex_unlock_queue(mp, release_all);
3141 	for (;;) {
3142 		set_parking_flag(self, 1);
3143 		queue_unlock(qp);
3144 		if (lwpid != 0) {
3145 			lwpid = preempt_unpark(self, lwpid);
3146 			preempt(self);
3147 		}
3148 		/*
3149 		 * We may have a deferred signal present,
3150 		 * in which case we should return EINTR.
3151 		 * Also, we may have received a SIGCANCEL; if so
3152 		 * and we are cancelable we should return EINTR.
3153 		 * We force an immediate EINTR return from
3154 		 * __lwp_park() by turning our parking flag off.
3155 		 */
3156 		if (self->ul_cursig != 0 ||
3157 		    (self->ul_cancelable && self->ul_cancel_pending))
3158 			set_parking_flag(self, 0);
3159 		/*
3160 		 * __lwp_park() will return the residual time in tsp
3161 		 * if we are unparked before the timeout expires.
3162 		 */
3163 		error = __lwp_park(tsp, lwpid);
3164 		set_parking_flag(self, 0);
3165 		lwpid = 0;	/* unpark the other lwp only once */
3166 		/*
3167 		 * We were waked up by cond_signal(), cond_broadcast(),
3168 		 * by an interrupt or timeout (EINTR or ETIME),
3169 		 * or we may just have gotten a spurious wakeup.
3170 		 */
3171 		qp = queue_lock(cvp, CV);
3172 		if (!cv_wake)
3173 			mqp = queue_lock(mp, MX);
3174 		if (self->ul_sleepq == NULL)
3175 			break;
3176 		/*
3177 		 * We are on either the condvar sleep queue or the
3178 		 * mutex sleep queue.  Break out of the sleep if we
3179 		 * were interrupted or we timed out (EINTR or ETIME).
3180 		 * Else this is a spurious wakeup; continue the loop.
3181 		 */
3182 		if (!cv_wake && self->ul_sleepq == mqp) { /* mutex queue */
3183 			if (error) {
3184 				mp->mutex_waiters = dequeue_self(mqp);
3185 				break;
3186 			}
3187 			tsp = NULL;	/* no more timeout */
3188 		} else if (self->ul_sleepq == qp) {	/* condvar queue */
3189 			if (error) {
3190 				cvp->cond_waiters_user = dequeue_self(qp);
3191 				break;
3192 			}
3193 			/*
3194 			 * Else a spurious wakeup on the condvar queue.
3195 			 * __lwp_park() has already adjusted the timeout.
3196 			 */
3197 		} else {
3198 			thr_panic("cond_sleep_queue(): thread not on queue");
3199 		}
3200 		if (!cv_wake)
3201 			queue_unlock(mqp);
3202 	}
3203 
3204 	self->ul_sp = 0;
3205 	self->ul_cv_wake = 0;
3206 	ASSERT(self->ul_cvmutex == NULL);
3207 	ASSERT(self->ul_sleepq == NULL && self->ul_link == NULL &&
3208 	    self->ul_wchan == NULL);
3209 
3210 	signalled = self->ul_signalled;
3211 	self->ul_signalled = 0;
3212 	queue_unlock(qp);
3213 	if (!cv_wake)
3214 		queue_unlock(mqp);
3215 
3216 	/*
3217 	 * If we were concurrently cond_signal()d and any of:
3218 	 * received a UNIX signal, were cancelled, or got a timeout,
3219 	 * then perform another cond_signal() to avoid consuming it.
3220 	 */
3221 	if (error && signalled)
3222 		(void) cond_signal(cvp);
3223 
3224 	return (error);
3225 }
3226 
3227 static void
3228 cond_wait_check_alignment(cond_t *cvp, mutex_t *mp)
3229 {
3230 	if ((uintptr_t)mp & (_LONG_LONG_ALIGNMENT - 1))
3231 		lock_error(mp, "cond_wait", cvp, "mutex is misaligned");
3232 	if ((uintptr_t)cvp & (_LONG_LONG_ALIGNMENT - 1))
3233 		lock_error(mp, "cond_wait", cvp, "condvar is misaligned");
3234 }
3235 
3236 int
3237 cond_wait_queue(cond_t *cvp, mutex_t *mp, timespec_t *tsp)
3238 {
3239 	ulwp_t *self = curthread;
3240 	int error;
3241 	int merror;
3242 
3243 	if (self->ul_error_detection && self->ul_misaligned == 0)
3244 		cond_wait_check_alignment(cvp, mp);
3245 
3246 	/*
3247 	 * The old thread library was programmed to defer signals
3248 	 * while in cond_wait() so that the associated mutex would
3249 	 * be guaranteed to be held when the application signal
3250 	 * handler was invoked.
3251 	 *
3252 	 * We do not behave this way by default; the state of the
3253 	 * associated mutex in the signal handler is undefined.
3254 	 *
3255 	 * To accommodate applications that depend on the old
3256 	 * behavior, the _THREAD_COND_WAIT_DEFER environment
3257 	 * variable can be set to 1 and we will behave in the
3258 	 * old way with respect to cond_wait().
3259 	 */
3260 	if (self->ul_cond_wait_defer)
3261 		sigoff(self);
3262 
3263 	error = cond_sleep_queue(cvp, mp, tsp);
3264 
3265 	/*
3266 	 * Reacquire the mutex.
3267 	 */
3268 	if ((merror = mutex_lock_impl(mp, NULL)) != 0)
3269 		error = merror;
3270 
3271 	/*
3272 	 * Take any deferred signal now, after we have reacquired the mutex.
3273 	 */
3274 	if (self->ul_cond_wait_defer)
3275 		sigon(self);
3276 
3277 	return (error);
3278 }
3279 
3280 /*
3281  * cond_sleep_kernel(): utility function for cond_wait_kernel().
3282  * See the comment ahead of cond_sleep_queue(), above.
3283  */
3284 static int
3285 cond_sleep_kernel(cond_t *cvp, mutex_t *mp, timespec_t *tsp)
3286 {
3287 	int mtype = mp->mutex_type;
3288 	ulwp_t *self = curthread;
3289 	int error;
3290 
3291 	if ((mtype & LOCK_PRIO_PROTECT) && _ceil_mylist_del(mp))
3292 		_ceil_prio_waive();
3293 
3294 	self->ul_sp = stkptr();
3295 	self->ul_wchan = cvp;
3296 	sigoff(self);
3297 	mp->mutex_owner = 0;
3298 	/* mp->mutex_ownerpid is cleared by ___lwp_cond_wait() */
3299 	if (mtype & LOCK_PRIO_INHERIT) {
3300 		mp->mutex_lockw = LOCKCLEAR;
3301 		self->ul_pilocks--;
3302 	}
3303 	/*
3304 	 * ___lwp_cond_wait() returns immediately with EINTR if
3305 	 * set_parking_flag(self,0) is called on this lwp before it
3306 	 * goes to sleep in the kernel.  sigacthandler() calls this
3307 	 * when a deferred signal is noted.  This assures that we don't
3308 	 * get stuck in ___lwp_cond_wait() with all signals blocked
3309 	 * due to taking a deferred signal before going to sleep.
3310 	 */
3311 	set_parking_flag(self, 1);
3312 	if (self->ul_cursig != 0 ||
3313 	    (self->ul_cancelable && self->ul_cancel_pending))
3314 		set_parking_flag(self, 0);
3315 	error = ___lwp_cond_wait(cvp, mp, tsp, 1);
3316 	set_parking_flag(self, 0);
3317 	sigon(self);
3318 	self->ul_sp = 0;
3319 	self->ul_wchan = NULL;
3320 	return (error);
3321 }
3322 
3323 int
3324 cond_wait_kernel(cond_t *cvp, mutex_t *mp, timespec_t *tsp)
3325 {
3326 	ulwp_t *self = curthread;
3327 	int error;
3328 	int merror;
3329 
3330 	if (self->ul_error_detection && self->ul_misaligned == 0)
3331 		cond_wait_check_alignment(cvp, mp);
3332 
3333 	/*
3334 	 * See the large comment in cond_wait_queue(), above.
3335 	 */
3336 	if (self->ul_cond_wait_defer)
3337 		sigoff(self);
3338 
3339 	error = cond_sleep_kernel(cvp, mp, tsp);
3340 
3341 	/*
3342 	 * Override the return code from ___lwp_cond_wait()
3343 	 * with any non-zero return code from mutex_lock().
3344 	 * This addresses robust lock failures in particular;
3345 	 * the caller must see the EOWNERDEAD or ENOTRECOVERABLE
3346 	 * errors in order to take corrective action.
3347 	 */
3348 	if ((merror = mutex_lock_impl(mp, NULL)) != 0)
3349 		error = merror;
3350 
3351 	/*
3352 	 * Take any deferred signal now, after we have reacquired the mutex.
3353 	 */
3354 	if (self->ul_cond_wait_defer)
3355 		sigon(self);
3356 
3357 	return (error);
3358 }
3359 
3360 /*
3361  * Common code for cond_wait() and cond_timedwait()
3362  */
3363 int
3364 cond_wait_common(cond_t *cvp, mutex_t *mp, timespec_t *tsp)
3365 {
3366 	int mtype = mp->mutex_type;
3367 	hrtime_t begin_sleep = 0;
3368 	ulwp_t *self = curthread;
3369 	uberdata_t *udp = self->ul_uberdata;
3370 	tdb_cond_stats_t *csp = COND_STATS(cvp, udp);
3371 	tdb_mutex_stats_t *msp = MUTEX_STATS(mp, udp);
3372 	uint8_t rcount;
3373 	int error = 0;
3374 
3375 	/*
3376 	 * The SUSV3 Posix spec for pthread_cond_timedwait() states:
3377 	 *	Except in the case of [ETIMEDOUT], all these error checks
3378 	 *	shall act as if they were performed immediately at the
3379 	 *	beginning of processing for the function and shall cause
3380 	 *	an error return, in effect, prior to modifying the state
3381 	 *	of the mutex specified by mutex or the condition variable
3382 	 *	specified by cond.
3383 	 * Therefore, we must return EINVAL now if the timout is invalid.
3384 	 */
3385 	if (tsp != NULL &&
3386 	    (tsp->tv_sec < 0 || (ulong_t)tsp->tv_nsec >= NANOSEC))
3387 		return (EINVAL);
3388 
3389 	if (__td_event_report(self, TD_SLEEP, udp)) {
3390 		self->ul_sp = stkptr();
3391 		self->ul_wchan = cvp;
3392 		self->ul_td_evbuf.eventnum = TD_SLEEP;
3393 		self->ul_td_evbuf.eventdata = cvp;
3394 		tdb_event(TD_SLEEP, udp);
3395 		self->ul_sp = 0;
3396 	}
3397 	if (csp) {
3398 		if (tsp)
3399 			tdb_incr(csp->cond_timedwait);
3400 		else
3401 			tdb_incr(csp->cond_wait);
3402 	}
3403 	if (msp)
3404 		begin_sleep = record_hold_time(msp);
3405 	else if (csp)
3406 		begin_sleep = gethrtime();
3407 
3408 	if (self->ul_error_detection) {
3409 		if (!mutex_held(mp))
3410 			lock_error(mp, "cond_wait", cvp, NULL);
3411 		if ((mtype & LOCK_RECURSIVE) && mp->mutex_rcount != 0)
3412 			lock_error(mp, "recursive mutex in cond_wait",
3413 			    cvp, NULL);
3414 		if (cvp->cond_type & USYNC_PROCESS) {
3415 			if (!(mtype & USYNC_PROCESS))
3416 				lock_error(mp, "cond_wait", cvp,
3417 				    "condvar process-shared, "
3418 				    "mutex process-private");
3419 		} else {
3420 			if (mtype & USYNC_PROCESS)
3421 				lock_error(mp, "cond_wait", cvp,
3422 				    "condvar process-private, "
3423 				    "mutex process-shared");
3424 		}
3425 	}
3426 
3427 	/*
3428 	 * We deal with recursive mutexes by completely
3429 	 * dropping the lock and restoring the recursion
3430 	 * count after waking up.  This is arguably wrong,
3431 	 * but it obeys the principle of least astonishment.
3432 	 */
3433 	rcount = mp->mutex_rcount;
3434 	mp->mutex_rcount = 0;
3435 	if ((mtype &
3436 	    (USYNC_PROCESS | LOCK_PRIO_INHERIT | LOCK_PRIO_PROTECT)) |
3437 	    (cvp->cond_type & USYNC_PROCESS))
3438 		error = cond_wait_kernel(cvp, mp, tsp);
3439 	else
3440 		error = cond_wait_queue(cvp, mp, tsp);
3441 	mp->mutex_rcount = rcount;
3442 
3443 	if (csp) {
3444 		hrtime_t lapse = gethrtime() - begin_sleep;
3445 		if (tsp == NULL)
3446 			csp->cond_wait_sleep_time += lapse;
3447 		else {
3448 			csp->cond_timedwait_sleep_time += lapse;
3449 			if (error == ETIME)
3450 				tdb_incr(csp->cond_timedwait_timeout);
3451 		}
3452 	}
3453 	return (error);
3454 }
3455 
3456 /*
3457  * cond_wait() is a cancellation point but __cond_wait() is not.
3458  * Internally, libc calls the non-cancellation version.
3459  * Other libraries need to use pthread_setcancelstate(), as appropriate,
3460  * since __cond_wait() is not exported from libc.
3461  */
3462 int
3463 __cond_wait(cond_t *cvp, mutex_t *mp)
3464 {
3465 	ulwp_t *self = curthread;
3466 	uberdata_t *udp = self->ul_uberdata;
3467 	uberflags_t *gflags;
3468 
3469 	if ((mp->mutex_type & (LOCK_ERRORCHECK | LOCK_ROBUST)) &&
3470 	    !mutex_held(mp))
3471 		return (EPERM);
3472 
3473 	/*
3474 	 * Optimize the common case of USYNC_THREAD plus
3475 	 * no error detection, no lock statistics, and no event tracing.
3476 	 */
3477 	if ((gflags = self->ul_schedctl_called) != NULL &&
3478 	    (cvp->cond_type | mp->mutex_type | gflags->uf_trs_ted |
3479 	    self->ul_td_events_enable |
3480 	    udp->tdb.tdb_ev_global_mask.event_bits[0]) == 0)
3481 		return (cond_wait_queue(cvp, mp, NULL));
3482 
3483 	/*
3484 	 * Else do it the long way.
3485 	 */
3486 	return (cond_wait_common(cvp, mp, NULL));
3487 }
3488 
3489 #pragma weak _cond_wait = cond_wait
3490 int
3491 cond_wait(cond_t *cvp, mutex_t *mp)
3492 {
3493 	int error;
3494 
3495 	_cancelon();
3496 	error = __cond_wait(cvp, mp);
3497 	if (error == EINTR)
3498 		_canceloff();
3499 	else
3500 		_canceloff_nocancel();
3501 	return (error);
3502 }
3503 
3504 /*
3505  * pthread_cond_wait() is a cancellation point.
3506  */
3507 int
3508 pthread_cond_wait(pthread_cond_t *_RESTRICT_KYWD cvp,
3509 	pthread_mutex_t *_RESTRICT_KYWD mp)
3510 {
3511 	int error;
3512 
3513 	error = cond_wait((cond_t *)cvp, (mutex_t *)mp);
3514 	return ((error == EINTR)? 0 : error);
3515 }
3516 
3517 /*
3518  * cond_timedwait() is a cancellation point but __cond_timedwait() is not.
3519  */
3520 int
3521 __cond_timedwait(cond_t *cvp, mutex_t *mp, const timespec_t *abstime)
3522 {
3523 	clockid_t clock_id = cvp->cond_clockid;
3524 	timespec_t reltime;
3525 	int error;
3526 
3527 	if ((mp->mutex_type & (LOCK_ERRORCHECK | LOCK_ROBUST)) &&
3528 	    !mutex_held(mp))
3529 		return (EPERM);
3530 
3531 	if (clock_id != CLOCK_REALTIME && clock_id != CLOCK_HIGHRES)
3532 		clock_id = CLOCK_REALTIME;
3533 	abstime_to_reltime(clock_id, abstime, &reltime);
3534 	error = cond_wait_common(cvp, mp, &reltime);
3535 	if (error == ETIME && clock_id == CLOCK_HIGHRES) {
3536 		/*
3537 		 * Don't return ETIME if we didn't really get a timeout.
3538 		 * This can happen if we return because someone resets
3539 		 * the system clock.  Just return zero in this case,
3540 		 * giving a spurious wakeup but not a timeout.
3541 		 */
3542 		if ((hrtime_t)(uint32_t)abstime->tv_sec * NANOSEC +
3543 		    abstime->tv_nsec > gethrtime())
3544 			error = 0;
3545 	}
3546 	return (error);
3547 }
3548 
3549 int
3550 cond_timedwait(cond_t *cvp, mutex_t *mp, const timespec_t *abstime)
3551 {
3552 	int error;
3553 
3554 	_cancelon();
3555 	error = __cond_timedwait(cvp, mp, abstime);
3556 	if (error == EINTR)
3557 		_canceloff();
3558 	else
3559 		_canceloff_nocancel();
3560 	return (error);
3561 }
3562 
3563 /*
3564  * pthread_cond_timedwait() is a cancellation point.
3565  */
3566 int
3567 pthread_cond_timedwait(pthread_cond_t *_RESTRICT_KYWD cvp,
3568 	pthread_mutex_t *_RESTRICT_KYWD mp,
3569 	const struct timespec *_RESTRICT_KYWD abstime)
3570 {
3571 	int error;
3572 
3573 	error = cond_timedwait((cond_t *)cvp, (mutex_t *)mp, abstime);
3574 	if (error == ETIME)
3575 		error = ETIMEDOUT;
3576 	else if (error == EINTR)
3577 		error = 0;
3578 	return (error);
3579 }
3580 
3581 /*
3582  * cond_reltimedwait() is a cancellation point but __cond_reltimedwait() is not.
3583  */
3584 int
3585 __cond_reltimedwait(cond_t *cvp, mutex_t *mp, const timespec_t *reltime)
3586 {
3587 	timespec_t tslocal = *reltime;
3588 
3589 	if ((mp->mutex_type & (LOCK_ERRORCHECK | LOCK_ROBUST)) &&
3590 	    !mutex_held(mp))
3591 		return (EPERM);
3592 
3593 	return (cond_wait_common(cvp, mp, &tslocal));
3594 }
3595 
3596 int
3597 cond_reltimedwait(cond_t *cvp, mutex_t *mp, const timespec_t *reltime)
3598 {
3599 	int error;
3600 
3601 	_cancelon();
3602 	error = __cond_reltimedwait(cvp, mp, reltime);
3603 	if (error == EINTR)
3604 		_canceloff();
3605 	else
3606 		_canceloff_nocancel();
3607 	return (error);
3608 }
3609 
3610 int
3611 pthread_cond_reltimedwait_np(pthread_cond_t *_RESTRICT_KYWD cvp,
3612 	pthread_mutex_t *_RESTRICT_KYWD mp,
3613 	const struct timespec *_RESTRICT_KYWD reltime)
3614 {
3615 	int error;
3616 
3617 	error = cond_reltimedwait((cond_t *)cvp, (mutex_t *)mp, reltime);
3618 	if (error == ETIME)
3619 		error = ETIMEDOUT;
3620 	else if (error == EINTR)
3621 		error = 0;
3622 	return (error);
3623 }
3624 
3625 #pragma weak pthread_cond_signal = cond_signal
3626 #pragma weak _cond_signal = cond_signal
3627 int
3628 cond_signal(cond_t *cvp)
3629 {
3630 	ulwp_t *self = curthread;
3631 	uberdata_t *udp = self->ul_uberdata;
3632 	tdb_cond_stats_t *csp = COND_STATS(cvp, udp);
3633 	int error = 0;
3634 	int more;
3635 	lwpid_t lwpid;
3636 	queue_head_t *qp;
3637 	mutex_t *mp;
3638 	queue_head_t *mqp;
3639 	ulwp_t **ulwpp;
3640 	ulwp_t *ulwp;
3641 	ulwp_t *prev;
3642 
3643 	if (csp)
3644 		tdb_incr(csp->cond_signal);
3645 
3646 	if (cvp->cond_waiters_kernel)	/* someone sleeping in the kernel? */
3647 		error = _lwp_cond_signal(cvp);
3648 
3649 	if (!cvp->cond_waiters_user)	/* no one sleeping at user-level */
3650 		return (error);
3651 
3652 	/*
3653 	 * Move someone from the condvar sleep queue to the mutex sleep
3654 	 * queue for the mutex that he will acquire on being waked up.
3655 	 * We can do this only if we own the mutex he will acquire.
3656 	 * If we do not own the mutex, or if his ul_cv_wake flag
3657 	 * is set, just dequeue and unpark him.
3658 	 */
3659 	qp = queue_lock(cvp, CV);
3660 	ulwpp = queue_slot(qp, &prev, &more);
3661 	cvp->cond_waiters_user = more;
3662 	if (ulwpp == NULL) {	/* no one on the sleep queue */
3663 		queue_unlock(qp);
3664 		return (error);
3665 	}
3666 	ulwp = *ulwpp;
3667 
3668 	/*
3669 	 * Inform the thread that he was the recipient of a cond_signal().
3670 	 * This lets him deal with cond_signal() and, concurrently,
3671 	 * one or more of a cancellation, a UNIX signal, or a timeout.
3672 	 * These latter conditions must not consume a cond_signal().
3673 	 */
3674 	ulwp->ul_signalled = 1;
3675 
3676 	/*
3677 	 * Dequeue the waiter but leave his ul_sleepq non-NULL
3678 	 * while we move him to the mutex queue so that he can
3679 	 * deal properly with spurious wakeups.
3680 	 */
3681 	queue_unlink(qp, ulwpp, prev);
3682 
3683 	mp = ulwp->ul_cvmutex;		/* the mutex he will acquire */
3684 	ulwp->ul_cvmutex = NULL;
3685 	ASSERT(mp != NULL);
3686 
3687 	if (ulwp->ul_cv_wake || !MUTEX_OWNED(mp, self)) {
3688 		/* just wake him up */
3689 		lwpid = ulwp->ul_lwpid;
3690 		no_preempt(self);
3691 		ulwp->ul_sleepq = NULL;
3692 		ulwp->ul_wchan = NULL;
3693 		queue_unlock(qp);
3694 		(void) __lwp_unpark(lwpid);
3695 		preempt(self);
3696 	} else {
3697 		/* move him to the mutex queue */
3698 		mqp = queue_lock(mp, MX);
3699 		enqueue(mqp, ulwp, 0);
3700 		mp->mutex_waiters = 1;
3701 		queue_unlock(mqp);
3702 		queue_unlock(qp);
3703 	}
3704 
3705 	return (error);
3706 }
3707 
3708 /*
3709  * Utility function called by mutex_wakeup_all(), cond_broadcast(),
3710  * and rw_queue_release() to (re)allocate a big buffer to hold the
3711  * lwpids of all the threads to be set running after they are removed
3712  * from their sleep queues.  Since we are holding a queue lock, we
3713  * cannot call any function that might acquire a lock.  mmap(), munmap(),
3714  * lwp_unpark_all() are simple system calls and are safe in this regard.
3715  */
3716 lwpid_t *
3717 alloc_lwpids(lwpid_t *lwpid, int *nlwpid_ptr, int *maxlwps_ptr)
3718 {
3719 	/*
3720 	 * Allocate NEWLWPS ids on the first overflow.
3721 	 * Double the allocation each time after that.
3722 	 */
3723 	int nlwpid = *nlwpid_ptr;
3724 	int maxlwps = *maxlwps_ptr;
3725 	int first_allocation;
3726 	int newlwps;
3727 	void *vaddr;
3728 
3729 	ASSERT(nlwpid == maxlwps);
3730 
3731 	first_allocation = (maxlwps == MAXLWPS);
3732 	newlwps = first_allocation? NEWLWPS : 2 * maxlwps;
3733 	vaddr = mmap(NULL, newlwps * sizeof (lwpid_t),
3734 	    PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, (off_t)0);
3735 
3736 	if (vaddr == MAP_FAILED) {
3737 		/*
3738 		 * Let's hope this never happens.
3739 		 * If it does, then we have a terrible
3740 		 * thundering herd on our hands.
3741 		 */
3742 		(void) __lwp_unpark_all(lwpid, nlwpid);
3743 		*nlwpid_ptr = 0;
3744 	} else {
3745 		(void) memcpy(vaddr, lwpid, maxlwps * sizeof (lwpid_t));
3746 		if (!first_allocation)
3747 			(void) munmap((caddr_t)lwpid,
3748 			    maxlwps * sizeof (lwpid_t));
3749 		lwpid = vaddr;
3750 		*maxlwps_ptr = newlwps;
3751 	}
3752 
3753 	return (lwpid);
3754 }
3755 
3756 #pragma weak pthread_cond_broadcast = cond_broadcast
3757 #pragma weak _cond_broadcast = cond_broadcast
3758 int
3759 cond_broadcast(cond_t *cvp)
3760 {
3761 	ulwp_t *self = curthread;
3762 	uberdata_t *udp = self->ul_uberdata;
3763 	tdb_cond_stats_t *csp = COND_STATS(cvp, udp);
3764 	int error = 0;
3765 	queue_head_t *qp;
3766 	queue_root_t *qrp;
3767 	mutex_t *mp;
3768 	mutex_t *mp_cache = NULL;
3769 	queue_head_t *mqp = NULL;
3770 	ulwp_t *ulwp;
3771 	int nlwpid = 0;
3772 	int maxlwps = MAXLWPS;
3773 	lwpid_t buffer[MAXLWPS];
3774 	lwpid_t *lwpid = buffer;
3775 
3776 	if (csp)
3777 		tdb_incr(csp->cond_broadcast);
3778 
3779 	if (cvp->cond_waiters_kernel)	/* someone sleeping in the kernel? */
3780 		error = _lwp_cond_broadcast(cvp);
3781 
3782 	if (!cvp->cond_waiters_user)	/* no one sleeping at user-level */
3783 		return (error);
3784 
3785 	/*
3786 	 * Move everyone from the condvar sleep queue to the mutex sleep
3787 	 * queue for the mutex that they will acquire on being waked up.
3788 	 * We can do this only if we own the mutex they will acquire.
3789 	 * If we do not own the mutex, or if their ul_cv_wake flag
3790 	 * is set, just dequeue and unpark them.
3791 	 *
3792 	 * We keep track of lwpids that are to be unparked in lwpid[].
3793 	 * __lwp_unpark_all() is called to unpark all of them after
3794 	 * they have been removed from the sleep queue and the sleep
3795 	 * queue lock has been dropped.  If we run out of space in our
3796 	 * on-stack buffer, we need to allocate more but we can't call
3797 	 * lmalloc() because we are holding a queue lock when the overflow
3798 	 * occurs and lmalloc() acquires a lock.  We can't use alloca()
3799 	 * either because the application may have allocated a small
3800 	 * stack and we don't want to overrun the stack.  So we call
3801 	 * alloc_lwpids() to allocate a bigger buffer using the mmap()
3802 	 * system call directly since that path acquires no locks.
3803 	 */
3804 	qp = queue_lock(cvp, CV);
3805 	cvp->cond_waiters_user = 0;
3806 	for (;;) {
3807 		if ((qrp = qp->qh_root) == NULL ||
3808 		    (ulwp = qrp->qr_head) == NULL)
3809 			break;
3810 		ASSERT(ulwp->ul_wchan == cvp);
3811 		queue_unlink(qp, &qrp->qr_head, NULL);
3812 		mp = ulwp->ul_cvmutex;		/* his mutex */
3813 		ulwp->ul_cvmutex = NULL;
3814 		ASSERT(mp != NULL);
3815 		if (ulwp->ul_cv_wake || !MUTEX_OWNED(mp, self)) {
3816 			/* just wake him up */
3817 			ulwp->ul_sleepq = NULL;
3818 			ulwp->ul_wchan = NULL;
3819 			if (nlwpid == maxlwps)
3820 				lwpid = alloc_lwpids(lwpid, &nlwpid, &maxlwps);
3821 			lwpid[nlwpid++] = ulwp->ul_lwpid;
3822 		} else {
3823 			/* move him to the mutex queue */
3824 			if (mp != mp_cache) {
3825 				mp_cache = mp;
3826 				if (mqp != NULL)
3827 					queue_unlock(mqp);
3828 				mqp = queue_lock(mp, MX);
3829 			}
3830 			enqueue(mqp, ulwp, 0);
3831 			mp->mutex_waiters = 1;
3832 		}
3833 	}
3834 	if (mqp != NULL)
3835 		queue_unlock(mqp);
3836 	if (nlwpid == 0) {
3837 		queue_unlock(qp);
3838 	} else {
3839 		no_preempt(self);
3840 		queue_unlock(qp);
3841 		if (nlwpid == 1)
3842 			(void) __lwp_unpark(lwpid[0]);
3843 		else
3844 			(void) __lwp_unpark_all(lwpid, nlwpid);
3845 		preempt(self);
3846 	}
3847 	if (lwpid != buffer)
3848 		(void) munmap((caddr_t)lwpid, maxlwps * sizeof (lwpid_t));
3849 	return (error);
3850 }
3851 
3852 #pragma weak pthread_cond_destroy = cond_destroy
3853 int
3854 cond_destroy(cond_t *cvp)
3855 {
3856 	cvp->cond_magic = 0;
3857 	tdb_sync_obj_deregister(cvp);
3858 	return (0);
3859 }
3860 
3861 #if defined(THREAD_DEBUG)
3862 void
3863 assert_no_libc_locks_held(void)
3864 {
3865 	ASSERT(!curthread->ul_critical || curthread->ul_bindflags);
3866 }
3867 
3868 /* protected by link_lock */
3869 uint64_t spin_lock_spin;
3870 uint64_t spin_lock_spin2;
3871 uint64_t spin_lock_sleep;
3872 uint64_t spin_lock_wakeup;
3873 
3874 /*
3875  * Record spin lock statistics.
3876  * Called by a thread exiting itself in thrp_exit().
3877  * Also called via atexit() from the thread calling
3878  * exit() to do all the other threads as well.
3879  */
3880 void
3881 record_spin_locks(ulwp_t *ulwp)
3882 {
3883 	spin_lock_spin += ulwp->ul_spin_lock_spin;
3884 	spin_lock_spin2 += ulwp->ul_spin_lock_spin2;
3885 	spin_lock_sleep += ulwp->ul_spin_lock_sleep;
3886 	spin_lock_wakeup += ulwp->ul_spin_lock_wakeup;
3887 	ulwp->ul_spin_lock_spin = 0;
3888 	ulwp->ul_spin_lock_spin2 = 0;
3889 	ulwp->ul_spin_lock_sleep = 0;
3890 	ulwp->ul_spin_lock_wakeup = 0;
3891 }
3892 
3893 /*
3894  * atexit function:  dump the queue statistics to stderr.
3895  */
3896 #include <stdio.h>
3897 void
3898 dump_queue_statistics(void)
3899 {
3900 	uberdata_t *udp = curthread->ul_uberdata;
3901 	queue_head_t *qp;
3902 	int qn;
3903 	uint64_t spin_lock_total = 0;
3904 
3905 	if (udp->queue_head == NULL || thread_queue_dump == 0)
3906 		return;
3907 
3908 	if (fprintf(stderr, "\n%5d mutex queues:\n", QHASHSIZE) < 0 ||
3909 	    fprintf(stderr, "queue#   lockcount    max qlen    max hlen\n") < 0)
3910 		return;
3911 	for (qn = 0, qp = udp->queue_head; qn < QHASHSIZE; qn++, qp++) {
3912 		if (qp->qh_lockcount == 0)
3913 			continue;
3914 		spin_lock_total += qp->qh_lockcount;
3915 		if (fprintf(stderr, "%5d %12llu%12u%12u\n", qn,
3916 		    (u_longlong_t)qp->qh_lockcount,
3917 		    qp->qh_qmax, qp->qh_hmax) < 0)
3918 			return;
3919 	}
3920 
3921 	if (fprintf(stderr, "\n%5d condvar queues:\n", QHASHSIZE) < 0 ||
3922 	    fprintf(stderr, "queue#   lockcount    max qlen    max hlen\n") < 0)
3923 		return;
3924 	for (qn = 0; qn < QHASHSIZE; qn++, qp++) {
3925 		if (qp->qh_lockcount == 0)
3926 			continue;
3927 		spin_lock_total += qp->qh_lockcount;
3928 		if (fprintf(stderr, "%5d %12llu%12u%12u\n", qn,
3929 		    (u_longlong_t)qp->qh_lockcount,
3930 		    qp->qh_qmax, qp->qh_hmax) < 0)
3931 			return;
3932 	}
3933 
3934 	(void) fprintf(stderr, "\n  spin_lock_total  = %10llu\n",
3935 	    (u_longlong_t)spin_lock_total);
3936 	(void) fprintf(stderr, "  spin_lock_spin   = %10llu\n",
3937 	    (u_longlong_t)spin_lock_spin);
3938 	(void) fprintf(stderr, "  spin_lock_spin2  = %10llu\n",
3939 	    (u_longlong_t)spin_lock_spin2);
3940 	(void) fprintf(stderr, "  spin_lock_sleep  = %10llu\n",
3941 	    (u_longlong_t)spin_lock_sleep);
3942 	(void) fprintf(stderr, "  spin_lock_wakeup = %10llu\n",
3943 	    (u_longlong_t)spin_lock_wakeup);
3944 }
3945 #endif
3946