Blame view
fs/io-wq.h
3.65 KB
771b53d03 io-wq: small thre... |
1 2 3 4 5 6 7 |
#ifndef INTERNAL_IO_WQ_H #define INTERNAL_IO_WQ_H struct io_wq; enum { IO_WQ_WORK_CANCEL = 1, |
771b53d03 io-wq: small thre... |
8 |
IO_WQ_WORK_HASHED = 4, |
c5def4ab8 io-wq: add suppor... |
9 |
IO_WQ_WORK_UNBOUND = 32, |
0c9d5ccd2 io-wq: add suppor... |
10 |
IO_WQ_WORK_NO_CANCEL = 256, |
895e2ca0f io-wq: support co... |
11 |
IO_WQ_WORK_CONCURRENT = 512, |
771b53d03 io-wq: small thre... |
12 13 14 15 16 17 18 19 20 |
IO_WQ_HASH_SHIFT = 24, /* upper 8 bits are used for hash key */ }; enum io_wq_cancel { IO_WQ_CANCEL_OK, /* cancelled before started */ IO_WQ_CANCEL_RUNNING, /* found, running, and attempted cancelled */ IO_WQ_CANCEL_NOTFOUND, /* work not found */ }; |
6206f0e18 io-wq: shrink io_... |
21 22 23 24 25 26 27 28 |
struct io_wq_work_node { struct io_wq_work_node *next; }; struct io_wq_work_list { struct io_wq_work_node *first; struct io_wq_work_node *last; }; |
86f3cd1b5 io-wq: handle has... |
29 30 31 32 33 34 35 36 37 38 39 |
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; } |
6206f0e18 io-wq: shrink io_... |
40 41 42 43 |
static inline void wq_list_add_tail(struct io_wq_work_node *node, struct io_wq_work_list *list) { if (!list->first) { |
e995d5123 io-wq: briefly sp... |
44 45 |
list->last = node; WRITE_ONCE(list->first, node); |
6206f0e18 io-wq: shrink io_... |
46 47 48 49 50 |
} else { list->last->next = node; list->last = node; } } |
86f3cd1b5 io-wq: handle has... |
51 52 |
static inline void wq_list_cut(struct io_wq_work_list *list, struct io_wq_work_node *last, |
6206f0e18 io-wq: shrink io_... |
53 54 |
struct io_wq_work_node *prev) { |
86f3cd1b5 io-wq: handle has... |
55 56 57 58 59 60 61 |
/* first in the list, if prev==NULL */ if (!prev) WRITE_ONCE(list->first, last->next); else prev->next = last->next; if (last == list->last) |
6206f0e18 io-wq: shrink io_... |
62 |
list->last = prev; |
86f3cd1b5 io-wq: handle has... |
63 64 65 66 67 68 69 70 |
last->next = NULL; } 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); |
6206f0e18 io-wq: shrink io_... |
71 72 73 74 |
} #define wq_list_for_each(pos, prv, head) \ for (pos = (head)->first, prv = NULL; pos; prv = pos, pos = (pos)->next) |
e995d5123 io-wq: briefly sp... |
75 |
#define wq_list_empty(list) (READ_ONCE((list)->first) == NULL) |
6206f0e18 io-wq: shrink io_... |
76 77 78 79 |
#define INIT_WQ_LIST(list) do { \ (list)->first = NULL; \ (list)->last = NULL; \ } while (0) |
771b53d03 io-wq: small thre... |
80 |
struct io_wq_work { |
18a542ff1 io_uring: Fix ->d... |
81 |
struct io_wq_work_node list; |
771b53d03 io-wq: small thre... |
82 |
void (*func)(struct io_wq_work **); |
fcb323cc5 io_uring: io_urin... |
83 |
struct files_struct *files; |
cccf0ee83 io_uring/io-wq: d... |
84 85 |
struct mm_struct *mm; const struct cred *creds; |
9392a27d8 io-wq: add suppor... |
86 |
struct fs_struct *fs; |
6206f0e18 io-wq: shrink io_... |
87 |
unsigned flags; |
36282881a io-wq: add io_wq_... |
88 |
pid_t task_pid; |
771b53d03 io-wq: small thre... |
89 |
}; |
2d141dd2c io-wq: ensure wor... |
90 91 92 93 |
#define INIT_IO_WORK(work, _func) \ do { \ *(work) = (struct io_wq_work){ .func = _func }; \ } while (0) \ |
771b53d03 io-wq: small thre... |
94 |
|
86f3cd1b5 io-wq: handle has... |
95 96 97 98 99 100 101 |
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); } |
e9fd93965 io_uring/io-wq: f... |
102 |
typedef void (free_work_fn)(struct io_wq_work *); |
7d7230652 io_wq: add get/pu... |
103 |
|
576a347b7 io-wq: have io_wq... |
104 |
struct io_wq_data { |
576a347b7 io-wq: have io_wq... |
105 |
struct user_struct *user; |
e9fd93965 io_uring/io-wq: f... |
106 |
free_work_fn *free_work; |
576a347b7 io-wq: have io_wq... |
107 108 109 |
}; struct io_wq *io_wq_create(unsigned bounded, struct io_wq_data *data); |
eba6f5a33 io-wq: allow grab... |
110 |
bool io_wq_get(struct io_wq *wq, struct io_wq_data *data); |
771b53d03 io-wq: small thre... |
111 112 113 |
void io_wq_destroy(struct io_wq *wq); void io_wq_enqueue(struct io_wq *wq, struct io_wq_work *work); |
8766dd516 io-wq: split hash... |
114 115 116 117 118 119 |
void io_wq_hash_work(struct io_wq_work *work, void *val); static inline bool io_wq_is_hashed(struct io_wq_work *work) { return work->flags & IO_WQ_WORK_HASHED; } |
771b53d03 io-wq: small thre... |
120 121 122 |
void io_wq_cancel_all(struct io_wq *wq); enum io_wq_cancel io_wq_cancel_work(struct io_wq *wq, struct io_wq_work *cwork); |
36282881a io-wq: add io_wq_... |
123 |
enum io_wq_cancel io_wq_cancel_pid(struct io_wq *wq, pid_t pid); |
771b53d03 io-wq: small thre... |
124 |
|
62755e35d io_uring: support... |
125 126 127 128 |
typedef bool (work_cancel_fn)(struct io_wq_work *, void *); enum io_wq_cancel io_wq_cancel_cb(struct io_wq *wq, work_cancel_fn *cancel, void *data); |
771b53d03 io-wq: small thre... |
129 130 131 132 133 134 135 136 137 138 |
#if defined(CONFIG_IO_WQ) extern void io_wq_worker_sleeping(struct task_struct *); extern void io_wq_worker_running(struct task_struct *); #else static inline void io_wq_worker_sleeping(struct task_struct *tsk) { } static inline void io_wq_worker_running(struct task_struct *tsk) { } |
525b305d6 io-wq: re-add io_... |
139 |
#endif |
771b53d03 io-wq: small thre... |
140 |
|
525b305d6 io-wq: re-add io_... |
141 142 143 144 145 |
static inline bool io_wq_current_is_worker(void) { return in_task() && (current->flags & PF_IO_WORKER); } #endif |