]> git.itanic.dy.fi Git - linux-stable/commitdiff
futex: abstract out a __futex_wake_mark() helper
authorJens Axboe <axboe@kernel.dk>
Wed, 12 Jul 2023 15:14:52 +0000 (09:14 -0600)
committerJens Axboe <axboe@kernel.dk>
Fri, 29 Sep 2023 08:36:54 +0000 (02:36 -0600)
Move the unqueue and lock_ptr clear into a helper that futex_wake_mark()
calls. Add it to the public functions as well, in preparation for using
it outside the core futex code.

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

index 547f509b2c87670fd84843ec87a64ffd7953d970..33835b81e0c39f3b9147744f4e2008fc3ce6145c 100644 (file)
@@ -219,6 +219,7 @@ extern int futex_wait_setup(u32 __user *uaddr, u32 val, unsigned int flags,
                            struct futex_q *q, struct futex_hash_bucket **hb);
 extern void futex_wait_queue(struct futex_hash_bucket *hb, struct futex_q *q,
                                   struct hrtimer_sleeper *timeout);
+extern bool __futex_wake_mark(struct futex_q *q);
 extern void futex_wake_mark(struct wake_q_head *wake_q, struct futex_q *q);
 
 extern int fault_in_user_writeable(u32 __user *uaddr);
index 35c6a637a4bb61bb55f86fd6c196680732fc3e4b..6fcf5f7237199f2e9f217c1f37d5faab5cd4f4c5 100644 (file)
  * double_lock_hb() and double_unlock_hb(), respectively.
  */
 
-/*
- * The hash bucket lock must be held when this is called.
- * Afterwards, the futex_q must not be accessed. Callers
- * must ensure to later call wake_up_q() for the actual
- * wakeups to occur.
- */
-void futex_wake_mark(struct wake_q_head *wake_q, struct futex_q *q)
+bool __futex_wake_mark(struct futex_q *q)
 {
-       struct task_struct *p = q->task;
-
        if (WARN(q->pi_state || q->rt_waiter, "refusing to wake PI futex\n"))
-               return;
+               return false;
 
-       get_task_struct(p);
        __futex_unqueue(q);
        /*
         * The waiting task can free the futex_q as soon as q->lock_ptr = NULL
@@ -130,6 +121,26 @@ void futex_wake_mark(struct wake_q_head *wake_q, struct futex_q *q)
         */
        smp_store_release(&q->lock_ptr, NULL);
 
+       return true;
+}
+
+/*
+ * The hash bucket lock must be held when this is called.
+ * Afterwards, the futex_q must not be accessed. Callers
+ * must ensure to later call wake_up_q() for the actual
+ * wakeups to occur.
+ */
+void futex_wake_mark(struct wake_q_head *wake_q, struct futex_q *q)
+{
+       struct task_struct *p = q->task;
+
+       get_task_struct(p);
+
+       if (!__futex_wake_mark(q)) {
+               put_task_struct(p);
+               return;
+       }
+
        /*
         * Queue the task for later wakeup for after we've released
         * the hb->lock.