X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=ioengines.c;h=1c5970a4b5a188e5f4aa5f924b483c976a04142f;hb=b6b64bfec2dd4ce7db64c57ecf771bb7b2f105f6;hp=aa4ccd2755c96f843d69333448795b0b16061723;hpb=04ba61dfa67784d4dfcc22a2b3de7ede28e22e40;p=fio.git diff --git a/ioengines.c b/ioengines.c index aa4ccd27..1c5970a4 100644 --- a/ioengines.c +++ b/ioengines.c @@ -75,6 +75,25 @@ static struct ioengine_ops *find_ioengine(const char *name) return NULL; } +#ifdef CONFIG_DYNAMIC_ENGINES +static void *dlopen_external(struct thread_data *td, const char *engine) +{ + char engine_path[PATH_MAX]; + void *dlhandle; + + sprintf(engine_path, "%s/lib%s.so", FIO_EXT_ENG_DIR, engine); + + dlhandle = dlopen(engine_path, RTLD_LAZY); + if (!dlhandle) + log_info("Engine %s not found; Either name is invalid, was not built, or fio-engine-%s package is missing.\n", + engine, engine); + + return dlhandle; +} +#else +#define dlopen_external(td, engine) (NULL) +#endif + static struct ioengine_ops *dlopen_ioengine(struct thread_data *td, const char *engine_lib) { @@ -86,8 +105,11 @@ static struct ioengine_ops *dlopen_ioengine(struct thread_data *td, dlerror(); dlhandle = dlopen(engine_lib, RTLD_LAZY); if (!dlhandle) { - td_vmsg(td, -1, dlerror(), "dlopen"); - return NULL; + dlhandle = dlopen_external(td, engine_lib); + if (!dlhandle) { + td_vmsg(td, -1, dlerror(), "dlopen"); + return NULL; + } } /* @@ -121,19 +143,15 @@ static struct ioengine_ops *dlopen_ioengine(struct thread_data *td, return ops; } -static struct ioengine_ops *__load_ioengine(const char *name) +static struct ioengine_ops *__load_ioengine(const char *engine) { - char engine[64]; - - engine[sizeof(engine) - 1] = '\0'; - strncpy(engine, name, sizeof(engine) - 1); - /* * linux libaio has alias names, so convert to what we want */ if (!strncmp(engine, "linuxaio", 8)) { - dprint(FD_IO, "converting ioengine name: %s -> libaio\n", name); - strcpy(engine, "libaio"); + dprint(FD_IO, "converting ioengine name: %s -> libaio\n", + engine); + engine = "libaio"; } dprint(FD_IO, "load ioengine %s\n", engine); @@ -295,8 +313,10 @@ enum fio_q_status td_io_queue(struct thread_data *td, struct io_u *io_u) * started the overlap check because the IO_U_F_FLIGHT * flag is now set */ - if (td_offload_overlap(td)) - pthread_mutex_unlock(&overlap_check); + if (td_offload_overlap(td)) { + int res = pthread_mutex_unlock(&overlap_check); + assert(res == 0); + } assert(fio_file_open(io_u->file)); @@ -322,6 +342,7 @@ enum fio_q_status td_io_queue(struct thread_data *td, struct io_u *io_u) sizeof(io_u->issue_time)); } + if (ddir_rw(ddir)) { if (!(io_u->flags & IO_U_F_VER_LIST)) { td->io_issues[ddir]++; @@ -377,14 +398,16 @@ enum fio_q_status td_io_queue(struct thread_data *td, struct io_u *io_u) } if (ret == FIO_Q_COMPLETED) { - if (ddir_rw(io_u->ddir) || ddir_sync(io_u->ddir)) { + if (ddir_rw(io_u->ddir) || + (ddir_sync(io_u->ddir) && td->runstate != TD_FSYNCING)) { io_u_mark_depth(td, 1); td->ts.total_io_u[io_u->ddir]++; } } else if (ret == FIO_Q_QUEUED) { td->io_u_queued++; - if (ddir_rw(io_u->ddir) || ddir_sync(io_u->ddir)) + if (ddir_rw(io_u->ddir) || + (ddir_sync(io_u->ddir) && td->runstate != TD_FSYNCING)) td->ts.total_io_u[io_u->ddir]++; if (td->io_u_queued >= td->o.iodepth_batch)