summaryrefslogtreecommitdiff
path: root/sys/compat/linux
diff options
context:
space:
mode:
authorPaul Irofti <pirofti@cvs.openbsd.org>2012-06-19 08:43:33 +0000
committerPaul Irofti <pirofti@cvs.openbsd.org>2012-06-19 08:43:33 +0000
commit17c221473445e1c1381377f677a95ceec5bd28c6 (patch)
treee8361427ef1374484a7a1c1d7923765c51f29e25 /sys/compat/linux
parent2044233657f37a4afa1297758d9e8053e0e7d57e (diff)
Change the pool_get() flags from WAITOK to NOWAIT.
This avoids a potential lost-wakeup as pointed out by guenther@. Now the futex is locked all through the process and EAGAIN is returned on failure. Makes sense to guenther@.
Diffstat (limited to 'sys/compat/linux')
-rw-r--r--sys/compat/linux/linux_futex.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/sys/compat/linux/linux_futex.c b/sys/compat/linux/linux_futex.c
index 20a9b224d5f..b16d4c801aa 100644
--- a/sys/compat/linux/linux_futex.c
+++ b/sys/compat/linux/linux_futex.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: linux_futex.c,v 1.2 2012/06/16 11:47:24 pirofti Exp $ */
+/* $OpenBSD: linux_futex.c,v 1.3 2012/06/19 08:43:32 pirofti Exp $ */
/* $NetBSD: linux_futex.c,v 1.26 2010/07/07 01:30:35 chs Exp $ */
/*-
@@ -203,9 +203,13 @@ linux_do_futex(struct proc *p, const struct linux_sys_futex_args *uap,
if (SCARG(uap, timeout) != NULL && timeout_hz == 0)
timeout_hz = 1;
- mtx_leave(&futex_lock);
- wp = pool_get(&futex_wp_pool, PR_WAITOK);
- mtx_enter(&futex_lock);
+ wp = pool_get(&futex_wp_pool, PR_NOWAIT);
+ if (wp == NULL) {
+ DPRINTF(("FUTEX_WAIT %d: Couldn't fetch a new wp from"
+ "futex_wp_pool.\n", tid));
+ mtx_leave(&futex_lock);
+ return EAGAIN;
+ }
f = futex_get(SCARG(uap, uaddr));
ret = futex_sleep(&f, p, timeout_hz, wp);