1 | // SPDX-License-Identifier: GPL-2.0 |
2 | |
3 | #include "alloc_cache.h" |
4 | |
5 | enum { |
6 | IO_APOLL_OK, |
7 | IO_APOLL_ABORTED, |
8 | IO_APOLL_READY |
9 | }; |
10 | |
11 | struct io_poll { |
12 | struct file *file; |
13 | struct wait_queue_head *head; |
14 | __poll_t events; |
15 | int retries; |
16 | struct wait_queue_entry wait; |
17 | }; |
18 | |
19 | struct async_poll { |
20 | union { |
21 | struct io_poll poll; |
22 | struct io_cache_entry cache; |
23 | }; |
24 | struct io_poll *double_poll; |
25 | }; |
26 | |
27 | /* |
28 | * Must only be called inside issue_flags & IO_URING_F_MULTISHOT, or |
29 | * potentially other cases where we already "own" this poll request. |
30 | */ |
31 | static inline void io_poll_multishot_retry(struct io_kiocb *req) |
32 | { |
33 | atomic_inc(v: &req->poll_refs); |
34 | } |
35 | |
36 | int io_poll_add_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe); |
37 | int io_poll_add(struct io_kiocb *req, unsigned int issue_flags); |
38 | |
39 | int io_poll_remove_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe); |
40 | int io_poll_remove(struct io_kiocb *req, unsigned int issue_flags); |
41 | |
42 | struct io_cancel_data; |
43 | int io_poll_cancel(struct io_ring_ctx *ctx, struct io_cancel_data *cd, |
44 | unsigned issue_flags); |
45 | int io_arm_poll_handler(struct io_kiocb *req, unsigned issue_flags); |
46 | bool io_poll_remove_all(struct io_ring_ctx *ctx, struct task_struct *tsk, |
47 | bool cancel_all); |
48 | |
49 | void io_apoll_cache_free(struct io_cache_entry *entry); |
50 | |
51 | void io_poll_task_func(struct io_kiocb *req, struct io_tw_state *ts); |
52 | |