Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v5.11-rc2 155 lines 3.7 kB view raw
1#ifndef INTERNAL_IO_WQ_H 2#define INTERNAL_IO_WQ_H 3 4#include <linux/io_uring.h> 5 6struct io_wq; 7 8enum { 9 IO_WQ_WORK_CANCEL = 1, 10 IO_WQ_WORK_HASHED = 2, 11 IO_WQ_WORK_UNBOUND = 4, 12 IO_WQ_WORK_NO_CANCEL = 8, 13 IO_WQ_WORK_CONCURRENT = 16, 14 15 IO_WQ_WORK_FILES = 32, 16 IO_WQ_WORK_FS = 64, 17 IO_WQ_WORK_MM = 128, 18 IO_WQ_WORK_CREDS = 256, 19 IO_WQ_WORK_BLKCG = 512, 20 IO_WQ_WORK_FSIZE = 1024, 21 22 IO_WQ_HASH_SHIFT = 24, /* upper 8 bits are used for hash key */ 23}; 24 25enum io_wq_cancel { 26 IO_WQ_CANCEL_OK, /* cancelled before started */ 27 IO_WQ_CANCEL_RUNNING, /* found, running, and attempted cancelled */ 28 IO_WQ_CANCEL_NOTFOUND, /* work not found */ 29}; 30 31struct io_wq_work_node { 32 struct io_wq_work_node *next; 33}; 34 35struct io_wq_work_list { 36 struct io_wq_work_node *first; 37 struct io_wq_work_node *last; 38}; 39 40static inline void wq_list_add_after(struct io_wq_work_node *node, 41 struct io_wq_work_node *pos, 42 struct io_wq_work_list *list) 43{ 44 struct io_wq_work_node *next = pos->next; 45 46 pos->next = node; 47 node->next = next; 48 if (!next) 49 list->last = node; 50} 51 52static inline void wq_list_add_tail(struct io_wq_work_node *node, 53 struct io_wq_work_list *list) 54{ 55 if (!list->first) { 56 list->last = node; 57 WRITE_ONCE(list->first, node); 58 } else { 59 list->last->next = node; 60 list->last = node; 61 } 62 node->next = NULL; 63} 64 65static inline void wq_list_cut(struct io_wq_work_list *list, 66 struct io_wq_work_node *last, 67 struct io_wq_work_node *prev) 68{ 69 /* first in the list, if prev==NULL */ 70 if (!prev) 71 WRITE_ONCE(list->first, last->next); 72 else 73 prev->next = last->next; 74 75 if (last == list->last) 76 list->last = prev; 77 last->next = NULL; 78} 79 80static inline void wq_list_del(struct io_wq_work_list *list, 81 struct io_wq_work_node *node, 82 struct io_wq_work_node *prev) 83{ 84 wq_list_cut(list, node, prev); 85} 86 87#define wq_list_for_each(pos, prv, head) \ 88 for (pos = (head)->first, prv = NULL; pos; prv = pos, pos = (pos)->next) 89 90#define wq_list_empty(list) (READ_ONCE((list)->first) == NULL) 91#define INIT_WQ_LIST(list) do { \ 92 (list)->first = NULL; \ 93 (list)->last = NULL; \ 94} while (0) 95 96struct io_wq_work { 97 struct io_wq_work_node list; 98 struct io_identity *identity; 99 unsigned flags; 100}; 101 102static inline struct io_wq_work *wq_next_work(struct io_wq_work *work) 103{ 104 if (!work->list.next) 105 return NULL; 106 107 return container_of(work->list.next, struct io_wq_work, list); 108} 109 110typedef void (free_work_fn)(struct io_wq_work *); 111typedef struct io_wq_work *(io_wq_work_fn)(struct io_wq_work *); 112 113struct io_wq_data { 114 struct user_struct *user; 115 116 io_wq_work_fn *do_work; 117 free_work_fn *free_work; 118}; 119 120struct io_wq *io_wq_create(unsigned bounded, struct io_wq_data *data); 121bool io_wq_get(struct io_wq *wq, struct io_wq_data *data); 122void io_wq_destroy(struct io_wq *wq); 123 124void io_wq_enqueue(struct io_wq *wq, struct io_wq_work *work); 125void io_wq_hash_work(struct io_wq_work *work, void *val); 126 127static inline bool io_wq_is_hashed(struct io_wq_work *work) 128{ 129 return work->flags & IO_WQ_WORK_HASHED; 130} 131 132typedef bool (work_cancel_fn)(struct io_wq_work *, void *); 133 134enum io_wq_cancel io_wq_cancel_cb(struct io_wq *wq, work_cancel_fn *cancel, 135 void *data, bool cancel_all); 136 137struct task_struct *io_wq_get_task(struct io_wq *wq); 138 139#if defined(CONFIG_IO_WQ) 140extern void io_wq_worker_sleeping(struct task_struct *); 141extern void io_wq_worker_running(struct task_struct *); 142#else 143static inline void io_wq_worker_sleeping(struct task_struct *tsk) 144{ 145} 146static inline void io_wq_worker_running(struct task_struct *tsk) 147{ 148} 149#endif 150 151static inline bool io_wq_current_is_worker(void) 152{ 153 return in_task() && (current->flags & PF_IO_WORKER); 154} 155#endif