| // SPDX-License-Identifier: GPL-2.0 |
| #ifndef IOU_WAIT_H |
| #define IOU_WAIT_H |
| |
| #include <linux/io_uring_types.h> |
| |
| /* |
| * No waiters. It's larger than any valid value of the tw counter |
| * so that tests against ->cq_wait_nr would fail and skip wake_up(). |
| */ |
| #define IO_CQ_WAKE_INIT (-1U) |
| /* Forced wake up if there is a waiter regardless of ->cq_wait_nr */ |
| #define IO_CQ_WAKE_FORCE (IO_CQ_WAKE_INIT >> 1) |
| |
| struct ext_arg { |
| size_t argsz; |
| struct timespec64 ts; |
| const sigset_t __user *sig; |
| ktime_t min_time; |
| bool ts_set; |
| bool iowait; |
| }; |
| |
| int io_cqring_wait(struct io_ring_ctx *ctx, int min_events, u32 flags, |
| struct ext_arg *ext_arg); |
| int io_run_task_work_sig(struct io_ring_ctx *ctx); |
| void io_cqring_do_overflow_flush(struct io_ring_ctx *ctx); |
| |
| static inline unsigned int __io_cqring_events(struct io_ring_ctx *ctx) |
| { |
| return ctx->cached_cq_tail - READ_ONCE(ctx->rings->cq.head); |
| } |
| |
| static inline unsigned int __io_cqring_events_user(struct io_ring_ctx *ctx) |
| { |
| return READ_ONCE(ctx->rings->cq.tail) - READ_ONCE(ctx->rings->cq.head); |
| } |
| |
| /* |
| * Reads the tail/head of the CQ ring while providing an acquire ordering, |
| * see comment at top of io_uring.c. |
| */ |
| static inline unsigned io_cqring_events(struct io_ring_ctx *ctx) |
| { |
| smp_rmb(); |
| return __io_cqring_events(ctx); |
| } |
| |
| #endif |