Lines Matching refs:mutex

112 ww_acquire_done_check(struct ww_mutex *mutex, struct ww_acquire_ctx *ctx)  in ww_acquire_done_check()  argument
119 KASSERT(mutex_owned(&mutex->wwm_lock)); in ww_acquire_done_check()
121 (mutex->wwm_state == WW_CTX && mutex->wwm_u.ctx == ctx)), in ww_acquire_done_check()
123 ctx, mutex); in ww_acquire_done_check()
143 const volatile struct ww_mutex *mutex = cookie; in ww_dump() local
146 switch (mutex->wwm_state) { in ww_dump()
152 pr("%-13s: %p\n", "owner", mutex->wwm_u.owner); in ww_dump()
154 cv_has_waiters((void *)(intptr_t)&mutex->wwm_cv) in ww_dump()
159 pr("%-13s: %p\n", "context", mutex->wwm_u.ctx); in ww_dump()
161 mutex->wwm_u.ctx->wwx_owner); in ww_dump()
163 cv_has_waiters((void *)(intptr_t)&mutex->wwm_cv) in ww_dump()
168 pr("%-13s: %p\n", "context", mutex->wwm_u.ctx); in ww_dump()
170 mutex->wwm_u.ctx->wwx_owner); in ww_dump()
194 ww_mutex_init(struct ww_mutex *mutex, struct ww_class *class) in ww_mutex_init() argument
201 mutex_init(&mutex->wwm_lock, MUTEX_DEFAULT, IPL_VM); in ww_mutex_init()
202 mutex->wwm_state = WW_UNLOCKED; in ww_mutex_init()
203 mutex->wwm_class = class; in ww_mutex_init()
204 rb_tree_init(&mutex->wwm_waiters, &ww_acquire_ctx_rb_ops); in ww_mutex_init()
205 cv_init(&mutex->wwm_cv, "linuxwwm"); in ww_mutex_init()
207 mutex->wwm_debug = LOCKDEBUG_ALLOC(mutex, &ww_lockops, in ww_mutex_init()
220 ww_mutex_destroy(struct ww_mutex *mutex) in ww_mutex_destroy() argument
223 KASSERT(mutex->wwm_state == WW_UNLOCKED); in ww_mutex_destroy()
226 LOCKDEBUG_FREE(mutex->wwm_debug, mutex); in ww_mutex_destroy()
228 cv_destroy(&mutex->wwm_cv); in ww_mutex_destroy()
230 rb_tree_destroy(&mutex->wwm_waiters, &ww_acquire_ctx_rb_ops); in ww_mutex_destroy()
232 KASSERT(mutex->wwm_state == WW_UNLOCKED); in ww_mutex_destroy()
233 mutex_destroy(&mutex->wwm_lock); in ww_mutex_destroy()
248 ww_mutex_is_locked(struct ww_mutex *mutex) in ww_mutex_is_locked() argument
252 mutex_enter(&mutex->wwm_lock); in ww_mutex_is_locked()
253 switch (mutex->wwm_state) { in ww_mutex_is_locked()
263 panic("wait/wound mutex %p in bad state: %d", mutex, in ww_mutex_is_locked()
264 (int)mutex->wwm_state); in ww_mutex_is_locked()
266 mutex_exit(&mutex->wwm_lock); in ww_mutex_is_locked()
284 ww_mutex_state_wait(struct ww_mutex *mutex, enum ww_mutex_state state) in ww_mutex_state_wait() argument
287 KASSERT(mutex_owned(&mutex->wwm_lock)); in ww_mutex_state_wait()
288 KASSERT(mutex->wwm_state == state); in ww_mutex_state_wait()
291 cv_wait(&mutex->wwm_cv, &mutex->wwm_lock); in ww_mutex_state_wait()
292 if (mutex->wwm_state != state) in ww_mutex_state_wait()
296 KASSERT(mutex->wwm_state != state); in ww_mutex_state_wait()
313 ww_mutex_state_wait_sig(struct ww_mutex *mutex, enum ww_mutex_state state) in ww_mutex_state_wait_sig() argument
317 KASSERT(mutex_owned(&mutex->wwm_lock)); in ww_mutex_state_wait_sig()
318 KASSERT(mutex->wwm_state == state); in ww_mutex_state_wait_sig()
322 ret = -cv_wait_sig(&mutex->wwm_cv, &mutex->wwm_lock); in ww_mutex_state_wait_sig()
323 if (mutex->wwm_state != state) { in ww_mutex_state_wait_sig()
336 KASSERTMSG(ret != 0 || mutex->wwm_state != state, in ww_mutex_state_wait_sig()
338 ret, mutex, mutex->wwm_state, state); in ww_mutex_state_wait_sig()
358 ww_mutex_lock_wait(struct ww_mutex *mutex, struct ww_acquire_ctx *ctx) in ww_mutex_lock_wait() argument
362 KASSERT(mutex_owned(&mutex->wwm_lock)); in ww_mutex_lock_wait()
364 KASSERT((mutex->wwm_state == WW_CTX) || in ww_mutex_lock_wait()
365 (mutex->wwm_state == WW_WANTOWN)); in ww_mutex_lock_wait()
366 KASSERT(mutex->wwm_u.ctx != ctx); in ww_mutex_lock_wait()
367 KASSERTMSG((ctx->wwx_class == mutex->wwm_u.ctx->wwx_class), in ww_mutex_lock_wait()
369 ctx->wwx_class, mutex->wwm_u.ctx->wwx_class); in ww_mutex_lock_wait()
370 KASSERTMSG((mutex->wwm_u.ctx->wwx_ticket != ctx->wwx_ticket), in ww_mutex_lock_wait()
373 mutex->wwm_u.ctx->wwx_ticket, mutex->wwm_u.ctx); in ww_mutex_lock_wait()
375 collision = rb_tree_insert_node(&mutex->wwm_waiters, ctx); in ww_mutex_lock_wait()
381 cv_wait(&mutex->wwm_cv, &mutex->wwm_lock); in ww_mutex_lock_wait()
382 if ((mutex->wwm_state == WW_CTX || in ww_mutex_lock_wait()
383 mutex->wwm_state == WW_WANTOWN) && in ww_mutex_lock_wait()
384 mutex->wwm_u.ctx == ctx) in ww_mutex_lock_wait()
388 rb_tree_remove_node(&mutex->wwm_waiters, ctx); in ww_mutex_lock_wait()
390 KASSERT(mutex->wwm_state == WW_CTX || mutex->wwm_state == WW_WANTOWN); in ww_mutex_lock_wait()
391 KASSERT(mutex->wwm_u.ctx == ctx); in ww_mutex_lock_wait()
411 ww_mutex_lock_wait_sig(struct ww_mutex *mutex, struct ww_acquire_ctx *ctx) in ww_mutex_lock_wait_sig() argument
416 KASSERT(mutex_owned(&mutex->wwm_lock)); in ww_mutex_lock_wait_sig()
418 KASSERT((mutex->wwm_state == WW_CTX) || in ww_mutex_lock_wait_sig()
419 (mutex->wwm_state == WW_WANTOWN)); in ww_mutex_lock_wait_sig()
420 KASSERT(mutex->wwm_u.ctx != ctx); in ww_mutex_lock_wait_sig()
421 KASSERTMSG((ctx->wwx_class == mutex->wwm_u.ctx->wwx_class), in ww_mutex_lock_wait_sig()
423 ctx->wwx_class, mutex->wwm_u.ctx->wwx_class); in ww_mutex_lock_wait_sig()
424 KASSERTMSG((mutex->wwm_u.ctx->wwx_ticket != ctx->wwx_ticket), in ww_mutex_lock_wait_sig()
427 mutex->wwm_u.ctx->wwx_ticket, mutex->wwm_u.ctx); in ww_mutex_lock_wait_sig()
429 collision = rb_tree_insert_node(&mutex->wwm_waiters, ctx); in ww_mutex_lock_wait_sig()
436 ret = -cv_wait_sig(&mutex->wwm_cv, &mutex->wwm_lock); in ww_mutex_lock_wait_sig()
437 if ((mutex->wwm_state == WW_CTX || in ww_mutex_lock_wait_sig()
438 mutex->wwm_state == WW_WANTOWN) && in ww_mutex_lock_wait_sig()
439 mutex->wwm_u.ctx == ctx) { in ww_mutex_lock_wait_sig()
451 rb_tree_remove_node(&mutex->wwm_waiters, ctx); in ww_mutex_lock_wait_sig()
455 mutex->wwm_state == WW_CTX || mutex->wwm_state == WW_WANTOWN); in ww_mutex_lock_wait_sig()
456 KASSERT(ret != 0 || mutex->wwm_u.ctx == ctx); in ww_mutex_lock_wait_sig()
471 ww_mutex_lock_noctx(struct ww_mutex *mutex) in ww_mutex_lock_noctx() argument
474 mutex_enter(&mutex->wwm_lock); in ww_mutex_lock_noctx()
475 retry: switch (mutex->wwm_state) { in ww_mutex_lock_noctx()
477 mutex->wwm_state = WW_OWNED; in ww_mutex_lock_noctx()
478 mutex->wwm_u.owner = curlwp; in ww_mutex_lock_noctx()
481 KASSERTMSG((mutex->wwm_u.owner != curlwp), in ww_mutex_lock_noctx()
482 "locking %p against myself: %p", mutex, curlwp); in ww_mutex_lock_noctx()
483 ww_mutex_state_wait(mutex, WW_OWNED); in ww_mutex_lock_noctx()
486 KASSERT(mutex->wwm_u.ctx != NULL); in ww_mutex_lock_noctx()
487 mutex->wwm_state = WW_WANTOWN; in ww_mutex_lock_noctx()
490 KASSERTMSG((mutex->wwm_u.ctx->wwx_owner != curlwp), in ww_mutex_lock_noctx()
491 "locking %p against myself: %p", mutex, curlwp); in ww_mutex_lock_noctx()
492 ww_mutex_state_wait(mutex, WW_WANTOWN); in ww_mutex_lock_noctx()
496 mutex, (int)mutex->wwm_state); in ww_mutex_lock_noctx()
498 KASSERT(mutex->wwm_state == WW_OWNED); in ww_mutex_lock_noctx()
499 KASSERT(mutex->wwm_u.owner == curlwp); in ww_mutex_lock_noctx()
500 WW_LOCKED(mutex); in ww_mutex_lock_noctx()
501 mutex_exit(&mutex->wwm_lock); in ww_mutex_lock_noctx()
517 ww_mutex_lock_noctx_sig(struct ww_mutex *mutex) in ww_mutex_lock_noctx_sig() argument
521 mutex_enter(&mutex->wwm_lock); in ww_mutex_lock_noctx_sig()
522 retry: switch (mutex->wwm_state) { in ww_mutex_lock_noctx_sig()
524 mutex->wwm_state = WW_OWNED; in ww_mutex_lock_noctx_sig()
525 mutex->wwm_u.owner = curlwp; in ww_mutex_lock_noctx_sig()
528 KASSERTMSG((mutex->wwm_u.owner != curlwp), in ww_mutex_lock_noctx_sig()
529 "locking %p against myself: %p", mutex, curlwp); in ww_mutex_lock_noctx_sig()
530 ret = ww_mutex_state_wait_sig(mutex, WW_OWNED); in ww_mutex_lock_noctx_sig()
537 KASSERT(mutex->wwm_u.ctx != NULL); in ww_mutex_lock_noctx_sig()
538 mutex->wwm_state = WW_WANTOWN; in ww_mutex_lock_noctx_sig()
541 KASSERTMSG((mutex->wwm_u.ctx->wwx_owner != curlwp), in ww_mutex_lock_noctx_sig()
542 "locking %p against myself: %p", mutex, curlwp); in ww_mutex_lock_noctx_sig()
543 ret = ww_mutex_state_wait_sig(mutex, WW_WANTOWN); in ww_mutex_lock_noctx_sig()
551 mutex, (int)mutex->wwm_state); in ww_mutex_lock_noctx_sig()
553 KASSERT(mutex->wwm_state == WW_OWNED); in ww_mutex_lock_noctx_sig()
554 KASSERT(mutex->wwm_u.owner == curlwp); in ww_mutex_lock_noctx_sig()
555 WW_LOCKED(mutex); in ww_mutex_lock_noctx_sig()
557 out: mutex_exit(&mutex->wwm_lock); in ww_mutex_lock_noctx_sig()
578 ww_mutex_lock(struct ww_mutex *mutex, struct ww_acquire_ctx *ctx) in ww_mutex_lock() argument
590 WW_WANTLOCK(mutex); in ww_mutex_lock()
591 ww_mutex_lock_noctx(mutex); in ww_mutex_lock()
600 KASSERTMSG((ctx->wwx_class == mutex->wwm_class), in ww_mutex_lock()
602 ctx, ctx->wwx_class, mutex, mutex->wwm_class); in ww_mutex_lock()
604 mutex_enter(&mutex->wwm_lock); in ww_mutex_lock()
605 ww_acquire_done_check(mutex, ctx); in ww_mutex_lock()
606 retry: switch (mutex->wwm_state) { in ww_mutex_lock()
608 WW_WANTLOCK(mutex); in ww_mutex_lock()
609 mutex->wwm_state = WW_CTX; in ww_mutex_lock()
610 mutex->wwm_u.ctx = ctx; in ww_mutex_lock()
613 WW_WANTLOCK(mutex); in ww_mutex_lock()
614 KASSERTMSG((mutex->wwm_u.owner != curlwp), in ww_mutex_lock()
615 "locking %p against myself: %p", mutex, curlwp); in ww_mutex_lock()
616 ww_mutex_state_wait(mutex, WW_OWNED); in ww_mutex_lock()
621 ww_mutex_state_wait(mutex, WW_WANTOWN); in ww_mutex_lock()
625 mutex, (int)mutex->wwm_state); in ww_mutex_lock()
628 KASSERT(mutex->wwm_state == WW_CTX); in ww_mutex_lock()
629 KASSERT(mutex->wwm_u.ctx != NULL); in ww_mutex_lock()
630 KASSERT((mutex->wwm_u.ctx == ctx) || in ww_mutex_lock()
631 (mutex->wwm_u.ctx->wwx_owner != curlwp)); in ww_mutex_lock()
633 if (mutex->wwm_u.ctx == ctx) { in ww_mutex_lock()
647 WW_WANTLOCK(mutex); in ww_mutex_lock()
649 if (mutex->wwm_u.ctx->wwx_ticket < ctx->wwx_ticket) { in ww_mutex_lock()
654 KASSERTMSG((ctx->wwx_class == mutex->wwm_u.ctx->wwx_class), in ww_mutex_lock()
656 ctx->wwx_class, mutex->wwm_u.ctx->wwx_class); in ww_mutex_lock()
665 ww_mutex_lock_wait(mutex, ctx); in ww_mutex_lock()
667 locked: KASSERT((mutex->wwm_state == WW_CTX) || in ww_mutex_lock()
668 (mutex->wwm_state == WW_WANTOWN)); in ww_mutex_lock()
669 KASSERT(mutex->wwm_u.ctx == ctx); in ww_mutex_lock()
670 WW_LOCKED(mutex); in ww_mutex_lock()
674 mutex_exit(&mutex->wwm_lock); in ww_mutex_lock()
698 ww_mutex_lock_interruptible(struct ww_mutex *mutex, struct ww_acquire_ctx *ctx) in ww_mutex_lock_interruptible() argument
710 WW_WANTLOCK(mutex); in ww_mutex_lock_interruptible()
711 ret = ww_mutex_lock_noctx_sig(mutex); in ww_mutex_lock_interruptible()
720 KASSERTMSG((ctx->wwx_class == mutex->wwm_class), in ww_mutex_lock_interruptible()
722 ctx, ctx->wwx_class, mutex, mutex->wwm_class); in ww_mutex_lock_interruptible()
724 mutex_enter(&mutex->wwm_lock); in ww_mutex_lock_interruptible()
725 ww_acquire_done_check(mutex, ctx); in ww_mutex_lock_interruptible()
726 retry: switch (mutex->wwm_state) { in ww_mutex_lock_interruptible()
728 WW_WANTLOCK(mutex); in ww_mutex_lock_interruptible()
729 mutex->wwm_state = WW_CTX; in ww_mutex_lock_interruptible()
730 mutex->wwm_u.ctx = ctx; in ww_mutex_lock_interruptible()
733 WW_WANTLOCK(mutex); in ww_mutex_lock_interruptible()
734 KASSERTMSG((mutex->wwm_u.owner != curlwp), in ww_mutex_lock_interruptible()
735 "locking %p against myself: %p", mutex, curlwp); in ww_mutex_lock_interruptible()
736 ret = ww_mutex_state_wait_sig(mutex, WW_OWNED); in ww_mutex_lock_interruptible()
745 ret = ww_mutex_state_wait_sig(mutex, WW_WANTOWN); in ww_mutex_lock_interruptible()
753 mutex, (int)mutex->wwm_state); in ww_mutex_lock_interruptible()
756 KASSERT(mutex->wwm_state == WW_CTX); in ww_mutex_lock_interruptible()
757 KASSERT(mutex->wwm_u.ctx != NULL); in ww_mutex_lock_interruptible()
758 KASSERT((mutex->wwm_u.ctx == ctx) || in ww_mutex_lock_interruptible()
759 (mutex->wwm_u.ctx->wwx_owner != curlwp)); in ww_mutex_lock_interruptible()
761 if (mutex->wwm_u.ctx == ctx) { in ww_mutex_lock_interruptible()
775 WW_WANTLOCK(mutex); in ww_mutex_lock_interruptible()
777 if (mutex->wwm_u.ctx->wwx_ticket < ctx->wwx_ticket) { in ww_mutex_lock_interruptible()
782 KASSERTMSG((ctx->wwx_class == mutex->wwm_u.ctx->wwx_class), in ww_mutex_lock_interruptible()
784 ctx->wwx_class, mutex->wwm_u.ctx->wwx_class); in ww_mutex_lock_interruptible()
793 ret = ww_mutex_lock_wait_sig(mutex, ctx); in ww_mutex_lock_interruptible()
799 locked: KASSERT((mutex->wwm_state == WW_CTX) || in ww_mutex_lock_interruptible()
800 (mutex->wwm_state == WW_WANTOWN)); in ww_mutex_lock_interruptible()
801 KASSERT(mutex->wwm_u.ctx == ctx); in ww_mutex_lock_interruptible()
802 WW_LOCKED(mutex); in ww_mutex_lock_interruptible()
806 mutex_exit(&mutex->wwm_lock); in ww_mutex_lock_interruptible()
825 ww_mutex_lock_slow(struct ww_mutex *mutex, struct ww_acquire_ctx *ctx) in ww_mutex_lock_slow() argument
829 WW_WANTLOCK(mutex); in ww_mutex_lock_slow()
833 ww_mutex_lock_noctx(mutex); in ww_mutex_lock_slow()
844 KASSERTMSG((ctx->wwx_class == mutex->wwm_class), in ww_mutex_lock_slow()
846 ctx, ctx->wwx_class, mutex, mutex->wwm_class); in ww_mutex_lock_slow()
848 mutex_enter(&mutex->wwm_lock); in ww_mutex_lock_slow()
849 ww_acquire_done_check(mutex, ctx); in ww_mutex_lock_slow()
850 retry: switch (mutex->wwm_state) { in ww_mutex_lock_slow()
852 mutex->wwm_state = WW_CTX; in ww_mutex_lock_slow()
853 mutex->wwm_u.ctx = ctx; in ww_mutex_lock_slow()
856 KASSERTMSG((mutex->wwm_u.owner != curlwp), in ww_mutex_lock_slow()
857 "locking %p against myself: %p", mutex, curlwp); in ww_mutex_lock_slow()
858 ww_mutex_state_wait(mutex, WW_OWNED); in ww_mutex_lock_slow()
863 ww_mutex_state_wait(mutex, WW_WANTOWN); in ww_mutex_lock_slow()
867 mutex, (int)mutex->wwm_state); in ww_mutex_lock_slow()
870 KASSERT(mutex->wwm_state == WW_CTX); in ww_mutex_lock_slow()
871 KASSERT(mutex->wwm_u.ctx != NULL); in ww_mutex_lock_slow()
872 KASSERTMSG((mutex->wwm_u.ctx->wwx_owner != curlwp), in ww_mutex_lock_slow()
873 "locking %p against myself: %p", mutex, curlwp); in ww_mutex_lock_slow()
879 ww_mutex_lock_wait(mutex, ctx); in ww_mutex_lock_slow()
881 locked: KASSERT((mutex->wwm_state == WW_CTX) || in ww_mutex_lock_slow()
882 (mutex->wwm_state == WW_WANTOWN)); in ww_mutex_lock_slow()
883 KASSERT(mutex->wwm_u.ctx == ctx); in ww_mutex_lock_slow()
884 WW_LOCKED(mutex); in ww_mutex_lock_slow()
886 mutex_exit(&mutex->wwm_lock); in ww_mutex_lock_slow()
901 ww_mutex_lock_slow_interruptible(struct ww_mutex *mutex, in ww_mutex_lock_slow_interruptible() argument
906 WW_WANTLOCK(mutex); in ww_mutex_lock_slow_interruptible()
910 ret = ww_mutex_lock_noctx_sig(mutex); in ww_mutex_lock_slow_interruptible()
922 KASSERTMSG((ctx->wwx_class == mutex->wwm_class), in ww_mutex_lock_slow_interruptible()
924 ctx, ctx->wwx_class, mutex, mutex->wwm_class); in ww_mutex_lock_slow_interruptible()
926 mutex_enter(&mutex->wwm_lock); in ww_mutex_lock_slow_interruptible()
927 ww_acquire_done_check(mutex, ctx); in ww_mutex_lock_slow_interruptible()
928 retry: switch (mutex->wwm_state) { in ww_mutex_lock_slow_interruptible()
930 mutex->wwm_state = WW_CTX; in ww_mutex_lock_slow_interruptible()
931 mutex->wwm_u.ctx = ctx; in ww_mutex_lock_slow_interruptible()
934 KASSERTMSG((mutex->wwm_u.owner != curlwp), in ww_mutex_lock_slow_interruptible()
935 "locking %p against myself: %p", mutex, curlwp); in ww_mutex_lock_slow_interruptible()
936 ret = ww_mutex_state_wait_sig(mutex, WW_OWNED); in ww_mutex_lock_slow_interruptible()
945 ret = ww_mutex_state_wait_sig(mutex, WW_WANTOWN); in ww_mutex_lock_slow_interruptible()
953 mutex, (int)mutex->wwm_state); in ww_mutex_lock_slow_interruptible()
956 KASSERT(mutex->wwm_state == WW_CTX); in ww_mutex_lock_slow_interruptible()
957 KASSERT(mutex->wwm_u.ctx != NULL); in ww_mutex_lock_slow_interruptible()
958 KASSERTMSG((mutex->wwm_u.ctx->wwx_owner != curlwp), in ww_mutex_lock_slow_interruptible()
959 "locking %p against myself: %p", mutex, curlwp); in ww_mutex_lock_slow_interruptible()
965 ret = ww_mutex_lock_wait_sig(mutex, ctx); in ww_mutex_lock_slow_interruptible()
971 locked: KASSERT((mutex->wwm_state == WW_CTX) || in ww_mutex_lock_slow_interruptible()
972 (mutex->wwm_state == WW_WANTOWN)); in ww_mutex_lock_slow_interruptible()
973 KASSERT(mutex->wwm_u.ctx == ctx); in ww_mutex_lock_slow_interruptible()
974 WW_LOCKED(mutex); in ww_mutex_lock_slow_interruptible()
978 mutex_exit(&mutex->wwm_lock); in ww_mutex_lock_slow_interruptible()
990 ww_mutex_trylock(struct ww_mutex *mutex) in ww_mutex_trylock() argument
994 mutex_enter(&mutex->wwm_lock); in ww_mutex_trylock()
995 if (mutex->wwm_state == WW_UNLOCKED) { in ww_mutex_trylock()
996 mutex->wwm_state = WW_OWNED; in ww_mutex_trylock()
997 mutex->wwm_u.owner = curlwp; in ww_mutex_trylock()
998 WW_WANTLOCK(mutex); in ww_mutex_trylock()
999 WW_LOCKED(mutex); in ww_mutex_trylock()
1016 KASSERTMSG(((mutex->wwm_state != WW_OWNED) || in ww_mutex_trylock()
1017 (mutex->wwm_u.owner != curlwp)), in ww_mutex_trylock()
1018 "locking %p against myself: %p", mutex, curlwp); in ww_mutex_trylock()
1019 KASSERTMSG(((mutex->wwm_state != WW_CTX) || in ww_mutex_trylock()
1020 (mutex->wwm_u.ctx->wwx_owner != curlwp)), in ww_mutex_trylock()
1021 "locking %p against myself: %p", mutex, curlwp); in ww_mutex_trylock()
1023 KASSERTMSG(((mutex->wwm_state != WW_WANTOWN) || in ww_mutex_trylock()
1024 (mutex->wwm_u.ctx->wwx_owner != curlwp)), in ww_mutex_trylock()
1025 "locking %p against myself: %p", mutex, curlwp); in ww_mutex_trylock()
1028 mutex_exit(&mutex->wwm_lock); in ww_mutex_trylock()
1045 ww_mutex_unlock_release(struct ww_mutex *mutex) in ww_mutex_unlock_release() argument
1048 KASSERT(mutex_owned(&mutex->wwm_lock)); in ww_mutex_unlock_release()
1049 KASSERT((mutex->wwm_state == WW_CTX) || in ww_mutex_unlock_release()
1050 (mutex->wwm_state == WW_WANTOWN)); in ww_mutex_unlock_release()
1051 KASSERT(mutex->wwm_u.ctx != NULL); in ww_mutex_unlock_release()
1052 KASSERTMSG((mutex->wwm_u.ctx->wwx_owner == curlwp), in ww_mutex_unlock_release()
1054 mutex, mutex->wwm_u.ctx, mutex->wwm_u.ctx->wwx_owner, in ww_mutex_unlock_release()
1056 KASSERT(mutex->wwm_u.ctx->wwx_acquired != ~0U); in ww_mutex_unlock_release()
1057 mutex->wwm_u.ctx->wwx_acquired--; in ww_mutex_unlock_release()
1058 mutex->wwm_u.ctx = NULL; in ww_mutex_unlock_release()
1067 ww_mutex_unlock(struct ww_mutex *mutex) in ww_mutex_unlock() argument
1071 mutex_enter(&mutex->wwm_lock); in ww_mutex_unlock()
1072 WW_UNLOCKED(mutex); in ww_mutex_unlock()
1073 KASSERTMSG(mutex->wwm_state != WW_UNLOCKED, "mutex %p", mutex); in ww_mutex_unlock()
1074 switch (mutex->wwm_state) { in ww_mutex_unlock()
1076 panic("unlocking unlocked wait/wound mutex: %p", mutex); in ww_mutex_unlock()
1079 mutex->wwm_u.owner = NULL; in ww_mutex_unlock()
1080 mutex->wwm_state = WW_UNLOCKED; in ww_mutex_unlock()
1083 ww_mutex_unlock_release(mutex); in ww_mutex_unlock()
1089 if ((ctx = RB_TREE_MIN(&mutex->wwm_waiters)) != NULL) { in ww_mutex_unlock()
1090 mutex->wwm_state = WW_CTX; in ww_mutex_unlock()
1091 mutex->wwm_u.ctx = ctx; in ww_mutex_unlock()
1093 mutex->wwm_state = WW_UNLOCKED; in ww_mutex_unlock()
1097 ww_mutex_unlock_release(mutex); in ww_mutex_unlock()
1099 mutex->wwm_state = WW_UNLOCKED; in ww_mutex_unlock()
1102 cv_broadcast(&mutex->wwm_cv); in ww_mutex_unlock()
1103 mutex_exit(&mutex->wwm_lock); in ww_mutex_unlock()
1113 ww_mutex_locking_ctx(struct ww_mutex *mutex) in ww_mutex_locking_ctx() argument
1117 mutex_enter(&mutex->wwm_lock); in ww_mutex_locking_ctx()
1118 switch (mutex->wwm_state) { in ww_mutex_locking_ctx()
1125 ctx = mutex->wwm_u.ctx; in ww_mutex_locking_ctx()
1129 mutex, (int)mutex->wwm_state); in ww_mutex_locking_ctx()
1131 mutex_exit(&mutex->wwm_lock); in ww_mutex_locking_ctx()