t/io_uring: fixes
[fio.git] / t / io_uring.c
index 71443404513e4e5a64efbb13d615dd663837dad5..0545a1dd680c64f00aaa68c31d55839235058c39 100644 (file)
@@ -47,8 +47,8 @@ struct io_cq_ring {
 
 #define DEPTH                  128
 
-#define BATCH_SUBMIT           64
-#define BATCH_COMPLETE         64
+#define BATCH_SUBMIT           32
+#define BATCH_COMPLETE         32
 
 #define BS                     4096
 
@@ -172,6 +172,7 @@ static void init_io(struct submitter *s, unsigned index)
                        s->cur_file++;
                        if (s->cur_file == s->nr_files)
                                s->cur_file = 0;
+                       f = &s->files[s->cur_file];
                }
        }
        f->pending_ios++;
@@ -310,7 +311,7 @@ static void *submitter_fn(void *data)
 submit_more:
                to_submit = prepped;
 submit:
-               if (s->inflight + BATCH_SUBMIT < DEPTH)
+               if (to_submit && (s->inflight + to_submit <= DEPTH))
                        to_wait = 0;
                else
                        to_wait = min(s->inflight + to_submit, BATCH_COMPLETE);
@@ -337,9 +338,10 @@ submit:
                do {
                        int r;
                        r = reap_events(s);
-                       if (r == -1)
+                       if (r == -1) {
+                               s->finish = 1;
                                break;
-                       else if (r > 0)
+                       else if (r > 0)
                                this_reap += r;
                } while (sq_thread_poll && this_reap < to_wait);
                s->reaps += this_reap;
@@ -405,7 +407,7 @@ static int setup_ring(struct submitter *s)
 
        memset(&p, 0, sizeof(p));
 
-       if (polled)
+       if (polled && !do_nop)
                p.flags |= IORING_SETUP_IOPOLL;
        if (sq_thread_poll) {
                p.flags |= IORING_SETUP_SQPOLL;
@@ -468,11 +470,30 @@ static int setup_ring(struct submitter *s)
        return 0;
 }
 
+static void file_depths(char *buf)
+{
+       struct submitter *s = &submitters[0];
+       char *p;
+       int i;
+
+       buf[0] = '\0';
+       p = buf;
+       for (i = 0; i < s->nr_files; i++) {
+               struct file *f = &s->files[i];
+
+               if (i + 1 == s->nr_files)
+                       p += sprintf(p, "%d", f->pending_ios);
+               else
+                       p += sprintf(p, "%d, ", f->pending_ios);
+       }
+}
+
 int main(int argc, char *argv[])
 {
        struct submitter *s = &submitters[0];
        unsigned long done, calls, reap, cache_hit, cache_miss;
        int err, i, flags, fd;
+       char *fdepths;
        void *ret;
 
        if (!do_nop && argc < 2) {
@@ -543,6 +564,7 @@ int main(int argc, char *argv[])
 
        pthread_create(&s->thread, NULL, submitter_fn, s);
 
+       fdepths = malloc(8 * s->nr_files);
        cache_hit = cache_miss = reap = calls = done = 0;
        do {
                unsigned long this_done = 0;
@@ -572,9 +594,10 @@ int main(int argc, char *argv[])
                        ipc = (this_reap - reap) / (this_call - calls);
                } else
                        rpc = ipc = -1;
-               printf("IOPS=%lu, IOS/call=%ld/%ld, inflight=%u (head=%u tail=%u), Cachehit=%0.2f%%\n",
+               file_depths(fdepths);
+               printf("IOPS=%lu, IOS/call=%ld/%ld, inflight=%u (%s), Cachehit=%0.2f%%\n",
                                this_done - done, rpc, ipc, s->inflight,
-                               *s->cq_ring.head, *s->cq_ring.tail, hit);
+                               fdepths, hit);
                done = this_done;
                calls = this_call;
                reap = this_reap;
@@ -584,5 +607,6 @@ int main(int argc, char *argv[])
 
        pthread_join(s->thread, &ret);
        close(s->ring_fd);
+       free(fdepths);
        return 0;
 }