close_ioengine() clears ->data after calling engine cleanup
[fio.git] / engines / posixaio.c
index c352a7ad852bd77bc15c197b003573f3a5e147f6..acd215c2f9f01a27bce0fa2b4f3a0ea7a438e8d7 100644 (file)
@@ -76,19 +76,24 @@ static int fio_posixaio_prep(struct thread_data fio_unused *td,
        return 0;
 }
 
        return 0;
 }
 
+#define SUSPEND_ENTRIES        8
+
 static int fio_posixaio_getevents(struct thread_data *td, unsigned int min,
                                  unsigned int max, struct timespec *t)
 {
        struct posixaio_data *pd = td->io_ops->data;
 static int fio_posixaio_getevents(struct thread_data *td, unsigned int min,
                                  unsigned int max, struct timespec *t)
 {
        struct posixaio_data *pd = td->io_ops->data;
+       struct aiocb *suspend_list[SUSPEND_ENTRIES];
        struct list_head *entry;
        struct timespec start;
        int have_timeout = 0;
        struct list_head *entry;
        struct timespec start;
        int have_timeout = 0;
+       int suspend_entries = 0;
        unsigned int r;
 
        if (t && !fill_timespec(&start))
                have_timeout = 1;
 
        r = 0;
        unsigned int r;
 
        if (t && !fill_timespec(&start))
                have_timeout = 1;
 
        r = 0;
+       memset(suspend_list, 0, sizeof(*suspend_list));
 restart:
        list_for_each(entry, &td->io_u_busylist) {
                struct io_u *io_u = list_entry(entry, struct io_u, list);
 restart:
        list_for_each(entry, &td->io_u_busylist) {
                struct io_u *io_u = list_entry(entry, struct io_u, list);
@@ -98,8 +103,13 @@ restart:
                        continue;
 
                err = aio_error(&io_u->aiocb);
                        continue;
 
                err = aio_error(&io_u->aiocb);
-               if (err == EINPROGRESS)
+               if (err == EINPROGRESS) {
+                       if (suspend_entries < SUSPEND_ENTRIES) {
+                               suspend_list[suspend_entries] = &io_u->aiocb;
+                               suspend_entries++;
+                       }
                        continue;
                        continue;
+               }
 
                io_u->seen = 1;
                pd->aio_events[r++] = io_u;
 
                io_u->seen = 1;
                pd->aio_events[r++] = io_u;
@@ -129,10 +139,10 @@ restart:
        }
 
        /*
        }
 
        /*
-        * hrmpf, we need to wait for more. we should use aio_suspend, for
-        * now just sleep a little and recheck status of busy-and-not-seen
+        * must have some in-flight, wait for at least one
         */
         */
-       usleep(1000);
+       aio_suspend((const struct aiocb * const *)suspend_list,
+                                                       suspend_entries, t);
        goto restart;
 }
 
        goto restart;
 }
 
@@ -174,7 +184,6 @@ static void fio_posixaio_cleanup(struct thread_data *td)
        if (pd) {
                free(pd->aio_events);
                free(pd);
        if (pd) {
                free(pd->aio_events);
                free(pd);
-               td->io_ops->data = NULL;
        }
 }
 
        }
 }