summaryrefslogtreecommitdiff
path: root/kernel/futex/syscalls.c
diff options
context:
space:
mode:
authorpeterz@infradead.org <peterz@infradead.org>2023-09-21 12:45:08 +0200
committerPeter Zijlstra <peterz@infradead.org>2023-09-21 19:22:05 +0200
commit5694289ce183bc3336407a78c8c722a0b9208f9b (patch)
tree120c032a905fab3131cd305ce290f01c342cdb85 /kernel/futex/syscalls.c
parentd6d08d24790e82c69a46ef78ae44fe1b1ed30775 (diff)
futex: Flag conversion
Futex has 3 sets of flags: - legacy futex op bits - futex2 flags - internal flags Add a few helpers to convert from the API flags into the internal flags. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: André Almeida <andrealmeid@igalia.com> Link: https://lore.kernel.org/r/20230921105247.722140574@noisy.programming.kicks-ass.net
Diffstat (limited to 'kernel/futex/syscalls.c')
-rw-r--r--kernel/futex/syscalls.c24
1 files changed, 9 insertions, 15 deletions
diff --git a/kernel/futex/syscalls.c b/kernel/futex/syscalls.c
index 953f0a49de3a..948ac247c1c6 100644
--- a/kernel/futex/syscalls.c
+++ b/kernel/futex/syscalls.c
@@ -1,6 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-or-later
-#include <linux/compat.h>
#include <linux/syscalls.h>
#include <linux/time_namespace.h>
@@ -85,15 +84,12 @@ err_unlock:
long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout,
u32 __user *uaddr2, u32 val2, u32 val3)
{
+ unsigned int flags = futex_to_flags(op);
int cmd = op & FUTEX_CMD_MASK;
- unsigned int flags = 0;
- if (!(op & FUTEX_PRIVATE_FLAG))
- flags |= FLAGS_SHARED;
-
- if (op & FUTEX_CLOCK_REALTIME) {
- flags |= FLAGS_CLOCKRT;
- if (cmd != FUTEX_WAIT_BITSET && cmd != FUTEX_WAIT_REQUEUE_PI &&
+ if (flags & FLAGS_CLOCKRT) {
+ if (cmd != FUTEX_WAIT_BITSET &&
+ cmd != FUTEX_WAIT_REQUEUE_PI &&
cmd != FUTEX_LOCK_PI2)
return -ENOSYS;
}
@@ -201,21 +197,19 @@ static int futex_parse_waitv(struct futex_vector *futexv,
unsigned int i;
for (i = 0; i < nr_futexes; i++) {
+ unsigned int flags;
+
if (copy_from_user(&aux, &uwaitv[i], sizeof(aux)))
return -EFAULT;
if ((aux.flags & ~FUTEX2_VALID_MASK) || aux.__reserved)
return -EINVAL;
- if (!IS_ENABLED(CONFIG_64BIT) || in_compat_syscall()) {
- if ((aux.flags & FUTEX2_SIZE_MASK) == FUTEX2_SIZE_U64)
- return -EINVAL;
- }
-
- if ((aux.flags & FUTEX2_SIZE_MASK) != FUTEX2_SIZE_U32)
+ flags = futex2_to_flags(aux.flags);
+ if (!futex_flags_valid(flags))
return -EINVAL;
- futexv[i].w.flags = aux.flags;
+ futexv[i].w.flags = flags;
futexv[i].w.val = aux.val;
futexv[i].w.uaddr = aux.uaddr;
futexv[i].q = futex_q_init;