FILE
io-wq.h
File preview with syntax highlighting.
linux-6.19.14/io_uring/io-wq.h
1#ifndef INTERNAL_IO_WQ_H 2#define INTERNAL_IO_WQ_H 3 4#include <linux/refcount.h> 5#include <linux/io_uring_types.h> 6 7struct io_wq; 8 9enum { 10 IO_WQ_WORK_CANCEL = 1, 11 IO_WQ_WORK_HASHED = 2, 12 IO_WQ_WORK_UNBOUND = 4, 13 IO_WQ_WORK_CONCURRENT = 16, 14 15 IO_WQ_HASH_SHIFT = 24, /* upper 8 bits are used for hash key */ 16}; 17 18enum io_wq_cancel { 19 IO_WQ_CANCEL_OK, /* cancelled before started */ 20 IO_WQ_CANCEL_RUNNING, /* found, running, and attempted cancelled */ 21 IO_WQ_CANCEL_NOTFOUND, /* work not found */ 22}; 23 24struct io_wq_hash { 25 refcount_t refs; 26 unsigned long map; 27 struct wait_queue_head wait; 28}; 29 30static inline void io_wq_put_hash(struct io_wq_hash *hash) 31{ 32 if (refcount_dec_and_test(&hash->refs)) 33 kfree(hash); 34} 35 36struct io_wq_data { 37 struct io_wq_hash *hash; 38 struct task_struct *task; 39}; 40 41struct io_wq *io_wq_create(unsigned bounded, struct io_wq_data *data); 42void io_wq_exit_start(struct io_wq *wq); 43void io_wq_put_and_exit(struct io_wq *wq); 44void io_wq_set_exit_on_idle(struct io_wq *wq, bool enable); 45 46void io_wq_enqueue(struct io_wq *wq, struct io_wq_work *work); 47void io_wq_hash_work(struct io_wq_work *work, void *val); 48 49int io_wq_cpu_affinity(struct io_uring_task *tctx, cpumask_var_t mask); 50int io_wq_max_workers(struct io_wq *wq, int *new_count); 51bool io_wq_worker_stopped(void); 52 53static inline bool __io_wq_is_hashed(unsigned int work_flags) 54{ 55 return work_flags & IO_WQ_WORK_HASHED; 56} 57 58static inline bool io_wq_is_hashed(struct io_wq_work *work) 59{ 60 return __io_wq_is_hashed(atomic_read(&work->flags)); 61} 62 63typedef bool (work_cancel_fn)(struct io_wq_work *, void *); 64 65enum io_wq_cancel io_wq_cancel_cb(struct io_wq *wq, work_cancel_fn *cancel, 66 void *data, bool cancel_all); 67 68#if defined(CONFIG_IO_WQ) 69extern void io_wq_worker_sleeping(struct task_struct *); 70extern void io_wq_worker_running(struct task_struct *); 71#else 72static inline void io_wq_worker_sleeping(struct task_struct *tsk) 73{ 74} 75static inline void io_wq_worker_running(struct task_struct *tsk) 76{ 77} 78#endif 79 80static inline bool io_wq_current_is_worker(void) 81{ 82 return in_task() && (current->flags & PF_IO_WORKER) && 83 current->worker_private; 84} 85#endif
~/
Read-only file preview.