Lines Matching defs:upimutex

531 static struct upimutex *
534 struct upimutex *upip;
546 upi_chain_add(upib_t *upibp, struct upimutex *upimutex)
551 * Insert upimutex at front of list. Maybe a bit unfair
556 upimutex->upi_nextchain = upibp->upib_first;
557 upibp->upib_first = upimutex;
561 upi_chain_del(upib_t *upibp, struct upimutex *upimutex)
563 struct upimutex **prev;
568 while (*prev != upimutex) {
571 *prev = upimutex->upi_nextchain;
572 upimutex->upi_nextchain = NULL;
576 * Add upimutex to chain of upimutexes held by curthread.
580 upi_mylist_add(struct upimutex *upimutex)
585 * Insert upimutex at front of list of upimutexes owned by t. This
589 upimutex->upi_nextowned = t->t_upimutex;
590 t->t_upimutex = upimutex;
597 * Delete upimutex from list of upimutexes owned by curthread.
600 upi_mylist_del(struct upimutex *upimutex)
603 struct upimutex **prev;
611 while (*prev != upimutex) {
614 *prev = upimutex->upi_nextowned;
615 upimutex->upi_nextowned = NULL;
621 * Returns true if upimutex is owned. Should be called only when upim points
633 static struct upimutex *
638 struct upimutex *upimutex;
646 upimutex = upi_get(upibp, &lwpchan);
647 if (upimutex == NULL || upimutex->upi_owner != curthread) {
652 return (upimutex);
656 * Unlocks upimutex, waking up waiters if any. upimutex kmem is freed if
660 upimutex_unlock(struct upimutex *upimutex, uint16_t flag)
666 upi_mylist_del(upimutex);
667 upibp = upimutex->upi_upibp;
669 if (upimutex->upi_waiter != 0) { /* if waiters */
670 ts = turnstile_lookup(upimutex);
674 upimutex->upi_owner = newowner;
676 upimutex->upi_waiter = 0;
686 * interrupted. No need to clear the w bit (upimutex
690 turnstile_exit(upimutex);
697 * de-allocate kernel memory (upimutex).
699 upi_chain_del(upimutex->upi_upibp, upimutex);
701 kmem_free(upimutex, sizeof (upimutex_t));
712 volatile struct upimutex *upimutex = NULL;
719 upimutex_unlock((upimutex_t *)upimutex, 0);
731 upimutex = upi_get(upibp, &lwpchan);
732 if (upimutex == NULL) {
733 /* lock available since lwpchan has no upimutex */
734 upimutex = kmem_zalloc(sizeof (upimutex_t), KM_SLEEP);
735 upi_chain_add(upibp, (upimutex_t *)upimutex);
736 upimutex->upi_owner = curthread; /* grab lock */
737 upimutex->upi_upibp = upibp;
738 upimutex->upi_vaddr = lp;
739 upimutex->upi_lwpchan = lwpchan;
741 nupinest = upi_mylist_add((upimutex_t *)upimutex);
746 upimutex_unlock((upimutex_t *)upimutex, flag);
759 upimutex_unlock((upimutex_t *)upimutex, flag);
773 * If a upimutex object exists, it must have an owner.
774 * This is due to lock hand-off, and release of upimutex when no
777 ASSERT(upimutex->upi_owner != NULL);
778 if (upimutex->upi_owner == curthread) {
821 * is acquired. Say, the upimutex is L:
843 ts = turnstile_lookup((upimutex_t *)upimutex);
844 upimutex->upi_waiter = 1;
845 error = turnstile_block(ts, TS_WRITER_Q, (upimutex_t *)upimutex,
858 (upimutex = lwp_upimutex_owned(lp, type))) {
863 (void) upi_mylist_add((upimutex_t *)upimutex);
864 upimutex_unlock((upimutex_t *)upimutex, 0);
867 * The only other possible error is EDEADLK. If so, upimutex
871 (error == EDEADLK && !upi_owned((upimutex_t *)upimutex)));
876 ASSERT(lwp_upimutex_owned(lp, type) == upimutex);
877 nupinest = upi_mylist_add((upimutex_t *)upimutex);
893 * If the upimutex is locked here, the flag's LOCK_OWNERDEAD
895 * appropriately. If the upimutex is not locked here, this
910 upimutex_unlock((upimutex_t *)upimutex, flag);
923 * Wake-up without the upimutex held. Either this is a
978 volatile struct upimutex *upimutex = NULL;
983 upimutex_unlock((upimutex_t *)upimutex, 0);
994 upimutex = upi_get(upibp, &lwpchan);
1000 if (upimutex == NULL || upimutex->upi_owner != curthread) {
1017 upimutex_unlock((upimutex_t *)upimutex, flag);
1071 * Mark user mutex state, corresponding to kernel upimutex,
1096 * For each upimutex, attempt to mark its corresponding user mutex object as
1105 struct upimutex *upip;
1110 * If the user object associated with this upimutex is
1111 * unmapped, unlock upimutex with the
1124 * Unlock the upimutex: if no waiters, upip kmem will
1130 * it will find the upimutex has no waiters. So,
1137 * upimutex from the t_upimutexes chain. And so the
1707 if (error) { /* if the upimutex unlock failed */
2869 volatile struct upimutex *upimutex = NULL;
2882 upimutex_unlock((upimutex_t *)upimutex, 0);
2895 upimutex = upi_get(upibp, &lwpchan);
2896 if (upimutex == NULL || upimutex->upi_owner != curthread) {
2904 upimutex_unlock((upimutex_t *)upimutex, flag);