]> git.itanic.dy.fi Git - linux-stable/commitdiff
futex: make futex_parse_waitv() available as a helper
authorJens Axboe <axboe@kernel.dk>
Tue, 13 Jun 2023 14:31:58 +0000 (08:31 -0600)
committerJens Axboe <axboe@kernel.dk>
Fri, 29 Sep 2023 08:37:05 +0000 (02:37 -0600)
To make it more generically useful, augment it with allowing the caller
to pass in the wake handler and wake data. Convert the futex_waitv()
syscall, passing in the default handlers.

Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
kernel/futex/futex.h
kernel/futex/syscalls.c

index 76f6c2e0f539e381383b96f88ac2cf136f647110..6b6a6b3da103c7465e6515baecfcf52fffbf7510 100644 (file)
@@ -361,6 +361,11 @@ struct futex_vector {
        struct futex_q q;
 };
 
+extern int futex_parse_waitv(struct futex_vector *futexv,
+                            struct futex_waitv __user *uwaitv,
+                            unsigned int nr_futexes, futex_wake_fn *wake,
+                            void *wake_data);
+
 extern int futex_wait_multiple(struct futex_vector *vs, unsigned int count,
                               struct hrtimer_sleeper *to);
 
index 2b5cafdfdc503b0b248ee5f1c4f1cf1d3ddf76d3..4b6da9116aa6c33db9796e3055ce0c90b02d7b91 100644 (file)
@@ -184,12 +184,15 @@ SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val,
  * @futexv:    Kernel side list of waiters to be filled
  * @uwaitv:     Userspace list to be parsed
  * @nr_futexes: Length of futexv
+ * @wake:      Wake to call when futex is woken
+ * @wake_data: Data for the wake handler
  *
  * Return: Error code on failure, 0 on success
  */
-static int futex_parse_waitv(struct futex_vector *futexv,
-                            struct futex_waitv __user *uwaitv,
-                            unsigned int nr_futexes)
+int futex_parse_waitv(struct futex_vector *futexv,
+                     struct futex_waitv __user *uwaitv,
+                     unsigned int nr_futexes, futex_wake_fn *wake,
+                     void *wake_data)
 {
        struct futex_waitv aux;
        unsigned int i;
@@ -214,6 +217,8 @@ static int futex_parse_waitv(struct futex_vector *futexv,
                futexv[i].w.val = aux.val;
                futexv[i].w.uaddr = aux.uaddr;
                futexv[i].q = futex_q_init;
+               futexv[i].q.wake = wake;
+               futexv[i].q.wake_data = wake_data;
        }
 
        return 0;
@@ -306,7 +311,8 @@ SYSCALL_DEFINE5(futex_waitv, struct futex_waitv __user *, waiters,
                goto destroy_timer;
        }
 
-       ret = futex_parse_waitv(futexv, waiters, nr_futexes);
+       ret = futex_parse_waitv(futexv, waiters, nr_futexes, futex_wake_mark,
+                               NULL);
        if (!ret)
                ret = futex_wait_multiple(futexv, nr_futexes, timeout ? &to : NULL);
 
@@ -421,7 +427,7 @@ SYSCALL_DEFINE4(futex_requeue,
        if (!waiters)
                return -EINVAL;
 
-       ret = futex_parse_waitv(futexes, waiters, 2);
+       ret = futex_parse_waitv(futexes, waiters, 2, futex_wake_mark, NULL);
        if (ret)
                return ret;