Can happen that _io_uring_get_cqe() returns success without filled cqe, and it's ok, especially for wait_n=0. Fix up error code for functions that always want to have a valid CQE on success. Also don't do cq_ring_needs_flush() check in a some weird place, mainstream it together with wait_nr testing. Signed-off-by: Pavel Begunkov <asml.silence@xxxxxxxxx> --- src/include/liburing.h | 4 +++- src/queue.c | 10 +--------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/include/liburing.h b/src/include/liburing.h index 90403bc..27c5a14 100644 --- a/src/include/liburing.h +++ b/src/include/liburing.h @@ -601,7 +601,9 @@ static inline int io_uring_wait_cqe_nr(struct io_uring *ring, struct io_uring_cqe **cqe_ptr, unsigned wait_nr) { - return __io_uring_get_cqe(ring, cqe_ptr, 0, wait_nr, NULL); + int ret = __io_uring_get_cqe(ring, cqe_ptr, 0, wait_nr, NULL); + + return (ret || *cqe_ptr) ? ret : -EAGAIN; } /* diff --git a/src/queue.c b/src/queue.c index 4fb4ea7..0b09a9c 100644 --- a/src/queue.c +++ b/src/queue.c @@ -93,7 +93,6 @@ static int _io_uring_get_cqe(struct io_uring *ring, struct io_uring_cqe **cqe_pt do { bool need_enter = false; - bool cq_overflow_flush = false; unsigned flags = 0; unsigned nr_available; int ret; @@ -101,14 +100,7 @@ static int _io_uring_get_cqe(struct io_uring *ring, struct io_uring_cqe **cqe_pt err = __io_uring_peek_cqe(ring, &cqe, &nr_available); if (err) break; - if (!cqe && !to_wait && !data->submit) { - if (!cq_ring_needs_flush(ring)) { - err = -EAGAIN; - break; - } - cq_overflow_flush = true; - } - if (data->wait_nr > nr_available || cq_overflow_flush) { + if (data->wait_nr > nr_available || cq_ring_needs_flush(ring)) { flags = IORING_ENTER_GETEVENTS | data->get_flags; need_enter = true; } -- 2.24.0