File Index
Files and directories
Sign in
FILE

io-wq.h

File preview with syntax highlighting.

linux-6.19.14/io_uring/io-wq.h C
 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.