at master 2.1 kB view raw
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); 44 45void io_wq_enqueue(struct io_wq *wq, struct io_wq_work *work); 46void io_wq_hash_work(struct io_wq_work *work, void *val); 47 48int io_wq_cpu_affinity(struct io_uring_task *tctx, cpumask_var_t mask); 49int io_wq_max_workers(struct io_wq *wq, int *new_count); 50bool io_wq_worker_stopped(void); 51 52static inline bool __io_wq_is_hashed(unsigned int work_flags) 53{ 54 return work_flags & IO_WQ_WORK_HASHED; 55} 56 57static inline bool io_wq_is_hashed(struct io_wq_work *work) 58{ 59 return __io_wq_is_hashed(atomic_read(&work->flags)); 60} 61 62typedef bool (work_cancel_fn)(struct io_wq_work *, void *); 63 64enum io_wq_cancel io_wq_cancel_cb(struct io_wq *wq, work_cancel_fn *cancel, 65 void *data, bool cancel_all); 66 67#if defined(CONFIG_IO_WQ) 68extern void io_wq_worker_sleeping(struct task_struct *); 69extern void io_wq_worker_running(struct task_struct *); 70#else 71static inline void io_wq_worker_sleeping(struct task_struct *tsk) 72{ 73} 74static inline void io_wq_worker_running(struct task_struct *tsk) 75{ 76} 77#endif 78 79static inline bool io_wq_current_is_worker(void) 80{ 81 return in_task() && (current->flags & PF_IO_WORKER) && 82 current->worker_private; 83} 84#endif