| // SPDX-License-Identifier: GPL-2.0 |
| #ifndef IOU_WAIT_H |
| #define IOU_WAIT_H |
| |
| #include <linux/io_uring_types.h> |
| |
| /* |
| * ->cq_wait_nr is armed with the number of lazy task_work adds the waiter |
| * still needs, and counted down by the add side, with the add reaching zero |
| * issuing the (single) wake up for this wait cycle. Zero and below means no |
| * wake up is to be issued: IO_CQ_WAKE_INIT when no task is waiting (also |
| * what a forced wake up resets it to when claiming one), zero once the |
| * countdown has fired. |
| */ |
| #define 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); |
| void io_cqring_overflow_flush_locked(struct io_ring_ctx *ctx); |
| |
| static inline unsigned int __io_cqring_events(struct io_ring_ctx *ctx) |
| { |
| struct io_rings *rings = io_get_rings(ctx); |
| return ctx->cached_cq_tail - READ_ONCE(rings->cq.head); |
| } |
| |
| static inline unsigned int __io_cqring_events_user(struct io_ring_ctx *ctx) |
| { |
| struct io_rings *rings = io_get_rings(ctx); |
| |
| return READ_ONCE(rings->cq.tail) - READ_ONCE(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 |