xref: /linux/io_uring/wait.h (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
1*0105b056SJens Axboe // SPDX-License-Identifier: GPL-2.0
2*0105b056SJens Axboe #ifndef IOU_WAIT_H
3*0105b056SJens Axboe #define IOU_WAIT_H
4*0105b056SJens Axboe 
5*0105b056SJens Axboe #include <linux/io_uring_types.h>
6*0105b056SJens Axboe 
7*0105b056SJens Axboe /*
8*0105b056SJens Axboe  * No waiters. It's larger than any valid value of the tw counter
9*0105b056SJens Axboe  * so that tests against ->cq_wait_nr would fail and skip wake_up().
10*0105b056SJens Axboe  */
11*0105b056SJens Axboe #define IO_CQ_WAKE_INIT		(-1U)
12*0105b056SJens Axboe /* Forced wake up if there is a waiter regardless of ->cq_wait_nr */
13*0105b056SJens Axboe #define IO_CQ_WAKE_FORCE	(IO_CQ_WAKE_INIT >> 1)
14*0105b056SJens Axboe 
15*0105b056SJens Axboe struct ext_arg {
16*0105b056SJens Axboe 	size_t argsz;
17*0105b056SJens Axboe 	struct timespec64 ts;
18*0105b056SJens Axboe 	const sigset_t __user *sig;
19*0105b056SJens Axboe 	ktime_t min_time;
20*0105b056SJens Axboe 	bool ts_set;
21*0105b056SJens Axboe 	bool iowait;
22*0105b056SJens Axboe };
23*0105b056SJens Axboe 
24*0105b056SJens Axboe int io_cqring_wait(struct io_ring_ctx *ctx, int min_events, u32 flags,
25*0105b056SJens Axboe 		   struct ext_arg *ext_arg);
26*0105b056SJens Axboe int io_run_task_work_sig(struct io_ring_ctx *ctx);
27*0105b056SJens Axboe void io_cqring_do_overflow_flush(struct io_ring_ctx *ctx);
28*0105b056SJens Axboe 
29*0105b056SJens Axboe static inline unsigned int __io_cqring_events(struct io_ring_ctx *ctx)
30*0105b056SJens Axboe {
31*0105b056SJens Axboe 	return ctx->cached_cq_tail - READ_ONCE(ctx->rings->cq.head);
32*0105b056SJens Axboe }
33*0105b056SJens Axboe 
34*0105b056SJens Axboe static inline unsigned int __io_cqring_events_user(struct io_ring_ctx *ctx)
35*0105b056SJens Axboe {
36*0105b056SJens Axboe 	return READ_ONCE(ctx->rings->cq.tail) - READ_ONCE(ctx->rings->cq.head);
37*0105b056SJens Axboe }
38*0105b056SJens Axboe 
39*0105b056SJens Axboe /*
40*0105b056SJens Axboe  * Reads the tail/head of the CQ ring while providing an acquire ordering,
41*0105b056SJens Axboe  * see comment at top of io_uring.c.
42*0105b056SJens Axboe  */
43*0105b056SJens Axboe static inline unsigned io_cqring_events(struct io_ring_ctx *ctx)
44*0105b056SJens Axboe {
45*0105b056SJens Axboe 	smp_rmb();
46*0105b056SJens Axboe 	return __io_cqring_events(ctx);
47*0105b056SJens Axboe }
48*0105b056SJens Axboe 
49*0105b056SJens Axboe #endif
50