X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=engines%2Fposixaio.c;h=acd215c2f9f01a27bce0fa2b4f3a0ea7a438e8d7;hp=65a88e90756ceeb6b8640a99aff46d752abd0a80;hb=2992b059b8f54ac91e723a8bde629b4d8fed513e;hpb=e7d2e61694c62b90a2fb84c012b4edcc1973d72c diff --git a/engines/posixaio.c b/engines/posixaio.c index 65a88e90..acd215c2 100644 --- a/engines/posixaio.c +++ b/engines/posixaio.c @@ -76,18 +76,24 @@ static int fio_posixaio_prep(struct thread_data fio_unused *td, 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; + struct aiocb *suspend_list[SUSPEND_ENTRIES]; struct list_head *entry; struct timespec start; - int r, have_timeout = 0; + int have_timeout = 0; + int suspend_entries = 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); @@ -97,8 +103,13 @@ restart: 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; + } io_u->seen = 1; pd->aio_events[r++] = io_u; @@ -128,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; } @@ -173,7 +184,6 @@ static void fio_posixaio_cleanup(struct thread_data *td) if (pd) { free(pd->aio_events); free(pd); - td->io_ops->data = NULL; } }