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