Merge branch 'master' of https://github.com/CarterLi/liburing
* 'master' of https://github.com/CarterLi/liburing:
src/queue.c: don't test `LIBURING_UDATA_TIMEOUT` for the latest kernel since we don't use it internally
diff --git a/src/queue.c b/src/queue.c
index 7ac689d..4bd4c48 100644
--- a/src/queue.c
+++ b/src/queue.c
@@ -90,12 +90,13 @@
{
struct io_uring_cqe *cqe = NULL;
const int to_wait = data->wait_nr;
- int ret = 0, err;
+ int err;
do {
bool cq_overflow_flush = false;
unsigned flags = 0;
unsigned nr_available;
+ int ret;
err = __io_uring_peek_cqe(ring, &cqe, &nr_available);
if (err)
@@ -107,21 +108,24 @@
}
cq_overflow_flush = true;
}
- if (data->wait_nr && cqe)
- data->wait_nr--;
if (data->wait_nr || cq_overflow_flush)
flags = IORING_ENTER_GETEVENTS | data->get_flags;
if (data->submit)
sq_ring_needs_enter(ring, &flags);
- if (data->wait_nr > nr_available || data->submit ||
- cq_overflow_flush)
- ret = __sys_io_uring_enter2(ring->ring_fd, data->submit,
- data->wait_nr, flags, data->arg,
- data->sz);
+ if (data->wait_nr <= nr_available && !data->submit &&
+ !cq_overflow_flush)
+ break;
+
+ ret = __sys_io_uring_enter2(ring->ring_fd, data->submit,
+ data->wait_nr, flags, data->arg,
+ data->sz);
if (ret < 0) {
err = -errno;
- } else if (ret == (int)data->submit) {
- data->submit = 0;
+ break;
+ }
+
+ data->submit -= ret;
+ if (ret == (int)data->submit) {
/*
* When SETUP_IOPOLL is set, __sys_io_uring enter()
* must be called to reap new completions but the call
@@ -130,12 +134,10 @@
*/
if (!(ring->flags & IORING_SETUP_IOPOLL))
data->wait_nr = 0;
- } else {
- data->submit -= ret;
}
if (cqe)
break;
- } while (!err);
+ } while (1);
*cqe_ptr = cqe;
return err;