- ret = io_submit(ld->aio_ctx, 1, &iocb);
- if (ret == 1)
- return 0;
- else if (ret == -EAGAIN || !ret)
- usleep(100);
- else if (ret == -EINTR)
+ long nr = ld->queued;
+
+ nr = min((unsigned int) nr, ld->entries - ld->tail);
+ io_us = ld->io_us + ld->tail;
+ iocbs = ld->iocbs + ld->tail;
+
+ ret = io_submit(ld->aio_ctx, nr, iocbs);
+ if (ret > 0) {
+ fio_libaio_queued(td, io_us, ret);
+ io_u_mark_submit(td, ret);
+
+ ld->queued -= ret;
+ ring_inc(ld, &ld->tail, ret);
+ ret = 0;
+ wait_start = 0;
+ } else if (ret == -EINTR || !ret) {
+ if (!ret)
+ io_u_mark_submit(td, ret);
+ wait_start = 0;
+ continue;
+ } else if (ret == -EAGAIN) {
+ /*
+ * If we get EAGAIN, we should break out without
+ * error and let the upper layer reap some
+ * events for us. If we have no queued IO, we
+ * must loop here. If we loop for more than 30s,
+ * just error out, something must be buggy in the
+ * IO path.
+ */
+ if (ld->queued) {
+ ret = 0;
+ break;
+ }
+ if (!wait_start) {
+ fio_gettime(&ts, NULL);
+ wait_start = 1;
+ } else if (mtime_since_now(&ts) > 30000) {
+ log_err("fio: aio appears to be stalled, giving up\n");
+ break;
+ }
+ usleep(1);