X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=engines%2Ffio-engine-libaio.c;h=45e69e90b600704df35dfb1d2f23a91857531c7f;hp=c3fefdaccda7ea97cf660c0db4007b158807310e;hb=1e97cce9f5a87a67293a05ec4533ed6968698b2e;hpb=7313b48c3196b4750f4103e8622126039e2231c6 diff --git a/engines/fio-engine-libaio.c b/engines/fio-engine-libaio.c index c3fefdac..45e69e90 100644 --- a/engines/fio-engine-libaio.c +++ b/engines/fio-engine-libaio.c @@ -7,8 +7,11 @@ #include #include #include -#include "fio.h" -#include "os.h" + +#include "../fio.h" +#include "../os.h" + +#ifdef FIO_HAVE_LIBAIO #define ev_to_iou(ev) (struct io_u *) ((unsigned long) (ev)->obj) @@ -17,20 +20,18 @@ struct libaio_data { struct io_event *aio_events; }; -static int fio_libaio_sync(struct thread_data fio_unused *td, - struct fio_file *f) -{ - return fsync(f->fd); -} - static int fio_libaio_prep(struct thread_data fio_unused *td, struct io_u *io_u) { struct fio_file *f = io_u->file; if (io_u->ddir == DDIR_READ) io_prep_pread(&io_u->iocb, f->fd, io_u->buf, io_u->buflen, io_u->offset); - else + else if (io_u->ddir == DDIR_WRITE) io_prep_pwrite(&io_u->iocb, f->fd, io_u->buf, io_u->buflen, io_u->offset); + else if (io_u->ddir == DDIR_SYNC) + io_prep_fsync(&io_u->iocb, f->fd); + else + return 1; return 0; } @@ -55,10 +56,13 @@ static int fio_libaio_getevents(struct thread_data *td, int min, int max, continue; } else if (r == -EINTR) continue; - else + else if (r != 0) break; } while (1); + if (r < 0) + r = -r; + return (int) r; } @@ -72,7 +76,7 @@ static int fio_libaio_queue(struct thread_data *td, struct io_u *io_u) ret = io_submit(ld->aio_ctx, 1, &iocb); if (ret == 1) return 0; - else if (ret == -EAGAIN) + else if (ret == -EAGAIN || !ret) usleep(100); else if (ret == -EINTR) continue; @@ -80,8 +84,13 @@ static int fio_libaio_queue(struct thread_data *td, struct io_u *io_u) break; } while (1); - return (int) ret; + if (ret <= 0) { + io_u->resid = io_u->buflen; + io_u->error = -ret; + return 1; + } + return 0; } static int fio_libaio_cancel(struct thread_data *td, struct io_u *io_u) @@ -112,15 +121,17 @@ static int fio_libaio_init(struct thread_data *td) memset(ld, 0, sizeof(*ld)); if (io_queue_init(td->iodepth, &ld->aio_ctx)) { td_verror(td, errno); + free(ld); return 1; } ld->aio_events = malloc(td->iodepth * sizeof(struct io_event)); + memset(ld->aio_events, 0, td->iodepth * sizeof(struct io_event)); td->io_ops->data = ld; return 0; } -struct ioengine_ops ioengine = { +static struct ioengine_ops ioengine = { .name = "libaio", .version = FIO_IOOPS_VERSION, .init = fio_libaio_init, @@ -130,5 +141,35 @@ struct ioengine_ops ioengine = { .getevents = fio_libaio_getevents, .event = fio_libaio_event, .cleanup = fio_libaio_cleanup, - .sync = fio_libaio_sync, }; + +#else /* FIO_HAVE_LIBAIO */ + +/* + * When we have a proper configure system in place, we simply wont build + * and install this io engine. For now install a crippled version that + * just complains and fails to load. + */ +static int fio_libaio_init(struct thread_data fio_unused *td) +{ + fprintf(stderr, "fio: libaio not available\n"); + return 1; +} + +static struct ioengine_ops ioengine = { + .name = "libaio", + .version = FIO_IOOPS_VERSION, + .init = fio_libaio_init, +}; + +#endif + +static void fio_init fio_libaio_register(void) +{ + register_ioengine(&ioengine); +} + +static void fio_exit fio_libaio_unregister(void) +{ + unregister_ioengine(&ioengine); +}