X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=engines%2Flibaio.c;h=acc125f48e46df799c7d7fdcf0c42daea9694145;hp=9a644f6fe4d07d17be9997a7cc94c882c275cd3e;hb=8d714a60ae956c5758fe4b5a75aa6cc31ce7e9eb;hpb=cec6b55da1c282b5b91ad346c7804171fccf151e diff --git a/engines/libaio.c b/engines/libaio.c index 9a644f6f..acc125f4 100644 --- a/engines/libaio.c +++ b/engines/libaio.c @@ -18,6 +18,7 @@ struct libaio_data { io_context_t aio_ctx; struct io_event *aio_events; + struct io_u *sync_io_u; }; static int fio_libaio_prep(struct thread_data fio_unused *td, struct io_u *io_u) @@ -40,6 +41,13 @@ static struct io_u *fio_libaio_event(struct thread_data *td, int event) { struct libaio_data *ld = td->io_ops->data; + if (ld->sync_io_u) { + struct io_u *ret = ld->sync_io_u; + + ld->sync_io_u = NULL; + return ret; + } + return ev_to_iou(ld->aio_events + event); } @@ -49,6 +57,9 @@ static int fio_libaio_getevents(struct thread_data *td, int min, int max, struct libaio_data *ld = td->io_ops->data; long r; + if (ld->sync_io_u) + return 1; + do { r = io_getevents(ld->aio_ctx, min, max, ld->aio_events, t); if (r >= min) @@ -82,7 +93,18 @@ static int fio_libaio_queue(struct thread_data *td, struct io_u *io_u) usleep(100); else if (ret == -EINTR) continue; - else + else if (ret == -EINVAL && io_u->ddir == DDIR_SYNC) { + /* + * the async fsync doesn't currently seem to be + * supported, so just fsync if we fail with EINVAL + * for a sync. since buffered io is also sync + * with libaio (still), we don't have pending + * requests to flush first. + */ + ret = fsync(io_u->file->fd); + ld->sync_io_u = io_u; + break; + } else break; } while (1);