summaryrefslogtreecommitdiff
path: root/kernel/futex
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/futex')
-rw-r--r--kernel/futex/futex.h21
-rw-r--r--kernel/futex/syscalls.c2
-rw-r--r--kernel/futex/waitwake.c3
3 files changed, 15 insertions, 11 deletions
diff --git a/kernel/futex/futex.h b/kernel/futex/futex.h
index a3f1fceafcbe..0e7821a944a2 100644
--- a/kernel/futex/futex.h
+++ b/kernel/futex/futex.h
@@ -17,25 +17,26 @@
* Futex flags used to encode options to functions and preserve them across
* restarts.
*/
-#define FLAGS_SIZE_8 0x00
-#define FLAGS_SIZE_16 0x01
-#define FLAGS_SIZE_32 0x02
-#define FLAGS_SIZE_64 0x03
+#define FLAGS_SIZE_8 0x0000
+#define FLAGS_SIZE_16 0x0001
+#define FLAGS_SIZE_32 0x0002
+#define FLAGS_SIZE_64 0x0003
-#define FLAGS_SIZE_MASK 0x03
+#define FLAGS_SIZE_MASK 0x0003
#ifdef CONFIG_MMU
-# define FLAGS_SHARED 0x10
+# define FLAGS_SHARED 0x0010
#else
/*
* NOMMU does not have per process address space. Let the compiler optimize
* code away.
*/
-# define FLAGS_SHARED 0x00
+# define FLAGS_SHARED 0x0000
#endif
-#define FLAGS_CLOCKRT 0x20
-#define FLAGS_HAS_TIMEOUT 0x40
-#define FLAGS_NUMA 0x80
+#define FLAGS_CLOCKRT 0x0020
+#define FLAGS_HAS_TIMEOUT 0x0040
+#define FLAGS_NUMA 0x0080
+#define FLAGS_STRICT 0x0100
/* FUTEX_ to FLAGS_ */
static inline unsigned int futex_to_flags(unsigned int op)
diff --git a/kernel/futex/syscalls.c b/kernel/futex/syscalls.c
index 7049a52ef68e..47398926765e 100644
--- a/kernel/futex/syscalls.c
+++ b/kernel/futex/syscalls.c
@@ -333,7 +333,7 @@ SYSCALL_DEFINE4(futex_wake,
if (!futex_validate_input(flags, mask))
return -EINVAL;
- return futex_wake(uaddr, flags, nr, mask);
+ return futex_wake(uaddr, FLAGS_STRICT | flags, nr, mask);
}
#ifdef CONFIG_COMPAT
diff --git a/kernel/futex/waitwake.c b/kernel/futex/waitwake.c
index fa9757766103..ceb05b876597 100644
--- a/kernel/futex/waitwake.c
+++ b/kernel/futex/waitwake.c
@@ -155,6 +155,9 @@ int futex_wake(u32 __user *uaddr, unsigned int flags, int nr_wake, u32 bitset)
if (unlikely(ret != 0))
return ret;
+ if ((flags & FLAGS_STRICT) && !nr_wake)
+ return 0;
+
hb = futex_hash(&key);
/* Make sure we really have tasks to wakeup */