X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=ioengines.c;h=bb46c293e3aed69dffd681095381fc1cd4a39344;hp=5a321653418b97a467fb833107e7e3d120177321;hb=87dc1ab1b4df7b977f60e3d43533a896e2ee665b;hpb=10ba535a5cbb95b5576e33a6f8af093a6ca3bfd7 diff --git a/ioengines.c b/ioengines.c index 5a321653..bb46c293 100644 --- a/ioengines.c +++ b/ioengines.c @@ -14,9 +14,34 @@ #include #include #include + #include "fio.h" #include "os.h" +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, char *name) { char engine[16], engine_lib[256]; @@ -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; @@ -80,8 +113,40 @@ int td_io_prep(struct thread_data *td, struct io_u *io_u) int td_io_sync(struct thread_data *td, struct fio_file *f) { - if (td->io_ops->sync) - return td->io_ops->sync(td, f); + struct io_u *io_u = __get_io_u(td); + struct io_completion_data icd; + int ret; + + if (!io_u) + return 1; + + io_u->ddir = DDIR_SYNC; + io_u->file = f; + + if (td_io_prep(td, io_u)) { + put_io_u(td, io_u); + return 1; + } + + ret = td_io_queue(td, io_u); + if (ret) { + put_io_u(td, io_u); + td_verror(td, ret); + return 1; + } + + ret = td_io_getevents(td, 1, td->cur_depth, NULL); + if (ret < 0) { + td_verror(td, -ret); + return 1; + } + + icd.nr = ret; + ios_completed(td, &icd); + if (icd.error) { + td_verror(td, icd.error); + return 1; + } return 0; } @@ -98,3 +163,11 @@ int td_io_queue(struct thread_data *td, struct io_u *io_u) 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; +}