Lines Matching defs:upimutex

532 static struct upimutex *
535 struct upimutex *upip;
547 upi_chain_add(upib_t *upibp, struct upimutex *upimutex)
552 * Insert upimutex at front of list. Maybe a bit unfair
557 upimutex->upi_nextchain = upibp->upib_first;
558 upibp->upib_first = upimutex;
562 upi_chain_del(upib_t *upibp, struct upimutex *upimutex)
564 struct upimutex **prev;
569 while (*prev != upimutex) {
572 *prev = upimutex->upi_nextchain;
573 upimutex->upi_nextchain = NULL;
577 * Add upimutex to chain of upimutexes held by curthread.
581 upi_mylist_add(struct upimutex *upimutex)
586 * Insert upimutex at front of list of upimutexes owned by t. This
590 upimutex->upi_nextowned = t->t_upimutex;
591 t->t_upimutex = upimutex;
598 * Delete upimutex from list of upimutexes owned by curthread.
601 upi_mylist_del(struct upimutex *upimutex)
604 struct upimutex **prev;
612 while (*prev != upimutex) {
615 *prev = upimutex->upi_nextowned;
616 upimutex->upi_nextowned = NULL;
622 * Returns true if upimutex is owned. Should be called only when upim points
634 static struct upimutex *
639 struct upimutex *upimutex;
647 upimutex = upi_get(upibp, &lwpchan);
648 if (upimutex == NULL || upimutex->upi_owner != curthread) {
653 return (upimutex);
657 * Unlocks upimutex, waking up waiters if any. upimutex kmem is freed if
661 upimutex_unlock(struct upimutex *upimutex, uint16_t flag)
667 upi_mylist_del(upimutex);
668 upibp = upimutex->upi_upibp;
670 if (upimutex->upi_waiter != 0) { /* if waiters */
671 ts = turnstile_lookup(upimutex);
675 upimutex->upi_owner = newowner;
677 upimutex->upi_waiter = 0;
687 * interrupted. No need to clear the w bit (upimutex
691 turnstile_exit(upimutex);
698 * de-allocate kernel memory (upimutex).
700 upi_chain_del(upimutex->upi_upibp, upimutex);
702 kmem_free(upimutex, sizeof (upimutex_t));
713 volatile struct upimutex *upimutex = NULL;
720 upimutex_unlock((upimutex_t *)upimutex, 0);
732 upimutex = upi_get(upibp, &lwpchan);
733 if (upimutex == NULL) {
734 /* lock available since lwpchan has no upimutex */
735 upimutex = kmem_zalloc(sizeof (upimutex_t), KM_SLEEP);
736 upi_chain_add(upibp, (upimutex_t *)upimutex);
737 upimutex->upi_owner = curthread; /* grab lock */
738 upimutex->upi_upibp = upibp;
739 upimutex->upi_vaddr = lp;
740 upimutex->upi_lwpchan = lwpchan;
742 nupinest = upi_mylist_add((upimutex_t *)upimutex);
747 upimutex_unlock((upimutex_t *)upimutex, flag);
760 upimutex_unlock((upimutex_t *)upimutex, flag);
774 * If a upimutex object exists, it must have an owner.
775 * This is due to lock hand-off, and release of upimutex when no
778 ASSERT(upimutex->upi_owner != NULL);
779 if (upimutex->upi_owner == curthread) {
822 * is acquired. Say, the upimutex is L:
844 ts = turnstile_lookup((upimutex_t *)upimutex);
845 upimutex->upi_waiter = 1;
846 error = turnstile_block(ts, TS_WRITER_Q, (upimutex_t *)upimutex,
859 (upimutex = lwp_upimutex_owned(lp, type))) {
864 (void) upi_mylist_add((upimutex_t *)upimutex);
865 upimutex_unlock((upimutex_t *)upimutex, 0);
868 * The only other possible error is EDEADLK. If so, upimutex
872 (error == EDEADLK && !upi_owned((upimutex_t *)upimutex)));
877 ASSERT(lwp_upimutex_owned(lp, type) == upimutex);
878 nupinest = upi_mylist_add((upimutex_t *)upimutex);
894 * If the upimutex is locked here, the flag's LOCK_OWNERDEAD
896 * appropriately. If the upimutex is not locked here, this
911 upimutex_unlock((upimutex_t *)upimutex, flag);
924 * Wake-up without the upimutex held. Either this is a
979 volatile struct upimutex *upimutex = NULL;
984 upimutex_unlock((upimutex_t *)upimutex, 0);
995 upimutex = upi_get(upibp, &lwpchan);
1001 if (upimutex == NULL || upimutex->upi_owner != curthread) {
1018 upimutex_unlock((upimutex_t *)upimutex, flag);
1075 * Mark user mutex state, corresponding to kernel upimutex,
1100 * For each upimutex, attempt to mark its corresponding user mutex object as
1109 struct upimutex *upip;
1114 * If the user object associated with this upimutex is
1115 * unmapped, unlock upimutex with the
1128 * Unlock the upimutex: if no waiters, upip kmem will
1134 * it will find the upimutex has no waiters. So,
1141 * upimutex from the t_upimutexes chain. And so the
1723 if (error) { /* if the upimutex unlock failed */
2885 volatile struct upimutex *upimutex = NULL;
2898 upimutex_unlock((upimutex_t *)upimutex, 0);
2911 upimutex = upi_get(upibp, &lwpchan);
2912 if (upimutex == NULL || upimutex->upi_owner != curthread) {
2920 upimutex_unlock((upimutex_t *)upimutex, flag);