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