summaryrefslogtreecommitdiffstats
path: root/kernel/futex/futex.h
diff options
context:
space:
mode:
authorPeter Zijlstra <peterz@infradead.org>2021-09-23 14:11:03 -0300
committerPeter Zijlstra <peterz@infradead.org>2021-10-07 13:51:11 +0200
commita046f1a0d3e320cfee6bdac336416a537f49e7c6 (patch)
tree4c85470dd86fbff5e7f29105fa907f9a0d2b6803 /kernel/futex/futex.h
parente5c6828493b5fa6a3c4606b43e80ab6c5ec1111f (diff)
downloadlinux-stable-a046f1a0d3e320cfee6bdac336416a537f49e7c6.tar.gz
linux-stable-a046f1a0d3e320cfee6bdac336416a537f49e7c6.tar.bz2
linux-stable-a046f1a0d3e320cfee6bdac336416a537f49e7c6.zip
futex: Split out wait/wake
Move the wait/wake bits into their own file. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: André Almeida <andrealmeid@collabora.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: André Almeida <andrealmeid@collabora.com> Link: https://lore.kernel.org/r/20210923171111.300673-15-andrealmeid@collabora.com
Diffstat (limited to 'kernel/futex/futex.h')
-rw-r--r--kernel/futex/futex.h34
1 files changed, 34 insertions, 0 deletions
diff --git a/kernel/futex/futex.h b/kernel/futex/futex.h
index 840302aefdfc..fe847f57dad5 100644
--- a/kernel/futex/futex.h
+++ b/kernel/futex/futex.h
@@ -154,6 +154,27 @@ extern struct futex_q *futex_top_waiter(struct futex_hash_bucket *hb, union fute
extern void __futex_unqueue(struct futex_q *q);
extern void __futex_queue(struct futex_q *q, struct futex_hash_bucket *hb);
+extern int futex_unqueue(struct futex_q *q);
+
+/**
+ * futex_queue() - Enqueue the futex_q on the futex_hash_bucket
+ * @q: The futex_q to enqueue
+ * @hb: The destination hash bucket
+ *
+ * The hb->lock must be held by the caller, and is released here. A call to
+ * futex_queue() is typically paired with exactly one call to futex_unqueue(). The
+ * exceptions involve the PI related operations, which may use futex_unqueue_pi()
+ * or nothing if the unqueue is done as part of the wake process and the unqueue
+ * state is implicit in the state of woken task (see futex_wait_requeue_pi() for
+ * an example).
+ */
+static inline void futex_queue(struct futex_q *q, struct futex_hash_bucket *hb)
+ __releases(&hb->lock)
+{
+ __futex_queue(q, hb);
+ spin_unlock(&hb->lock);
+}
+
extern void futex_unqueue_pi(struct futex_q *q);
extern void wait_for_owner_exiting(int ret, struct task_struct *exiting);
@@ -183,6 +204,19 @@ static inline void futex_hb_waiters_dec(struct futex_hash_bucket *hb)
#endif
}
+static inline int futex_hb_waiters_pending(struct futex_hash_bucket *hb)
+{
+#ifdef CONFIG_SMP
+ /*
+ * Full barrier (B), see the ordering comment above.
+ */
+ smp_mb();
+ return atomic_read(&hb->waiters);
+#else
+ return 1;
+#endif
+}
+
extern struct futex_hash_bucket *futex_q_lock(struct futex_q *q);
extern void futex_q_unlock(struct futex_hash_bucket *hb);