mirror of
https://github.com/torvalds/linux.git
synced 2024-12-28 05:41:55 +00:00
io_uring: move list helpers to a separate file
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>
This commit is contained in:
parent
625d38b3fd
commit
a6b21fbb4c
@ -18,6 +18,7 @@
|
||||
#include <uapi/linux/io_uring.h>
|
||||
|
||||
#include "io-wq.h"
|
||||
#include "slist.h"
|
||||
|
||||
#define WORKER_IDLE_TIMEOUT (5 * HZ)
|
||||
|
||||
|
131
io_uring/io-wq.h
131
io_uring/io-wq.h
@ -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 *);
|
||||
|
||||
|
@ -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
|
||||
|
138
io_uring/slist.h
Normal file
138
io_uring/slist.h
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user