X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;ds=sidebyside;f=ioengines.c;h=96a96360750038ea87909c8fdfd45f36a89c9d13;hb=be67e2de7961e849d5ad82e8c9206377c325b7c8;hp=abc385303d86c466ba34ed261a5624e2546e03de;hpb=84585003d025a38b91749cb0d68f6b5653d1f1a3;p=fio.git diff --git a/ioengines.c b/ioengines.c index abc38530..96a96360 100644 --- a/ioengines.c +++ b/ioengines.c @@ -14,16 +14,41 @@ #include #include #include + #include "fio.h" #include "os.h" -struct ioengine_ops *load_ioengine(struct thread_data *td, char *name) +static int check_engine_ops(struct ioengine_ops *ops) +{ + /* + * cpu thread doesn't need to provide anything + */ + if (ops->flags & FIO_CPUIO) + return 0; + + if (!ops->event) { + log_err("%s: no event handler)\n", ops->name); + return 1; + } + if (!ops->getevents) { + log_err("%s: no getevents handler)\n", ops->name); + return 1; + } + if (!ops->queue) { + log_err("%s: no queue handler)\n", ops->name); + return 1; + } + + return 0; +} + +struct ioengine_ops *load_ioengine(struct thread_data *td, const char *name) { char engine[16], engine_lib[256]; struct ioengine_ops *ops, *ret; void *dlhandle; - strcpy(engine, name); + strncpy(engine, name, sizeof(engine) - 1); /* * linux libaio has alias names, so convert to what we want @@ -52,6 +77,14 @@ struct ioengine_ops *load_ioengine(struct thread_data *td, char *name) return NULL; } + /* + * Check that the required methods are there. + */ + if (check_engine_ops(ops)) { + dlclose(dlhandle); + return NULL; + } + ret = malloc(sizeof(*ret)); memcpy(ret, ops, sizeof(*ret)); ret->data = NULL; @@ -69,3 +102,32 @@ void close_ioengine(struct thread_data *td) free(td->io_ops); td->io_ops = NULL; } + +int td_io_prep(struct thread_data *td, struct io_u *io_u) +{ + if (td->io_ops->prep && td->io_ops->prep(td, io_u)) + return 1; + + return 0; +} + +int td_io_getevents(struct thread_data *td, int min, int max, + struct timespec *t) +{ + return td->io_ops->getevents(td, min, max, t); +} + +int td_io_queue(struct thread_data *td, struct io_u *io_u) +{ + gettimeofday(&io_u->issue_time, NULL); + + return td->io_ops->queue(td, io_u); +} + +int td_io_init(struct thread_data *td) +{ + if (td->io_ops->init) + return td->io_ops->init(td); + + return 0; +}