xref: /illumos-gate/usr/src/lib/libc/port/threads/synch.c (revision 2654012f83cec5dc15b61dfe3e4a4915f186e7a6)
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) && !mutex_held(mp))
2408 		return (EPERM);
2409 
2410 	if (self->ul_error_detection && !mutex_held(mp))
2411 		lock_error(mp, "mutex_unlock", NULL, NULL);
2412 
2413 	if ((mtype & LOCK_RECURSIVE) && mp->mutex_rcount != 0) {
2414 		mp->mutex_rcount--;
2415 		DTRACE_PROBE2(plockstat, mutex__release, mp, 1);
2416 		return (0);
2417 	}
2418 
2419 	if ((msp = MUTEX_STATS(mp, udp)) != NULL)
2420 		(void) record_hold_time(msp);
2421 
2422 	if (!retain_robust_flags && !(mtype & LOCK_PRIO_INHERIT) &&
2423 	    (mp->mutex_flag & (LOCK_OWNERDEAD | LOCK_UNMAPPED))) {
2424 		ASSERT(mp->mutex_type & LOCK_ROBUST);
2425 		mp->mutex_flag &= ~(LOCK_OWNERDEAD | LOCK_UNMAPPED);
2426 		mp->mutex_flag |= LOCK_NOTRECOVERABLE;
2427 	}
2428 	release_all = ((mp->mutex_flag & LOCK_NOTRECOVERABLE) != 0);
2429 
2430 	if (mtype & LOCK_PRIO_INHERIT) {
2431 		no_preempt(self);
2432 		mp->mutex_owner = 0;
2433 		/* mp->mutex_ownerpid is cleared by ___lwp_mutex_unlock() */
2434 		DTRACE_PROBE2(plockstat, mutex__release, mp, 0);
2435 		mp->mutex_lockw = LOCKCLEAR;
2436 		self->ul_pilocks--;
2437 		error = ___lwp_mutex_unlock(mp);
2438 		preempt(self);
2439 	} else if (mtype & USYNC_PROCESS) {
2440 		mutex_unlock_process(mp, release_all);
2441 	} else {	/* USYNC_THREAD */
2442 		if ((lwpid = mutex_unlock_queue(mp, release_all)) != 0) {
2443 			(void) __lwp_unpark(lwpid);
2444 			preempt(self);
2445 		}
2446 	}
2447 
2448 	if (mtype & LOCK_ROBUST)
2449 		forget_lock(mp);
2450 
2451 	if ((mtype & LOCK_PRIO_PROTECT) && _ceil_mylist_del(mp))
2452 		_ceil_prio_waive();
2453 
2454 	return (error);
2455 }
2456 
2457 #pragma weak pthread_mutex_unlock = mutex_unlock
2458 #pragma weak _mutex_unlock = mutex_unlock
2459 int
2460 mutex_unlock(mutex_t *mp)
2461 {
2462 	ulwp_t *self = curthread;
2463 	int mtype = mp->mutex_type;
2464 	uberflags_t *gflags;
2465 	lwpid_t lwpid;
2466 	short el;
2467 
2468 	/*
2469 	 * Optimize the case of USYNC_THREAD, including
2470 	 * the LOCK_RECURSIVE and LOCK_ERRORCHECK cases,
2471 	 * no error detection, no lock statistics,
2472 	 * and the process has only a single thread.
2473 	 * (Most likely a traditional single-threaded application.)
2474 	 */
2475 	if (((mtype & ~(LOCK_RECURSIVE|LOCK_ERRORCHECK)) |
2476 	    self->ul_uberdata->uberflags.uf_all) == 0) {
2477 		if (mtype) {
2478 			/*
2479 			 * At this point we know that one or both of the
2480 			 * flags LOCK_RECURSIVE or LOCK_ERRORCHECK is set.
2481 			 */
2482 			if ((mtype & LOCK_ERRORCHECK) && !MUTEX_OWNED(mp, self))
2483 				return (EPERM);
2484 			if ((mtype & LOCK_RECURSIVE) && mp->mutex_rcount != 0) {
2485 				mp->mutex_rcount--;
2486 				DTRACE_PROBE2(plockstat, mutex__release, mp, 1);
2487 				return (0);
2488 			}
2489 		}
2490 		/*
2491 		 * Only one thread exists so we don't need an atomic operation.
2492 		 * Also, there can be no waiters.
2493 		 */
2494 		sigoff(self);
2495 		mp->mutex_owner = 0;
2496 		mp->mutex_lockword = 0;
2497 		sigon(self);
2498 		DTRACE_PROBE2(plockstat, mutex__release, mp, 0);
2499 		return (0);
2500 	}
2501 
2502 	/*
2503 	 * Optimize the common cases of USYNC_THREAD or USYNC_PROCESS,
2504 	 * no error detection, and no lock statistics.
2505 	 * Include LOCK_RECURSIVE and LOCK_ERRORCHECK cases.
2506 	 */
2507 	if ((gflags = self->ul_schedctl_called) != NULL) {
2508 		if (((el = gflags->uf_trs_ted) | mtype) == 0) {
2509 fast_unlock:
2510 			if ((lwpid = mutex_unlock_queue(mp, 0)) != 0) {
2511 				(void) __lwp_unpark(lwpid);
2512 				preempt(self);
2513 			}
2514 			return (0);
2515 		}
2516 		if (el)		/* error detection or lock statistics */
2517 			goto slow_unlock;
2518 		if ((mtype & ~(LOCK_RECURSIVE|LOCK_ERRORCHECK)) == 0) {
2519 			/*
2520 			 * At this point we know that one or both of the
2521 			 * flags LOCK_RECURSIVE or LOCK_ERRORCHECK is set.
2522 			 */
2523 			if ((mtype & LOCK_ERRORCHECK) && !MUTEX_OWNED(mp, self))
2524 				return (EPERM);
2525 			if ((mtype & LOCK_RECURSIVE) && mp->mutex_rcount != 0) {
2526 				mp->mutex_rcount--;
2527 				DTRACE_PROBE2(plockstat, mutex__release, mp, 1);
2528 				return (0);
2529 			}
2530 			goto fast_unlock;
2531 		}
2532 		if ((mtype &
2533 		    ~(USYNC_PROCESS|LOCK_RECURSIVE|LOCK_ERRORCHECK)) == 0) {
2534 			/*
2535 			 * At this point we know that zero, one, or both of the
2536 			 * flags LOCK_RECURSIVE or LOCK_ERRORCHECK is set and
2537 			 * that the USYNC_PROCESS flag is set.
2538 			 */
2539 			if ((mtype & LOCK_ERRORCHECK) && !shared_mutex_held(mp))
2540 				return (EPERM);
2541 			if ((mtype & LOCK_RECURSIVE) && mp->mutex_rcount != 0) {
2542 				mp->mutex_rcount--;
2543 				DTRACE_PROBE2(plockstat, mutex__release, mp, 1);
2544 				return (0);
2545 			}
2546 			mutex_unlock_process(mp, 0);
2547 			return (0);
2548 		}
2549 	}
2550 
2551 	/* else do it the long way */
2552 slow_unlock:
2553 	return (mutex_unlock_internal(mp, 0));
2554 }
2555 
2556 /*
2557  * Internally to the library, almost all mutex lock/unlock actions
2558  * go through these lmutex_ functions, to protect critical regions.
2559  * We replicate a bit of code from mutex_lock() and mutex_unlock()
2560  * to make these functions faster since we know that the mutex type
2561  * of all internal locks is USYNC_THREAD.  We also know that internal
2562  * locking can never fail, so we panic if it does.
2563  */
2564 void
2565 lmutex_lock(mutex_t *mp)
2566 {
2567 	ulwp_t *self = curthread;
2568 	uberdata_t *udp = self->ul_uberdata;
2569 
2570 	ASSERT(mp->mutex_type == USYNC_THREAD);
2571 
2572 	enter_critical(self);
2573 	/*
2574 	 * Optimize the case of no lock statistics and only a single thread.
2575 	 * (Most likely a traditional single-threaded application.)
2576 	 */
2577 	if (udp->uberflags.uf_all == 0) {
2578 		/*
2579 		 * Only one thread exists; the mutex must be free.
2580 		 */
2581 		ASSERT(mp->mutex_lockw == 0);
2582 		mp->mutex_lockw = LOCKSET;
2583 		mp->mutex_owner = (uintptr_t)self;
2584 		DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
2585 	} else {
2586 		tdb_mutex_stats_t *msp = MUTEX_STATS(mp, udp);
2587 
2588 		if (!self->ul_schedctl_called)
2589 			(void) setup_schedctl();
2590 
2591 		if (set_lock_byte(&mp->mutex_lockw) == 0) {
2592 			mp->mutex_owner = (uintptr_t)self;
2593 			DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
2594 		} else if (mutex_trylock_adaptive(mp, 1) != 0) {
2595 			(void) mutex_lock_queue(self, msp, mp, NULL);
2596 		}
2597 
2598 		if (msp)
2599 			record_begin_hold(msp);
2600 	}
2601 }
2602 
2603 void
2604 lmutex_unlock(mutex_t *mp)
2605 {
2606 	ulwp_t *self = curthread;
2607 	uberdata_t *udp = self->ul_uberdata;
2608 
2609 	ASSERT(mp->mutex_type == USYNC_THREAD);
2610 
2611 	/*
2612 	 * Optimize the case of no lock statistics and only a single thread.
2613 	 * (Most likely a traditional single-threaded application.)
2614 	 */
2615 	if (udp->uberflags.uf_all == 0) {
2616 		/*
2617 		 * Only one thread exists so there can be no waiters.
2618 		 */
2619 		mp->mutex_owner = 0;
2620 		mp->mutex_lockword = 0;
2621 		DTRACE_PROBE2(plockstat, mutex__release, mp, 0);
2622 	} else {
2623 		tdb_mutex_stats_t *msp = MUTEX_STATS(mp, udp);
2624 		lwpid_t lwpid;
2625 
2626 		if (msp)
2627 			(void) record_hold_time(msp);
2628 		if ((lwpid = mutex_unlock_queue(mp, 0)) != 0) {
2629 			(void) __lwp_unpark(lwpid);
2630 			preempt(self);
2631 		}
2632 	}
2633 	exit_critical(self);
2634 }
2635 
2636 /*
2637  * For specialized code in libc, like the asynchronous i/o code,
2638  * the following sig_*() locking primitives are used in order
2639  * to make the code asynchronous signal safe.  Signals are
2640  * deferred while locks acquired by these functions are held.
2641  */
2642 void
2643 sig_mutex_lock(mutex_t *mp)
2644 {
2645 	sigoff(curthread);
2646 	(void) mutex_lock(mp);
2647 }
2648 
2649 void
2650 sig_mutex_unlock(mutex_t *mp)
2651 {
2652 	(void) mutex_unlock(mp);
2653 	sigon(curthread);
2654 }
2655 
2656 int
2657 sig_mutex_trylock(mutex_t *mp)
2658 {
2659 	int error;
2660 
2661 	sigoff(curthread);
2662 	if ((error = mutex_trylock(mp)) != 0)
2663 		sigon(curthread);
2664 	return (error);
2665 }
2666 
2667 /*
2668  * sig_cond_wait() is a cancellation point.
2669  */
2670 int
2671 sig_cond_wait(cond_t *cv, mutex_t *mp)
2672 {
2673 	int error;
2674 
2675 	ASSERT(curthread->ul_sigdefer != 0);
2676 	pthread_testcancel();
2677 	error = __cond_wait(cv, mp);
2678 	if (error == EINTR && curthread->ul_cursig) {
2679 		sig_mutex_unlock(mp);
2680 		/* take the deferred signal here */
2681 		sig_mutex_lock(mp);
2682 	}
2683 	pthread_testcancel();
2684 	return (error);
2685 }
2686 
2687 /*
2688  * sig_cond_reltimedwait() is a cancellation point.
2689  */
2690 int
2691 sig_cond_reltimedwait(cond_t *cv, mutex_t *mp, const timespec_t *ts)
2692 {
2693 	int error;
2694 
2695 	ASSERT(curthread->ul_sigdefer != 0);
2696 	pthread_testcancel();
2697 	error = __cond_reltimedwait(cv, mp, ts);
2698 	if (error == EINTR && curthread->ul_cursig) {
2699 		sig_mutex_unlock(mp);
2700 		/* take the deferred signal here */
2701 		sig_mutex_lock(mp);
2702 	}
2703 	pthread_testcancel();
2704 	return (error);
2705 }
2706 
2707 /*
2708  * For specialized code in libc, like the stdio code.
2709  * the following cancel_safe_*() locking primitives are used in
2710  * order to make the code cancellation-safe.  Cancellation is
2711  * deferred while locks acquired by these functions are held.
2712  */
2713 void
2714 cancel_safe_mutex_lock(mutex_t *mp)
2715 {
2716 	(void) mutex_lock(mp);
2717 	curthread->ul_libc_locks++;
2718 }
2719 
2720 int
2721 cancel_safe_mutex_trylock(mutex_t *mp)
2722 {
2723 	int error;
2724 
2725 	if ((error = mutex_trylock(mp)) == 0)
2726 		curthread->ul_libc_locks++;
2727 	return (error);
2728 }
2729 
2730 void
2731 cancel_safe_mutex_unlock(mutex_t *mp)
2732 {
2733 	ulwp_t *self = curthread;
2734 
2735 	ASSERT(self->ul_libc_locks != 0);
2736 
2737 	(void) mutex_unlock(mp);
2738 
2739 	/*
2740 	 * Decrement the count of locks held by cancel_safe_mutex_lock().
2741 	 * If we are then in a position to terminate cleanly and
2742 	 * if there is a pending cancellation and cancellation
2743 	 * is not disabled and we received EINTR from a recent
2744 	 * system call then perform the cancellation action now.
2745 	 */
2746 	if (--self->ul_libc_locks == 0 &&
2747 	    !(self->ul_vfork | self->ul_nocancel |
2748 	    self->ul_critical | self->ul_sigdefer) &&
2749 	    cancel_active())
2750 		pthread_exit(PTHREAD_CANCELED);
2751 }
2752 
2753 static int
2754 shared_mutex_held(mutex_t *mparg)
2755 {
2756 	/*
2757 	 * The 'volatile' is necessary to make sure the compiler doesn't
2758 	 * reorder the tests of the various components of the mutex.
2759 	 * They must be tested in this order:
2760 	 *	mutex_lockw
2761 	 *	mutex_owner
2762 	 *	mutex_ownerpid
2763 	 * This relies on the fact that everywhere mutex_lockw is cleared,
2764 	 * mutex_owner and mutex_ownerpid are cleared before mutex_lockw
2765 	 * is cleared, and that everywhere mutex_lockw is set, mutex_owner
2766 	 * and mutex_ownerpid are set after mutex_lockw is set, and that
2767 	 * mutex_lockw is set or cleared with a memory barrier.
2768 	 */
2769 	volatile mutex_t *mp = (volatile mutex_t *)mparg;
2770 	ulwp_t *self = curthread;
2771 	uberdata_t *udp = self->ul_uberdata;
2772 
2773 	return (MUTEX_OWNED(mp, self) && mp->mutex_ownerpid == udp->pid);
2774 }
2775 
2776 #pragma weak _mutex_held = mutex_held
2777 int
2778 mutex_held(mutex_t *mparg)
2779 {
2780 	volatile mutex_t *mp = (volatile mutex_t *)mparg;
2781 
2782 	if (mparg->mutex_type & USYNC_PROCESS)
2783 		return (shared_mutex_held(mparg));
2784 	return (MUTEX_OWNED(mp, curthread));
2785 }
2786 
2787 #pragma weak pthread_mutex_destroy = mutex_destroy
2788 #pragma weak _mutex_destroy = mutex_destroy
2789 int
2790 mutex_destroy(mutex_t *mp)
2791 {
2792 	if (mp->mutex_type & USYNC_PROCESS)
2793 		forget_lock(mp);
2794 	(void) memset(mp, 0, sizeof (*mp));
2795 	tdb_sync_obj_deregister(mp);
2796 	return (0);
2797 }
2798 
2799 #pragma weak pthread_mutex_consistent_np = mutex_consistent
2800 int
2801 mutex_consistent(mutex_t *mp)
2802 {
2803 	/*
2804 	 * Do this only for an inconsistent, initialized robust lock
2805 	 * that we hold.  For all other cases, return EINVAL.
2806 	 */
2807 	if (mutex_held(mp) &&
2808 	    (mp->mutex_type & LOCK_ROBUST) &&
2809 	    (mp->mutex_flag & LOCK_INITED) &&
2810 	    (mp->mutex_flag & (LOCK_OWNERDEAD | LOCK_UNMAPPED))) {
2811 		mp->mutex_flag &= ~(LOCK_OWNERDEAD | LOCK_UNMAPPED);
2812 		mp->mutex_rcount = 0;
2813 		return (0);
2814 	}
2815 	return (EINVAL);
2816 }
2817 
2818 /*
2819  * Spin locks are separate from ordinary mutexes,
2820  * but we use the same data structure for them.
2821  */
2822 
2823 int
2824 pthread_spin_init(pthread_spinlock_t *lock, int pshared)
2825 {
2826 	mutex_t *mp = (mutex_t *)lock;
2827 
2828 	(void) memset(mp, 0, sizeof (*mp));
2829 	if (pshared == PTHREAD_PROCESS_SHARED)
2830 		mp->mutex_type = USYNC_PROCESS;
2831 	else
2832 		mp->mutex_type = USYNC_THREAD;
2833 	mp->mutex_flag = LOCK_INITED;
2834 	mp->mutex_magic = MUTEX_MAGIC;
2835 
2836 	/*
2837 	 * This should be at the beginning of the function,
2838 	 * but for the sake of old broken applications that
2839 	 * do not have proper alignment for their mutexes
2840 	 * (and don't check the return code from pthread_spin_init),
2841 	 * we put it here, after initializing the mutex regardless.
2842 	 */
2843 	if (((uintptr_t)mp & (_LONG_LONG_ALIGNMENT - 1)) &&
2844 	    curthread->ul_misaligned == 0)
2845 		return (EINVAL);
2846 
2847 	return (0);
2848 }
2849 
2850 int
2851 pthread_spin_destroy(pthread_spinlock_t *lock)
2852 {
2853 	(void) memset(lock, 0, sizeof (*lock));
2854 	return (0);
2855 }
2856 
2857 int
2858 pthread_spin_trylock(pthread_spinlock_t *lock)
2859 {
2860 	mutex_t *mp = (mutex_t *)lock;
2861 	ulwp_t *self = curthread;
2862 	int error = 0;
2863 
2864 	no_preempt(self);
2865 	if (set_lock_byte(&mp->mutex_lockw) != 0)
2866 		error = EBUSY;
2867 	else {
2868 		mp->mutex_owner = (uintptr_t)self;
2869 		if (mp->mutex_type == USYNC_PROCESS)
2870 			mp->mutex_ownerpid = self->ul_uberdata->pid;
2871 		DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
2872 	}
2873 	preempt(self);
2874 	return (error);
2875 }
2876 
2877 int
2878 pthread_spin_lock(pthread_spinlock_t *lock)
2879 {
2880 	mutex_t *mp = (mutex_t *)lock;
2881 	ulwp_t *self = curthread;
2882 	volatile uint8_t *lockp = (volatile uint8_t *)&mp->mutex_lockw;
2883 	int count = 0;
2884 
2885 	ASSERT(!self->ul_critical || self->ul_bindflags);
2886 
2887 	DTRACE_PROBE1(plockstat, mutex__spin, mp);
2888 
2889 	/*
2890 	 * We don't care whether the owner is running on a processor.
2891 	 * We just spin because that's what this interface requires.
2892 	 */
2893 	for (;;) {
2894 		if (*lockp == 0) {	/* lock byte appears to be clear */
2895 			no_preempt(self);
2896 			if (set_lock_byte(lockp) == 0)
2897 				break;
2898 			preempt(self);
2899 		}
2900 		if (count < INT_MAX)
2901 			count++;
2902 		SMT_PAUSE();
2903 	}
2904 	mp->mutex_owner = (uintptr_t)self;
2905 	if (mp->mutex_type == USYNC_PROCESS)
2906 		mp->mutex_ownerpid = self->ul_uberdata->pid;
2907 	preempt(self);
2908 	if (count) {
2909 		DTRACE_PROBE2(plockstat, mutex__spun, 1, count);
2910 	}
2911 	DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, count);
2912 	return (0);
2913 }
2914 
2915 int
2916 pthread_spin_unlock(pthread_spinlock_t *lock)
2917 {
2918 	mutex_t *mp = (mutex_t *)lock;
2919 	ulwp_t *self = curthread;
2920 
2921 	no_preempt(self);
2922 	mp->mutex_owner = 0;
2923 	mp->mutex_ownerpid = 0;
2924 	DTRACE_PROBE2(plockstat, mutex__release, mp, 0);
2925 	(void) atomic_swap_32(&mp->mutex_lockword, 0);
2926 	preempt(self);
2927 	return (0);
2928 }
2929 
2930 #define	INITIAL_LOCKS	8	/* initial size of ul_heldlocks.array */
2931 
2932 /*
2933  * Find/allocate an entry for 'lock' in our array of held locks.
2934  */
2935 static mutex_t **
2936 find_lock_entry(mutex_t *lock)
2937 {
2938 	ulwp_t *self = curthread;
2939 	mutex_t **remembered = NULL;
2940 	mutex_t **lockptr;
2941 	uint_t nlocks;
2942 
2943 	if ((nlocks = self->ul_heldlockcnt) != 0)
2944 		lockptr = self->ul_heldlocks.array;
2945 	else {
2946 		nlocks = 1;
2947 		lockptr = &self->ul_heldlocks.single;
2948 	}
2949 
2950 	for (; nlocks; nlocks--, lockptr++) {
2951 		if (*lockptr == lock)
2952 			return (lockptr);
2953 		if (*lockptr == NULL && remembered == NULL)
2954 			remembered = lockptr;
2955 	}
2956 	if (remembered != NULL) {
2957 		*remembered = lock;
2958 		return (remembered);
2959 	}
2960 
2961 	/*
2962 	 * No entry available.  Allocate more space, converting
2963 	 * the single entry into an array of entries if necessary.
2964 	 */
2965 	if ((nlocks = self->ul_heldlockcnt) == 0) {
2966 		/*
2967 		 * Initial allocation of the array.
2968 		 * Convert the single entry into an array.
2969 		 */
2970 		self->ul_heldlockcnt = nlocks = INITIAL_LOCKS;
2971 		lockptr = lmalloc(nlocks * sizeof (mutex_t *));
2972 		/*
2973 		 * The single entry becomes the first entry in the array.
2974 		 */
2975 		*lockptr = self->ul_heldlocks.single;
2976 		self->ul_heldlocks.array = lockptr;
2977 		/*
2978 		 * Return the next available entry in the array.
2979 		 */
2980 		*++lockptr = lock;
2981 		return (lockptr);
2982 	}
2983 	/*
2984 	 * Reallocate the array, double the size each time.
2985 	 */
2986 	lockptr = lmalloc(nlocks * 2 * sizeof (mutex_t *));
2987 	(void) memcpy(lockptr, self->ul_heldlocks.array,
2988 	    nlocks * sizeof (mutex_t *));
2989 	lfree(self->ul_heldlocks.array, nlocks * sizeof (mutex_t *));
2990 	self->ul_heldlocks.array = lockptr;
2991 	self->ul_heldlockcnt *= 2;
2992 	/*
2993 	 * Return the next available entry in the newly allocated array.
2994 	 */
2995 	*(lockptr += nlocks) = lock;
2996 	return (lockptr);
2997 }
2998 
2999 /*
3000  * Insert 'lock' into our list of held locks.
3001  * Currently only used for LOCK_ROBUST mutexes.
3002  */
3003 void
3004 remember_lock(mutex_t *lock)
3005 {
3006 	(void) find_lock_entry(lock);
3007 }
3008 
3009 /*
3010  * Remove 'lock' from our list of held locks.
3011  * Currently only used for LOCK_ROBUST mutexes.
3012  */
3013 void
3014 forget_lock(mutex_t *lock)
3015 {
3016 	*find_lock_entry(lock) = NULL;
3017 }
3018 
3019 /*
3020  * Free the array of held locks.
3021  */
3022 void
3023 heldlock_free(ulwp_t *ulwp)
3024 {
3025 	uint_t nlocks;
3026 
3027 	if ((nlocks = ulwp->ul_heldlockcnt) != 0)
3028 		lfree(ulwp->ul_heldlocks.array, nlocks * sizeof (mutex_t *));
3029 	ulwp->ul_heldlockcnt = 0;
3030 	ulwp->ul_heldlocks.array = NULL;
3031 }
3032 
3033 /*
3034  * Mark all held LOCK_ROBUST mutexes LOCK_OWNERDEAD.
3035  * Called from _thrp_exit() to deal with abandoned locks.
3036  */
3037 void
3038 heldlock_exit(void)
3039 {
3040 	ulwp_t *self = curthread;
3041 	mutex_t **lockptr;
3042 	uint_t nlocks;
3043 	mutex_t *mp;
3044 
3045 	if ((nlocks = self->ul_heldlockcnt) != 0)
3046 		lockptr = self->ul_heldlocks.array;
3047 	else {
3048 		nlocks = 1;
3049 		lockptr = &self->ul_heldlocks.single;
3050 	}
3051 
3052 	for (; nlocks; nlocks--, lockptr++) {
3053 		/*
3054 		 * The kernel takes care of transitioning held
3055 		 * LOCK_PRIO_INHERIT mutexes to LOCK_OWNERDEAD.
3056 		 * We avoid that case here.
3057 		 */
3058 		if ((mp = *lockptr) != NULL &&
3059 		    mutex_held(mp) &&
3060 		    (mp->mutex_type & (LOCK_ROBUST | LOCK_PRIO_INHERIT)) ==
3061 		    LOCK_ROBUST) {
3062 			mp->mutex_rcount = 0;
3063 			if (!(mp->mutex_flag & LOCK_UNMAPPED))
3064 				mp->mutex_flag |= LOCK_OWNERDEAD;
3065 			(void) mutex_unlock_internal(mp, 1);
3066 		}
3067 	}
3068 
3069 	heldlock_free(self);
3070 }
3071 
3072 #pragma weak _cond_init = cond_init
3073 /* ARGSUSED2 */
3074 int
3075 cond_init(cond_t *cvp, int type, void *arg)
3076 {
3077 	if (type != USYNC_THREAD && type != USYNC_PROCESS)
3078 		return (EINVAL);
3079 	(void) memset(cvp, 0, sizeof (*cvp));
3080 	cvp->cond_type = (uint16_t)type;
3081 	cvp->cond_magic = COND_MAGIC;
3082 
3083 	/*
3084 	 * This should be at the beginning of the function,
3085 	 * but for the sake of old broken applications that
3086 	 * do not have proper alignment for their condvars
3087 	 * (and don't check the return code from cond_init),
3088 	 * we put it here, after initializing the condvar regardless.
3089 	 */
3090 	if (((uintptr_t)cvp & (_LONG_LONG_ALIGNMENT - 1)) &&
3091 	    curthread->ul_misaligned == 0)
3092 		return (EINVAL);
3093 
3094 	return (0);
3095 }
3096 
3097 /*
3098  * cond_sleep_queue(): utility function for cond_wait_queue().
3099  *
3100  * Go to sleep on a condvar sleep queue, expect to be waked up
3101  * by someone calling cond_signal() or cond_broadcast() or due
3102  * to receiving a UNIX signal or being cancelled, or just simply
3103  * due to a spurious wakeup (like someome calling forkall()).
3104  *
3105  * The associated mutex is *not* reacquired before returning.
3106  * That must be done by the caller of cond_sleep_queue().
3107  */
3108 static int
3109 cond_sleep_queue(cond_t *cvp, mutex_t *mp, timespec_t *tsp)
3110 {
3111 	ulwp_t *self = curthread;
3112 	queue_head_t *qp;
3113 	queue_head_t *mqp;
3114 	lwpid_t lwpid;
3115 	int signalled;
3116 	int error;
3117 	int cv_wake;
3118 	int release_all;
3119 
3120 	/*
3121 	 * Put ourself on the CV sleep queue, unlock the mutex, then
3122 	 * park ourself and unpark a candidate lwp to grab the mutex.
3123 	 * We must go onto the CV sleep queue before dropping the
3124 	 * mutex in order to guarantee atomicity of the operation.
3125 	 */
3126 	self->ul_sp = stkptr();
3127 	qp = queue_lock(cvp, CV);
3128 	enqueue(qp, self, 0);
3129 	cvp->cond_waiters_user = 1;
3130 	self->ul_cvmutex = mp;
3131 	self->ul_cv_wake = cv_wake = (tsp != NULL);
3132 	self->ul_signalled = 0;
3133 	if (mp->mutex_flag & LOCK_OWNERDEAD) {
3134 		mp->mutex_flag &= ~LOCK_OWNERDEAD;
3135 		mp->mutex_flag |= LOCK_NOTRECOVERABLE;
3136 	}
3137 	release_all = ((mp->mutex_flag & LOCK_NOTRECOVERABLE) != 0);
3138 	lwpid = mutex_unlock_queue(mp, release_all);
3139 	for (;;) {
3140 		set_parking_flag(self, 1);
3141 		queue_unlock(qp);
3142 		if (lwpid != 0) {
3143 			lwpid = preempt_unpark(self, lwpid);
3144 			preempt(self);
3145 		}
3146 		/*
3147 		 * We may have a deferred signal present,
3148 		 * in which case we should return EINTR.
3149 		 * Also, we may have received a SIGCANCEL; if so
3150 		 * and we are cancelable we should return EINTR.
3151 		 * We force an immediate EINTR return from
3152 		 * __lwp_park() by turning our parking flag off.
3153 		 */
3154 		if (self->ul_cursig != 0 ||
3155 		    (self->ul_cancelable && self->ul_cancel_pending))
3156 			set_parking_flag(self, 0);
3157 		/*
3158 		 * __lwp_park() will return the residual time in tsp
3159 		 * if we are unparked before the timeout expires.
3160 		 */
3161 		error = __lwp_park(tsp, lwpid);
3162 		set_parking_flag(self, 0);
3163 		lwpid = 0;	/* unpark the other lwp only once */
3164 		/*
3165 		 * We were waked up by cond_signal(), cond_broadcast(),
3166 		 * by an interrupt or timeout (EINTR or ETIME),
3167 		 * or we may just have gotten a spurious wakeup.
3168 		 */
3169 		qp = queue_lock(cvp, CV);
3170 		if (!cv_wake)
3171 			mqp = queue_lock(mp, MX);
3172 		if (self->ul_sleepq == NULL)
3173 			break;
3174 		/*
3175 		 * We are on either the condvar sleep queue or the
3176 		 * mutex sleep queue.  Break out of the sleep if we
3177 		 * were interrupted or we timed out (EINTR or ETIME).
3178 		 * Else this is a spurious wakeup; continue the loop.
3179 		 */
3180 		if (!cv_wake && self->ul_sleepq == mqp) { /* mutex queue */
3181 			if (error) {
3182 				mp->mutex_waiters = dequeue_self(mqp);
3183 				break;
3184 			}
3185 			tsp = NULL;	/* no more timeout */
3186 		} else if (self->ul_sleepq == qp) {	/* condvar queue */
3187 			if (error) {
3188 				cvp->cond_waiters_user = dequeue_self(qp);
3189 				break;
3190 			}
3191 			/*
3192 			 * Else a spurious wakeup on the condvar queue.
3193 			 * __lwp_park() has already adjusted the timeout.
3194 			 */
3195 		} else {
3196 			thr_panic("cond_sleep_queue(): thread not on queue");
3197 		}
3198 		if (!cv_wake)
3199 			queue_unlock(mqp);
3200 	}
3201 
3202 	self->ul_sp = 0;
3203 	self->ul_cv_wake = 0;
3204 	ASSERT(self->ul_cvmutex == NULL);
3205 	ASSERT(self->ul_sleepq == NULL && self->ul_link == NULL &&
3206 	    self->ul_wchan == NULL);
3207 
3208 	signalled = self->ul_signalled;
3209 	self->ul_signalled = 0;
3210 	queue_unlock(qp);
3211 	if (!cv_wake)
3212 		queue_unlock(mqp);
3213 
3214 	/*
3215 	 * If we were concurrently cond_signal()d and any of:
3216 	 * received a UNIX signal, were cancelled, or got a timeout,
3217 	 * then perform another cond_signal() to avoid consuming it.
3218 	 */
3219 	if (error && signalled)
3220 		(void) cond_signal(cvp);
3221 
3222 	return (error);
3223 }
3224 
3225 static void
3226 cond_wait_check_alignment(cond_t *cvp, mutex_t *mp)
3227 {
3228 	if ((uintptr_t)mp & (_LONG_LONG_ALIGNMENT - 1))
3229 		lock_error(mp, "cond_wait", cvp, "mutex is misaligned");
3230 	if ((uintptr_t)cvp & (_LONG_LONG_ALIGNMENT - 1))
3231 		lock_error(mp, "cond_wait", cvp, "condvar is misaligned");
3232 }
3233 
3234 int
3235 cond_wait_queue(cond_t *cvp, mutex_t *mp, timespec_t *tsp)
3236 {
3237 	ulwp_t *self = curthread;
3238 	int error;
3239 	int merror;
3240 
3241 	if (self->ul_error_detection && self->ul_misaligned == 0)
3242 		cond_wait_check_alignment(cvp, mp);
3243 
3244 	/*
3245 	 * The old thread library was programmed to defer signals
3246 	 * while in cond_wait() so that the associated mutex would
3247 	 * be guaranteed to be held when the application signal
3248 	 * handler was invoked.
3249 	 *
3250 	 * We do not behave this way by default; the state of the
3251 	 * associated mutex in the signal handler is undefined.
3252 	 *
3253 	 * To accommodate applications that depend on the old
3254 	 * behavior, the _THREAD_COND_WAIT_DEFER environment
3255 	 * variable can be set to 1 and we will behave in the
3256 	 * old way with respect to cond_wait().
3257 	 */
3258 	if (self->ul_cond_wait_defer)
3259 		sigoff(self);
3260 
3261 	error = cond_sleep_queue(cvp, mp, tsp);
3262 
3263 	/*
3264 	 * Reacquire the mutex.
3265 	 */
3266 	if ((merror = mutex_lock_impl(mp, NULL)) != 0)
3267 		error = merror;
3268 
3269 	/*
3270 	 * Take any deferred signal now, after we have reacquired the mutex.
3271 	 */
3272 	if (self->ul_cond_wait_defer)
3273 		sigon(self);
3274 
3275 	return (error);
3276 }
3277 
3278 /*
3279  * cond_sleep_kernel(): utility function for cond_wait_kernel().
3280  * See the comment ahead of cond_sleep_queue(), above.
3281  */
3282 static int
3283 cond_sleep_kernel(cond_t *cvp, mutex_t *mp, timespec_t *tsp)
3284 {
3285 	int mtype = mp->mutex_type;
3286 	ulwp_t *self = curthread;
3287 	int error;
3288 
3289 	if ((mtype & LOCK_PRIO_PROTECT) && _ceil_mylist_del(mp))
3290 		_ceil_prio_waive();
3291 
3292 	self->ul_sp = stkptr();
3293 	self->ul_wchan = cvp;
3294 	sigoff(self);
3295 	mp->mutex_owner = 0;
3296 	/* mp->mutex_ownerpid is cleared by ___lwp_cond_wait() */
3297 	if (mtype & LOCK_PRIO_INHERIT) {
3298 		mp->mutex_lockw = LOCKCLEAR;
3299 		self->ul_pilocks--;
3300 	}
3301 	/*
3302 	 * ___lwp_cond_wait() returns immediately with EINTR if
3303 	 * set_parking_flag(self,0) is called on this lwp before it
3304 	 * goes to sleep in the kernel.  sigacthandler() calls this
3305 	 * when a deferred signal is noted.  This assures that we don't
3306 	 * get stuck in ___lwp_cond_wait() with all signals blocked
3307 	 * due to taking a deferred signal before going to sleep.
3308 	 */
3309 	set_parking_flag(self, 1);
3310 	if (self->ul_cursig != 0 ||
3311 	    (self->ul_cancelable && self->ul_cancel_pending))
3312 		set_parking_flag(self, 0);
3313 	error = ___lwp_cond_wait(cvp, mp, tsp, 1);
3314 	set_parking_flag(self, 0);
3315 	sigon(self);
3316 	self->ul_sp = 0;
3317 	self->ul_wchan = NULL;
3318 	return (error);
3319 }
3320 
3321 int
3322 cond_wait_kernel(cond_t *cvp, mutex_t *mp, timespec_t *tsp)
3323 {
3324 	ulwp_t *self = curthread;
3325 	int error;
3326 	int merror;
3327 
3328 	if (self->ul_error_detection && self->ul_misaligned == 0)
3329 		cond_wait_check_alignment(cvp, mp);
3330 
3331 	/*
3332 	 * See the large comment in cond_wait_queue(), above.
3333 	 */
3334 	if (self->ul_cond_wait_defer)
3335 		sigoff(self);
3336 
3337 	error = cond_sleep_kernel(cvp, mp, tsp);
3338 
3339 	/*
3340 	 * Override the return code from ___lwp_cond_wait()
3341 	 * with any non-zero return code from mutex_lock().
3342 	 * This addresses robust lock failures in particular;
3343 	 * the caller must see the EOWNERDEAD or ENOTRECOVERABLE
3344 	 * errors in order to take corrective action.
3345 	 */
3346 	if ((merror = mutex_lock_impl(mp, NULL)) != 0)
3347 		error = merror;
3348 
3349 	/*
3350 	 * Take any deferred signal now, after we have reacquired the mutex.
3351 	 */
3352 	if (self->ul_cond_wait_defer)
3353 		sigon(self);
3354 
3355 	return (error);
3356 }
3357 
3358 /*
3359  * Common code for cond_wait() and cond_timedwait()
3360  */
3361 int
3362 cond_wait_common(cond_t *cvp, mutex_t *mp, timespec_t *tsp)
3363 {
3364 	int mtype = mp->mutex_type;
3365 	hrtime_t begin_sleep = 0;
3366 	ulwp_t *self = curthread;
3367 	uberdata_t *udp = self->ul_uberdata;
3368 	tdb_cond_stats_t *csp = COND_STATS(cvp, udp);
3369 	tdb_mutex_stats_t *msp = MUTEX_STATS(mp, udp);
3370 	uint8_t rcount;
3371 	int error = 0;
3372 
3373 	/*
3374 	 * The SUSV3 Posix spec for pthread_cond_timedwait() states:
3375 	 *	Except in the case of [ETIMEDOUT], all these error checks
3376 	 *	shall act as if they were performed immediately at the
3377 	 *	beginning of processing for the function and shall cause
3378 	 *	an error return, in effect, prior to modifying the state
3379 	 *	of the mutex specified by mutex or the condition variable
3380 	 *	specified by cond.
3381 	 * Therefore, we must return EINVAL now if the timout is invalid.
3382 	 */
3383 	if (tsp != NULL &&
3384 	    (tsp->tv_sec < 0 || (ulong_t)tsp->tv_nsec >= NANOSEC))
3385 		return (EINVAL);
3386 
3387 	if (__td_event_report(self, TD_SLEEP, udp)) {
3388 		self->ul_sp = stkptr();
3389 		self->ul_wchan = cvp;
3390 		self->ul_td_evbuf.eventnum = TD_SLEEP;
3391 		self->ul_td_evbuf.eventdata = cvp;
3392 		tdb_event(TD_SLEEP, udp);
3393 		self->ul_sp = 0;
3394 	}
3395 	if (csp) {
3396 		if (tsp)
3397 			tdb_incr(csp->cond_timedwait);
3398 		else
3399 			tdb_incr(csp->cond_wait);
3400 	}
3401 	if (msp)
3402 		begin_sleep = record_hold_time(msp);
3403 	else if (csp)
3404 		begin_sleep = gethrtime();
3405 
3406 	if (self->ul_error_detection) {
3407 		if (!mutex_held(mp))
3408 			lock_error(mp, "cond_wait", cvp, NULL);
3409 		if ((mtype & LOCK_RECURSIVE) && mp->mutex_rcount != 0)
3410 			lock_error(mp, "recursive mutex in cond_wait",
3411 			    cvp, NULL);
3412 		if (cvp->cond_type & USYNC_PROCESS) {
3413 			if (!(mtype & USYNC_PROCESS))
3414 				lock_error(mp, "cond_wait", cvp,
3415 				    "condvar process-shared, "
3416 				    "mutex process-private");
3417 		} else {
3418 			if (mtype & USYNC_PROCESS)
3419 				lock_error(mp, "cond_wait", cvp,
3420 				    "condvar process-private, "
3421 				    "mutex process-shared");
3422 		}
3423 	}
3424 
3425 	/*
3426 	 * We deal with recursive mutexes by completely
3427 	 * dropping the lock and restoring the recursion
3428 	 * count after waking up.  This is arguably wrong,
3429 	 * but it obeys the principle of least astonishment.
3430 	 */
3431 	rcount = mp->mutex_rcount;
3432 	mp->mutex_rcount = 0;
3433 	if ((mtype &
3434 	    (USYNC_PROCESS | LOCK_PRIO_INHERIT | LOCK_PRIO_PROTECT)) |
3435 	    (cvp->cond_type & USYNC_PROCESS))
3436 		error = cond_wait_kernel(cvp, mp, tsp);
3437 	else
3438 		error = cond_wait_queue(cvp, mp, tsp);
3439 	mp->mutex_rcount = rcount;
3440 
3441 	if (csp) {
3442 		hrtime_t lapse = gethrtime() - begin_sleep;
3443 		if (tsp == NULL)
3444 			csp->cond_wait_sleep_time += lapse;
3445 		else {
3446 			csp->cond_timedwait_sleep_time += lapse;
3447 			if (error == ETIME)
3448 				tdb_incr(csp->cond_timedwait_timeout);
3449 		}
3450 	}
3451 	return (error);
3452 }
3453 
3454 /*
3455  * cond_wait() is a cancellation point but __cond_wait() is not.
3456  * Internally, libc calls the non-cancellation version.
3457  * Other libraries need to use pthread_setcancelstate(), as appropriate,
3458  * since __cond_wait() is not exported from libc.
3459  */
3460 int
3461 __cond_wait(cond_t *cvp, mutex_t *mp)
3462 {
3463 	ulwp_t *self = curthread;
3464 	uberdata_t *udp = self->ul_uberdata;
3465 	uberflags_t *gflags;
3466 
3467 	/*
3468 	 * Optimize the common case of USYNC_THREAD plus
3469 	 * no error detection, no lock statistics, and no event tracing.
3470 	 */
3471 	if ((gflags = self->ul_schedctl_called) != NULL &&
3472 	    (cvp->cond_type | mp->mutex_type | gflags->uf_trs_ted |
3473 	    self->ul_td_events_enable |
3474 	    udp->tdb.tdb_ev_global_mask.event_bits[0]) == 0)
3475 		return (cond_wait_queue(cvp, mp, NULL));
3476 
3477 	/*
3478 	 * Else do it the long way.
3479 	 */
3480 	return (cond_wait_common(cvp, mp, NULL));
3481 }
3482 
3483 #pragma weak _cond_wait = cond_wait
3484 int
3485 cond_wait(cond_t *cvp, mutex_t *mp)
3486 {
3487 	int error;
3488 
3489 	_cancelon();
3490 	error = __cond_wait(cvp, mp);
3491 	if (error == EINTR)
3492 		_canceloff();
3493 	else
3494 		_canceloff_nocancel();
3495 	return (error);
3496 }
3497 
3498 /*
3499  * pthread_cond_wait() is a cancellation point.
3500  */
3501 int
3502 pthread_cond_wait(pthread_cond_t *_RESTRICT_KYWD cvp,
3503 	pthread_mutex_t *_RESTRICT_KYWD mp)
3504 {
3505 	int error;
3506 
3507 	error = cond_wait((cond_t *)cvp, (mutex_t *)mp);
3508 	return ((error == EINTR)? 0 : error);
3509 }
3510 
3511 /*
3512  * cond_timedwait() is a cancellation point but __cond_timedwait() is not.
3513  */
3514 int
3515 __cond_timedwait(cond_t *cvp, mutex_t *mp, const timespec_t *abstime)
3516 {
3517 	clockid_t clock_id = cvp->cond_clockid;
3518 	timespec_t reltime;
3519 	int error;
3520 
3521 	if (clock_id != CLOCK_REALTIME && clock_id != CLOCK_HIGHRES)
3522 		clock_id = CLOCK_REALTIME;
3523 	abstime_to_reltime(clock_id, abstime, &reltime);
3524 	error = cond_wait_common(cvp, mp, &reltime);
3525 	if (error == ETIME && clock_id == CLOCK_HIGHRES) {
3526 		/*
3527 		 * Don't return ETIME if we didn't really get a timeout.
3528 		 * This can happen if we return because someone resets
3529 		 * the system clock.  Just return zero in this case,
3530 		 * giving a spurious wakeup but not a timeout.
3531 		 */
3532 		if ((hrtime_t)(uint32_t)abstime->tv_sec * NANOSEC +
3533 		    abstime->tv_nsec > gethrtime())
3534 			error = 0;
3535 	}
3536 	return (error);
3537 }
3538 
3539 int
3540 cond_timedwait(cond_t *cvp, mutex_t *mp, const timespec_t *abstime)
3541 {
3542 	int error;
3543 
3544 	_cancelon();
3545 	error = __cond_timedwait(cvp, mp, abstime);
3546 	if (error == EINTR)
3547 		_canceloff();
3548 	else
3549 		_canceloff_nocancel();
3550 	return (error);
3551 }
3552 
3553 /*
3554  * pthread_cond_timedwait() is a cancellation point.
3555  */
3556 int
3557 pthread_cond_timedwait(pthread_cond_t *_RESTRICT_KYWD cvp,
3558 	pthread_mutex_t *_RESTRICT_KYWD mp,
3559 	const struct timespec *_RESTRICT_KYWD abstime)
3560 {
3561 	int error;
3562 
3563 	error = cond_timedwait((cond_t *)cvp, (mutex_t *)mp, abstime);
3564 	if (error == ETIME)
3565 		error = ETIMEDOUT;
3566 	else if (error == EINTR)
3567 		error = 0;
3568 	return (error);
3569 }
3570 
3571 /*
3572  * cond_reltimedwait() is a cancellation point but __cond_reltimedwait() is not.
3573  */
3574 int
3575 __cond_reltimedwait(cond_t *cvp, mutex_t *mp, const timespec_t *reltime)
3576 {
3577 	timespec_t tslocal = *reltime;
3578 
3579 	return (cond_wait_common(cvp, mp, &tslocal));
3580 }
3581 
3582 int
3583 cond_reltimedwait(cond_t *cvp, mutex_t *mp, const timespec_t *reltime)
3584 {
3585 	int error;
3586 
3587 	_cancelon();
3588 	error = __cond_reltimedwait(cvp, mp, reltime);
3589 	if (error == EINTR)
3590 		_canceloff();
3591 	else
3592 		_canceloff_nocancel();
3593 	return (error);
3594 }
3595 
3596 int
3597 pthread_cond_reltimedwait_np(pthread_cond_t *_RESTRICT_KYWD cvp,
3598 	pthread_mutex_t *_RESTRICT_KYWD mp,
3599 	const struct timespec *_RESTRICT_KYWD reltime)
3600 {
3601 	int error;
3602 
3603 	error = cond_reltimedwait((cond_t *)cvp, (mutex_t *)mp, reltime);
3604 	if (error == ETIME)
3605 		error = ETIMEDOUT;
3606 	else if (error == EINTR)
3607 		error = 0;
3608 	return (error);
3609 }
3610 
3611 #pragma weak pthread_cond_signal = cond_signal
3612 #pragma weak _cond_signal = cond_signal
3613 int
3614 cond_signal(cond_t *cvp)
3615 {
3616 	ulwp_t *self = curthread;
3617 	uberdata_t *udp = self->ul_uberdata;
3618 	tdb_cond_stats_t *csp = COND_STATS(cvp, udp);
3619 	int error = 0;
3620 	int more;
3621 	lwpid_t lwpid;
3622 	queue_head_t *qp;
3623 	mutex_t *mp;
3624 	queue_head_t *mqp;
3625 	ulwp_t **ulwpp;
3626 	ulwp_t *ulwp;
3627 	ulwp_t *prev;
3628 
3629 	if (csp)
3630 		tdb_incr(csp->cond_signal);
3631 
3632 	if (cvp->cond_waiters_kernel)	/* someone sleeping in the kernel? */
3633 		error = _lwp_cond_signal(cvp);
3634 
3635 	if (!cvp->cond_waiters_user)	/* no one sleeping at user-level */
3636 		return (error);
3637 
3638 	/*
3639 	 * Move someone from the condvar sleep queue to the mutex sleep
3640 	 * queue for the mutex that he will acquire on being waked up.
3641 	 * We can do this only if we own the mutex he will acquire.
3642 	 * If we do not own the mutex, or if his ul_cv_wake flag
3643 	 * is set, just dequeue and unpark him.
3644 	 */
3645 	qp = queue_lock(cvp, CV);
3646 	ulwpp = queue_slot(qp, &prev, &more);
3647 	cvp->cond_waiters_user = more;
3648 	if (ulwpp == NULL) {	/* no one on the sleep queue */
3649 		queue_unlock(qp);
3650 		return (error);
3651 	}
3652 	ulwp = *ulwpp;
3653 
3654 	/*
3655 	 * Inform the thread that he was the recipient of a cond_signal().
3656 	 * This lets him deal with cond_signal() and, concurrently,
3657 	 * one or more of a cancellation, a UNIX signal, or a timeout.
3658 	 * These latter conditions must not consume a cond_signal().
3659 	 */
3660 	ulwp->ul_signalled = 1;
3661 
3662 	/*
3663 	 * Dequeue the waiter but leave his ul_sleepq non-NULL
3664 	 * while we move him to the mutex queue so that he can
3665 	 * deal properly with spurious wakeups.
3666 	 */
3667 	queue_unlink(qp, ulwpp, prev);
3668 
3669 	mp = ulwp->ul_cvmutex;		/* the mutex he will acquire */
3670 	ulwp->ul_cvmutex = NULL;
3671 	ASSERT(mp != NULL);
3672 
3673 	if (ulwp->ul_cv_wake || !MUTEX_OWNED(mp, self)) {
3674 		/* just wake him up */
3675 		lwpid = ulwp->ul_lwpid;
3676 		no_preempt(self);
3677 		ulwp->ul_sleepq = NULL;
3678 		ulwp->ul_wchan = NULL;
3679 		queue_unlock(qp);
3680 		(void) __lwp_unpark(lwpid);
3681 		preempt(self);
3682 	} else {
3683 		/* move him to the mutex queue */
3684 		mqp = queue_lock(mp, MX);
3685 		enqueue(mqp, ulwp, 0);
3686 		mp->mutex_waiters = 1;
3687 		queue_unlock(mqp);
3688 		queue_unlock(qp);
3689 	}
3690 
3691 	return (error);
3692 }
3693 
3694 /*
3695  * Utility function called by mutex_wakeup_all(), cond_broadcast(),
3696  * and rw_queue_release() to (re)allocate a big buffer to hold the
3697  * lwpids of all the threads to be set running after they are removed
3698  * from their sleep queues.  Since we are holding a queue lock, we
3699  * cannot call any function that might acquire a lock.  mmap(), munmap(),
3700  * lwp_unpark_all() are simple system calls and are safe in this regard.
3701  */
3702 lwpid_t *
3703 alloc_lwpids(lwpid_t *lwpid, int *nlwpid_ptr, int *maxlwps_ptr)
3704 {
3705 	/*
3706 	 * Allocate NEWLWPS ids on the first overflow.
3707 	 * Double the allocation each time after that.
3708 	 */
3709 	int nlwpid = *nlwpid_ptr;
3710 	int maxlwps = *maxlwps_ptr;
3711 	int first_allocation;
3712 	int newlwps;
3713 	void *vaddr;
3714 
3715 	ASSERT(nlwpid == maxlwps);
3716 
3717 	first_allocation = (maxlwps == MAXLWPS);
3718 	newlwps = first_allocation? NEWLWPS : 2 * maxlwps;
3719 	vaddr = mmap(NULL, newlwps * sizeof (lwpid_t),
3720 	    PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, (off_t)0);
3721 
3722 	if (vaddr == MAP_FAILED) {
3723 		/*
3724 		 * Let's hope this never happens.
3725 		 * If it does, then we have a terrible
3726 		 * thundering herd on our hands.
3727 		 */
3728 		(void) __lwp_unpark_all(lwpid, nlwpid);
3729 		*nlwpid_ptr = 0;
3730 	} else {
3731 		(void) memcpy(vaddr, lwpid, maxlwps * sizeof (lwpid_t));
3732 		if (!first_allocation)
3733 			(void) munmap((caddr_t)lwpid,
3734 			    maxlwps * sizeof (lwpid_t));
3735 		lwpid = vaddr;
3736 		*maxlwps_ptr = newlwps;
3737 	}
3738 
3739 	return (lwpid);
3740 }
3741 
3742 #pragma weak pthread_cond_broadcast = cond_broadcast
3743 #pragma weak _cond_broadcast = cond_broadcast
3744 int
3745 cond_broadcast(cond_t *cvp)
3746 {
3747 	ulwp_t *self = curthread;
3748 	uberdata_t *udp = self->ul_uberdata;
3749 	tdb_cond_stats_t *csp = COND_STATS(cvp, udp);
3750 	int error = 0;
3751 	queue_head_t *qp;
3752 	queue_root_t *qrp;
3753 	mutex_t *mp;
3754 	mutex_t *mp_cache = NULL;
3755 	queue_head_t *mqp = NULL;
3756 	ulwp_t *ulwp;
3757 	int nlwpid = 0;
3758 	int maxlwps = MAXLWPS;
3759 	lwpid_t buffer[MAXLWPS];
3760 	lwpid_t *lwpid = buffer;
3761 
3762 	if (csp)
3763 		tdb_incr(csp->cond_broadcast);
3764 
3765 	if (cvp->cond_waiters_kernel)	/* someone sleeping in the kernel? */
3766 		error = _lwp_cond_broadcast(cvp);
3767 
3768 	if (!cvp->cond_waiters_user)	/* no one sleeping at user-level */
3769 		return (error);
3770 
3771 	/*
3772 	 * Move everyone from the condvar sleep queue to the mutex sleep
3773 	 * queue for the mutex that they will acquire on being waked up.
3774 	 * We can do this only if we own the mutex they will acquire.
3775 	 * If we do not own the mutex, or if their ul_cv_wake flag
3776 	 * is set, just dequeue and unpark them.
3777 	 *
3778 	 * We keep track of lwpids that are to be unparked in lwpid[].
3779 	 * __lwp_unpark_all() is called to unpark all of them after
3780 	 * they have been removed from the sleep queue and the sleep
3781 	 * queue lock has been dropped.  If we run out of space in our
3782 	 * on-stack buffer, we need to allocate more but we can't call
3783 	 * lmalloc() because we are holding a queue lock when the overflow
3784 	 * occurs and lmalloc() acquires a lock.  We can't use alloca()
3785 	 * either because the application may have allocated a small
3786 	 * stack and we don't want to overrun the stack.  So we call
3787 	 * alloc_lwpids() to allocate a bigger buffer using the mmap()
3788 	 * system call directly since that path acquires no locks.
3789 	 */
3790 	qp = queue_lock(cvp, CV);
3791 	cvp->cond_waiters_user = 0;
3792 	for (;;) {
3793 		if ((qrp = qp->qh_root) == NULL ||
3794 		    (ulwp = qrp->qr_head) == NULL)
3795 			break;
3796 		ASSERT(ulwp->ul_wchan == cvp);
3797 		queue_unlink(qp, &qrp->qr_head, NULL);
3798 		mp = ulwp->ul_cvmutex;		/* his mutex */
3799 		ulwp->ul_cvmutex = NULL;
3800 		ASSERT(mp != NULL);
3801 		if (ulwp->ul_cv_wake || !MUTEX_OWNED(mp, self)) {
3802 			/* just wake him up */
3803 			ulwp->ul_sleepq = NULL;
3804 			ulwp->ul_wchan = NULL;
3805 			if (nlwpid == maxlwps)
3806 				lwpid = alloc_lwpids(lwpid, &nlwpid, &maxlwps);
3807 			lwpid[nlwpid++] = ulwp->ul_lwpid;
3808 		} else {
3809 			/* move him to the mutex queue */
3810 			if (mp != mp_cache) {
3811 				mp_cache = mp;
3812 				if (mqp != NULL)
3813 					queue_unlock(mqp);
3814 				mqp = queue_lock(mp, MX);
3815 			}
3816 			enqueue(mqp, ulwp, 0);
3817 			mp->mutex_waiters = 1;
3818 		}
3819 	}
3820 	if (mqp != NULL)
3821 		queue_unlock(mqp);
3822 	if (nlwpid == 0) {
3823 		queue_unlock(qp);
3824 	} else {
3825 		no_preempt(self);
3826 		queue_unlock(qp);
3827 		if (nlwpid == 1)
3828 			(void) __lwp_unpark(lwpid[0]);
3829 		else
3830 			(void) __lwp_unpark_all(lwpid, nlwpid);
3831 		preempt(self);
3832 	}
3833 	if (lwpid != buffer)
3834 		(void) munmap((caddr_t)lwpid, maxlwps * sizeof (lwpid_t));
3835 	return (error);
3836 }
3837 
3838 #pragma weak pthread_cond_destroy = cond_destroy
3839 int
3840 cond_destroy(cond_t *cvp)
3841 {
3842 	cvp->cond_magic = 0;
3843 	tdb_sync_obj_deregister(cvp);
3844 	return (0);
3845 }
3846 
3847 #if defined(THREAD_DEBUG)
3848 void
3849 assert_no_libc_locks_held(void)
3850 {
3851 	ASSERT(!curthread->ul_critical || curthread->ul_bindflags);
3852 }
3853 
3854 /* protected by link_lock */
3855 uint64_t spin_lock_spin;
3856 uint64_t spin_lock_spin2;
3857 uint64_t spin_lock_sleep;
3858 uint64_t spin_lock_wakeup;
3859 
3860 /*
3861  * Record spin lock statistics.
3862  * Called by a thread exiting itself in thrp_exit().
3863  * Also called via atexit() from the thread calling
3864  * exit() to do all the other threads as well.
3865  */
3866 void
3867 record_spin_locks(ulwp_t *ulwp)
3868 {
3869 	spin_lock_spin += ulwp->ul_spin_lock_spin;
3870 	spin_lock_spin2 += ulwp->ul_spin_lock_spin2;
3871 	spin_lock_sleep += ulwp->ul_spin_lock_sleep;
3872 	spin_lock_wakeup += ulwp->ul_spin_lock_wakeup;
3873 	ulwp->ul_spin_lock_spin = 0;
3874 	ulwp->ul_spin_lock_spin2 = 0;
3875 	ulwp->ul_spin_lock_sleep = 0;
3876 	ulwp->ul_spin_lock_wakeup = 0;
3877 }
3878 
3879 /*
3880  * atexit function:  dump the queue statistics to stderr.
3881  */
3882 #include <stdio.h>
3883 void
3884 dump_queue_statistics(void)
3885 {
3886 	uberdata_t *udp = curthread->ul_uberdata;
3887 	queue_head_t *qp;
3888 	int qn;
3889 	uint64_t spin_lock_total = 0;
3890 
3891 	if (udp->queue_head == NULL || thread_queue_dump == 0)
3892 		return;
3893 
3894 	if (fprintf(stderr, "\n%5d mutex queues:\n", QHASHSIZE) < 0 ||
3895 	    fprintf(stderr, "queue#   lockcount    max qlen    max hlen\n") < 0)
3896 		return;
3897 	for (qn = 0, qp = udp->queue_head; qn < QHASHSIZE; qn++, qp++) {
3898 		if (qp->qh_lockcount == 0)
3899 			continue;
3900 		spin_lock_total += qp->qh_lockcount;
3901 		if (fprintf(stderr, "%5d %12llu%12u%12u\n", qn,
3902 		    (u_longlong_t)qp->qh_lockcount,
3903 		    qp->qh_qmax, qp->qh_hmax) < 0)
3904 			return;
3905 	}
3906 
3907 	if (fprintf(stderr, "\n%5d condvar queues:\n", QHASHSIZE) < 0 ||
3908 	    fprintf(stderr, "queue#   lockcount    max qlen    max hlen\n") < 0)
3909 		return;
3910 	for (qn = 0; qn < QHASHSIZE; qn++, qp++) {
3911 		if (qp->qh_lockcount == 0)
3912 			continue;
3913 		spin_lock_total += qp->qh_lockcount;
3914 		if (fprintf(stderr, "%5d %12llu%12u%12u\n", qn,
3915 		    (u_longlong_t)qp->qh_lockcount,
3916 		    qp->qh_qmax, qp->qh_hmax) < 0)
3917 			return;
3918 	}
3919 
3920 	(void) fprintf(stderr, "\n  spin_lock_total  = %10llu\n",
3921 	    (u_longlong_t)spin_lock_total);
3922 	(void) fprintf(stderr, "  spin_lock_spin   = %10llu\n",
3923 	    (u_longlong_t)spin_lock_spin);
3924 	(void) fprintf(stderr, "  spin_lock_spin2  = %10llu\n",
3925 	    (u_longlong_t)spin_lock_spin2);
3926 	(void) fprintf(stderr, "  spin_lock_sleep  = %10llu\n",
3927 	    (u_longlong_t)spin_lock_sleep);
3928 	(void) fprintf(stderr, "  spin_lock_wakeup = %10llu\n",
3929 	    (u_longlong_t)spin_lock_wakeup);
3930 }
3931 #endif
3932