io_uring: introduce llist helpers
authorDylan Yudaken <dylany@fb.com>
Wed, 22 Jun 2022 13:40:24 +0000 (06:40 -0700)
committerJens Axboe <axboe@kernel.dk>
Mon, 25 Jul 2022 00:39:15 +0000 (18:39 -0600)
Introduce helpers to atomically switch llist.

Will later move this into common code

Signed-off-by: Dylan Yudaken <dylany@fb.com>
Link: https://lore.kernel.org/r/20220622134028.2013417-5-dylany@fb.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/io_uring.c

index 0124335c6d092ab156f95f674c5767acbfead9f9..356000255211fbe2e8417bf8d1ea5f129ca56bf8 100644 (file)
@@ -1009,6 +1009,36 @@ static void handle_tw_list(struct llist_node *node,
        } while (node);
 }
 
+/**
+ * io_llist_xchg - swap all entries in a lock-less list
+ * @head:      the head of lock-less list to delete all entries
+ * @new:       new entry as the head of the list
+ *
+ * If list is empty, return NULL, otherwise, return the pointer to the first entry.
+ * The order of entries returned is from the newest to the oldest added one.
+ */
+static inline struct llist_node *io_llist_xchg(struct llist_head *head,
+                                              struct llist_node *new)
+{
+       return xchg(&head->first, new);
+}
+
+/**
+ * io_llist_cmpxchg - possibly swap all entries in a lock-less list
+ * @head:      the head of lock-less list to delete all entries
+ * @old:       expected old value of the first entry of the list
+ * @new:       new entry as the head of the list
+ *
+ * perform a cmpxchg on the first entry of the list.
+ */
+
+static inline struct llist_node *io_llist_cmpxchg(struct llist_head *head,
+                                                 struct llist_node *old,
+                                                 struct llist_node *new)
+{
+       return cmpxchg(&head->first, old, new);
+}
+
 void tctx_task_work(struct callback_head *cb)
 {
        bool uring_locked = false;