io_uring: move list helpers to a separate file
authorPavel Begunkov <asml.silence@gmail.com>
Tue, 21 Jun 2022 09:09:01 +0000 (10:09 +0100)
committerJens Axboe <axboe@kernel.dk>
Mon, 25 Jul 2022 00:39:15 +0000 (18:39 -0600)
It's annoying to have io-wq.h as a dependency every time we want some of
struct io_wq_work_list helpers, move them into a separate file.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/c1d891ce12b30767d1d2a3b7db2ca3abc1ecc4a2.1655802465.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/io-wq.c
io_uring/io-wq.h
io_uring/io_uring.h
io_uring/slist.h [new file with mode: 0644]

index 824623b..3e34dfb 100644 (file)
@@ -18,6 +18,7 @@
 #include <uapi/linux/io_uring.h>
 
 #include "io-wq.h"
+#include "slist.h"
 
 #define WORKER_IDLE_TIMEOUT    (5 * HZ)
 
index 10b80ef..3122842 100644 (file)
@@ -21,137 +21,6 @@ enum io_wq_cancel {
        IO_WQ_CANCEL_NOTFOUND,  /* work not found */
 };
 
-#define wq_list_for_each(pos, prv, head)                       \
-       for (pos = (head)->first, prv = NULL; pos; prv = pos, pos = (pos)->next)
-
-#define wq_list_for_each_resume(pos, prv)                      \
-       for (; pos; prv = pos, pos = (pos)->next)
-
-#define wq_list_empty(list)    (READ_ONCE((list)->first) == NULL)
-#define INIT_WQ_LIST(list)     do {                            \
-       (list)->first = NULL;                                   \
-} while (0)
-
-static inline void wq_list_add_after(struct io_wq_work_node *node,
-                                    struct io_wq_work_node *pos,
-                                    struct io_wq_work_list *list)
-{
-       struct io_wq_work_node *next = pos->next;
-
-       pos->next = node;
-       node->next = next;
-       if (!next)
-               list->last = node;
-}
-
-/**
- * wq_list_merge - merge the second list to the first one.
- * @list0: the first list
- * @list1: the second list
- * Return the first node after mergence.
- */
-static inline struct io_wq_work_node *wq_list_merge(struct io_wq_work_list *list0,
-                                                   struct io_wq_work_list *list1)
-{
-       struct io_wq_work_node *ret;
-
-       if (!list0->first) {
-               ret = list1->first;
-       } else {
-               ret = list0->first;
-               list0->last->next = list1->first;
-       }
-       INIT_WQ_LIST(list0);
-       INIT_WQ_LIST(list1);
-       return ret;
-}
-
-static inline void wq_list_add_tail(struct io_wq_work_node *node,
-                                   struct io_wq_work_list *list)
-{
-       node->next = NULL;
-       if (!list->first) {
-               list->last = node;
-               WRITE_ONCE(list->first, node);
-       } else {
-               list->last->next = node;
-               list->last = node;
-       }
-}
-
-static inline void wq_list_add_head(struct io_wq_work_node *node,
-                                   struct io_wq_work_list *list)
-{
-       node->next = list->first;
-       if (!node->next)
-               list->last = node;
-       WRITE_ONCE(list->first, node);
-}
-
-static inline void wq_list_cut(struct io_wq_work_list *list,
-                              struct io_wq_work_node *last,
-                              struct io_wq_work_node *prev)
-{
-       /* first in the list, if prev==NULL */
-       if (!prev)
-               WRITE_ONCE(list->first, last->next);
-       else
-               prev->next = last->next;
-
-       if (last == list->last)
-               list->last = prev;
-       last->next = NULL;
-}
-
-static inline void __wq_list_splice(struct io_wq_work_list *list,
-                                   struct io_wq_work_node *to)
-{
-       list->last->next = to->next;
-       to->next = list->first;
-       INIT_WQ_LIST(list);
-}
-
-static inline bool wq_list_splice(struct io_wq_work_list *list,
-                                 struct io_wq_work_node *to)
-{
-       if (!wq_list_empty(list)) {
-               __wq_list_splice(list, to);
-               return true;
-       }
-       return false;
-}
-
-static inline void wq_stack_add_head(struct io_wq_work_node *node,
-                                    struct io_wq_work_node *stack)
-{
-       node->next = stack->next;
-       stack->next = node;
-}
-
-static inline void wq_list_del(struct io_wq_work_list *list,
-                              struct io_wq_work_node *node,
-                              struct io_wq_work_node *prev)
-{
-       wq_list_cut(list, node, prev);
-}
-
-static inline
-struct io_wq_work_node *wq_stack_extract(struct io_wq_work_node *stack)
-{
-       struct io_wq_work_node *node = stack->next;
-
-       stack->next = node->next;
-       return node;
-}
-
-static inline struct io_wq_work *wq_next_work(struct io_wq_work *work)
-{
-       if (!work->list.next)
-               return NULL;
-
-       return container_of(work->list.next, struct io_wq_work, list);
-}
-
 typedef struct io_wq_work *(free_work_fn)(struct io_wq_work *);
 typedef void (io_wq_work_fn)(struct io_wq_work *);
 
index 4c4d38f..f026d26 100644 (file)
@@ -5,6 +5,7 @@
 #include <linux/lockdep.h>
 #include <linux/io_uring_types.h>
 #include "io-wq.h"
+#include "slist.h"
 #include "filetable.h"
 
 #ifndef CREATE_TRACE_POINTS
diff --git a/io_uring/slist.h b/io_uring/slist.h
new file mode 100644 (file)
index 0000000..f27601f
--- /dev/null
@@ -0,0 +1,138 @@
+#ifndef INTERNAL_IO_SLIST_H
+#define INTERNAL_IO_SLIST_H
+
+#include <linux/io_uring_types.h>
+
+#define wq_list_for_each(pos, prv, head)                       \
+       for (pos = (head)->first, prv = NULL; pos; prv = pos, pos = (pos)->next)
+
+#define wq_list_for_each_resume(pos, prv)                      \
+       for (; pos; prv = pos, pos = (pos)->next)
+
+#define wq_list_empty(list)    (READ_ONCE((list)->first) == NULL)
+
+#define INIT_WQ_LIST(list)     do {                            \
+       (list)->first = NULL;                                   \
+} while (0)
+
+static inline void wq_list_add_after(struct io_wq_work_node *node,
+                                    struct io_wq_work_node *pos,
+                                    struct io_wq_work_list *list)
+{
+       struct io_wq_work_node *next = pos->next;
+
+       pos->next = node;
+       node->next = next;
+       if (!next)
+               list->last = node;
+}
+
+/**
+ * wq_list_merge - merge the second list to the first one.
+ * @list0: the first list
+ * @list1: the second list
+ * Return the first node after mergence.
+ */
+static inline struct io_wq_work_node *wq_list_merge(struct io_wq_work_list *list0,
+                                                   struct io_wq_work_list *list1)
+{
+       struct io_wq_work_node *ret;
+
+       if (!list0->first) {
+               ret = list1->first;
+       } else {
+               ret = list0->first;
+               list0->last->next = list1->first;
+       }
+       INIT_WQ_LIST(list0);
+       INIT_WQ_LIST(list1);
+       return ret;
+}
+
+static inline void wq_list_add_tail(struct io_wq_work_node *node,
+                                   struct io_wq_work_list *list)
+{
+       node->next = NULL;
+       if (!list->first) {
+               list->last = node;
+               WRITE_ONCE(list->first, node);
+       } else {
+               list->last->next = node;
+               list->last = node;
+       }
+}
+
+static inline void wq_list_add_head(struct io_wq_work_node *node,
+                                   struct io_wq_work_list *list)
+{
+       node->next = list->first;
+       if (!node->next)
+               list->last = node;
+       WRITE_ONCE(list->first, node);
+}
+
+static inline void wq_list_cut(struct io_wq_work_list *list,
+                              struct io_wq_work_node *last,
+                              struct io_wq_work_node *prev)
+{
+       /* first in the list, if prev==NULL */
+       if (!prev)
+               WRITE_ONCE(list->first, last->next);
+       else
+               prev->next = last->next;
+
+       if (last == list->last)
+               list->last = prev;
+       last->next = NULL;
+}
+
+static inline void __wq_list_splice(struct io_wq_work_list *list,
+                                   struct io_wq_work_node *to)
+{
+       list->last->next = to->next;
+       to->next = list->first;
+       INIT_WQ_LIST(list);
+}
+
+static inline bool wq_list_splice(struct io_wq_work_list *list,
+                                 struct io_wq_work_node *to)
+{
+       if (!wq_list_empty(list)) {
+               __wq_list_splice(list, to);
+               return true;
+       }
+       return false;
+}
+
+static inline void wq_stack_add_head(struct io_wq_work_node *node,
+                                    struct io_wq_work_node *stack)
+{
+       node->next = stack->next;
+       stack->next = node;
+}
+
+static inline void wq_list_del(struct io_wq_work_list *list,
+                              struct io_wq_work_node *node,
+                              struct io_wq_work_node *prev)
+{
+       wq_list_cut(list, node, prev);
+}
+
+static inline
+struct io_wq_work_node *wq_stack_extract(struct io_wq_work_node *stack)
+{
+       struct io_wq_work_node *node = stack->next;
+
+       stack->next = node->next;
+       return node;
+}
+
+static inline struct io_wq_work *wq_next_work(struct io_wq_work *work)
+{
+       if (!work->list.next)
+               return NULL;
+
+       return container_of(work->list.next, struct io_wq_work, list);
+}
+
+#endif // INTERNAL_IO_SLIST_H
\ No newline at end of file