summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_umtx.c
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2006-09-02 02:41:33 +0000
committerdavidxu <davidxu@FreeBSD.org>2006-09-02 02:41:33 +0000
commitf41d0bcd975ac6d528d80a76bf336343c34a830c (patch)
tree1e35c5959e14f1da4105b51b76aeee98043ec3b0 /sys/kern/kern_umtx.c
parent587bff4653dfd2311fe06e95a1880ad4b67111b7 (diff)
downloadFreeBSD-src-f41d0bcd975ac6d528d80a76bf336343c34a830c.zip
FreeBSD-src-f41d0bcd975ac6d528d80a76bf336343c34a830c.tar.gz
Make sure we get new m_owner value if we can not unlock it in
uncontested case. Reorder statements in do_unlock_umutex.
Diffstat (limited to 'sys/kern/kern_umtx.c')
-rw-r--r--sys/kern/kern_umtx.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c
index d2c6334..2c41fe0 100644
--- a/sys/kern/kern_umtx.c
+++ b/sys/kern/kern_umtx.c
@@ -681,6 +681,7 @@ do_unlock(struct thread *td, struct umtx *umtx, uintptr_t id)
return (EFAULT);
if (old == owner)
return (0);
+ owner = old;
}
/* We should only ever be in here for contested locks */
@@ -965,6 +966,7 @@ do_unlock_normal(struct thread *td, struct umutex *m, uint32_t flags)
return (EFAULT);
if (old == owner)
return (0);
+ owner = old;
}
/* We should only ever be in here for contested locks */
@@ -1595,6 +1597,7 @@ do_unlock_pi(struct thread *td, struct umutex *m, uint32_t flags)
return (EFAULT);
if (old == owner)
return (0);
+ owner = old;
}
/* We should only ever be in here for contested locks */
@@ -2005,20 +2008,21 @@ static int
do_unlock_umutex(struct thread *td, struct umutex *m)
{
uint32_t flags;
- int ret;
flags = fuword32(&m->m_flags);
if (flags == -1)
return (EFAULT);
- if ((flags & UMUTEX_PRIO_INHERIT) != 0)
- ret = do_unlock_pi(td, m, flags);
- else if ((flags & UMUTEX_PRIO_PROTECT) != 0)
- ret = do_unlock_pp(td, m, flags);
- else
- ret = do_unlock_normal(td, m, flags);
+ switch(flags & (UMUTEX_PRIO_INHERIT | UMUTEX_PRIO_PROTECT)) {
+ case 0:
+ return (do_unlock_normal(td, m, flags));
+ case UMUTEX_PRIO_INHERIT:
+ return (do_unlock_pi(td, m, flags));
+ case UMUTEX_PRIO_PROTECT:
+ return (do_unlock_pp(td, m, flags));
+ }
- return (ret);
+ return (EINVAL);
}
int
OpenPOWER on IntegriCloud