+static int wait_for_completions(struct thread_data *td, struct timeval *time,
+ uint64_t *bytes_done)
+{
+ const int full = queue_full(td);
+ int min_evts = 0;
+ int ret;
+
+ /*
+ * if the queue is full, we MUST reap at least 1 event
+ */
+ min_evts = min(td->o.iodepth_batch_complete, td->cur_depth);
+ if (full && !min_evts)
+ min_evts = 1;
+
+ if (time && (should_check_rate(td, DDIR_READ) ||
+ __should_check_rate(td, DDIR_WRITE) ||
+ __should_check_rate(td, DDIR_TRIM)))
+ fio_gettime(time, NULL);
+
+ do {
+ ret = io_u_queued_complete(td, min_evts, bytes_done);
+ if (ret < 0)
+ break;
+ } while (full && (td->cur_depth > td->o.iodepth_low));
+
+ return ret;
+}
+