projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'master' of https://github.com/bvanassche/fio
[fio.git]
/
ioengines.c
diff --git
a/ioengines.c
b/ioengines.c
index c688dd1d359238a4011e2979ba6ed08a24ad3234..e2316ee4e391d0d5899c960552fec4d19aa33ca2 100644
(file)
--- a/
ioengines.c
+++ b/
ioengines.c
@@
-24,6
+24,13
@@
static FLIST_HEAD(engine_list);
static FLIST_HEAD(engine_list);
+static inline bool async_ioengine_sync_trim(struct thread_data *td,
+ struct io_u *io_u)
+{
+ return td_ioengine_flagged(td, FIO_ASYNCIO_SYNC_TRIM) &&
+ io_u->ddir == DDIR_TRIM;
+}
+
static bool check_engine_ops(struct thread_data *td, struct ioengine_ops *ops)
{
if (ops->version != FIO_IOOPS_VERSION) {
static bool check_engine_ops(struct thread_data *td, struct ioengine_ops *ops)
{
if (ops->version != FIO_IOOPS_VERSION) {
@@
-95,6
+102,7
@@
static void *dlopen_external(struct thread_data *td, const char *engine)
sprintf(engine_path, "%s/fio-%s.so", FIO_EXT_ENG_DIR, engine);
sprintf(engine_path, "%s/fio-%s.so", FIO_EXT_ENG_DIR, engine);
+ dprint(FD_IO, "dlopen external %s\n", engine_path);
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",
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",
@@
-112,7
+120,11
@@
static struct ioengine_ops *dlopen_ioengine(struct thread_data *td,
struct ioengine_ops *ops;
void *dlhandle;
struct ioengine_ops *ops;
void *dlhandle;
- dprint(FD_IO, "dload engine %s\n", engine_lib);
+ if (!strncmp(engine_lib, "linuxaio", 8) ||
+ !strncmp(engine_lib, "aio", 3))
+ engine_lib = "libaio";
+
+ dprint(FD_IO, "dlopen engine %s\n", engine_lib);
dlerror();
dlhandle = dlopen(engine_lib, RTLD_LAZY);
dlerror();
dlhandle = dlopen(engine_lib, RTLD_LAZY);
@@
-151,7
+163,7
@@
static struct ioengine_ops *dlopen_ioengine(struct thread_data *td,
return NULL;
}
return NULL;
}
-
td->io_ops_
dlhandle = dlhandle;
+
ops->
dlhandle = dlhandle;
return ops;
}
return ops;
}
@@
-160,7
+172,7
@@
static struct ioengine_ops *__load_ioengine(const char *engine)
/*
* linux libaio has alias names, so convert to what we want
*/
/*
* linux libaio has alias names, so convert to what we want
*/
- if (!strncmp(engine, "linuxaio", 8)) {
+ if (!strncmp(engine, "linuxaio", 8)
|| !strncmp(engine, "aio", 3)
) {
dprint(FD_IO, "converting ioengine name: %s -> libaio\n",
engine);
engine = "libaio";
dprint(FD_IO, "converting ioengine name: %s -> libaio\n",
engine);
engine = "libaio";
@@
-190,7
+202,9
@@
struct ioengine_ops *load_ioengine(struct thread_data *td)
* so as not to break job files not using the prefix.
*/
ops = __load_ioengine(td->o.ioengine);
* so as not to break job files not using the prefix.
*/
ops = __load_ioengine(td->o.ioengine);
- if (!ops)
+
+ /* We do re-dlopen existing handles, for reference counting */
+ if (!ops || ops->dlhandle)
ops = dlopen_ioengine(td, name);
/*
ops = dlopen_ioengine(td, name);
/*
@@
-216,6
+230,8
@@
struct ioengine_ops *load_ioengine(struct thread_data *td)
*/
void free_ioengine(struct thread_data *td)
{
*/
void free_ioengine(struct thread_data *td)
{
+ assert(td != NULL && td->io_ops != NULL);
+
dprint(FD_IO, "free ioengine %s\n", td->io_ops->name);
if (td->eo && td->io_ops->options) {
dprint(FD_IO, "free ioengine %s\n", td->io_ops->name);
if (td->eo && td->io_ops->options) {
@@
-224,9
+240,9
@@
void free_ioengine(struct thread_data *td)
td->eo = NULL;
}
td->eo = NULL;
}
- if (td->io_ops
_
dlhandle) {
- d
lclose(td->io_ops_dlhandl
e);
-
td->io_ops_dlhandle = NULL
;
+ if (td->io_ops
->
dlhandle) {
+ d
print(FD_IO, "dlclose ioengine %s\n", td->io_ops->nam
e);
+
dlclose(td->io_ops->dlhandle)
;
}
td->io_ops = NULL;
}
td->io_ops = NULL;
@@
-341,17
+357,17
@@
enum fio_q_status td_io_queue(struct thread_data *td, struct io_u *io_u)
io_u->resid = 0;
if (td_ioengine_flagged(td, FIO_SYNCIO) ||
io_u->resid = 0;
if (td_ioengine_flagged(td, FIO_SYNCIO) ||
- (td_ioengine_flagged(td, FIO_ASYNCIO_SYNC_TRIM) &&
- io_u->ddir == DDIR_TRIM)) {
- if (fio_fill_issue_time(td))
+ async_ioengine_sync_trim(td, io_u)) {
+ if (fio_fill_issue_time(td)) {
fio_gettime(&io_u->issue_time, NULL);
fio_gettime(&io_u->issue_time, NULL);
- /*
- * only used for iolog
- */
- if (td->o.read_iolog_file)
- memcpy(&td->last_issue, &io_u->issue_time,
- sizeof(io_u->issue_time));
+ /*
+ * only used for iolog
+ */
+ if (td->o.read_iolog_file)
+ memcpy(&td->last_issue, &io_u->issue_time,
+ sizeof(io_u->issue_time));
+ }
}
}
@@
-406,7
+422,6
@@
enum fio_q_status td_io_queue(struct thread_data *td, struct io_u *io_u)
if (!td->io_ops->commit) {
io_u_mark_submit(td, 1);
io_u_mark_complete(td, 1);
if (!td->io_ops->commit) {
io_u_mark_submit(td, 1);
io_u_mark_complete(td, 1);
- zbd_put_io_u(td, io_u);
}
if (ret == FIO_Q_COMPLETED) {
}
if (ret == FIO_Q_COMPLETED) {
@@
-427,17
+442,18
@@
enum fio_q_status td_io_queue(struct thread_data *td, struct io_u *io_u)
}
if (!td_ioengine_flagged(td, FIO_SYNCIO) &&
}
if (!td_ioengine_flagged(td, FIO_SYNCIO) &&
- (!td_ioengine_flagged(td, FIO_ASYNCIO_SYNC_TRIM) ||
- io_u->ddir != DDIR_TRIM)) {
- if (fio_fill_issue_time(td))
+ !async_ioengine_sync_trim(td, io_u)) {
+ if (fio_fill_issue_time(td) &&
+ !td_ioengine_flagged(td, FIO_ASYNCIO_SETS_ISSUE_TIME)) {
fio_gettime(&io_u->issue_time, NULL);
fio_gettime(&io_u->issue_time, NULL);
- /*
- * only used for iolog
- */
- if (td->o.read_iolog_file)
- memcpy(&td->last_issue, &io_u->issue_time,
- sizeof(io_u->issue_time));
+ /*
+ * only used for iolog
+ */
+ if (td->o.read_iolog_file)
+ memcpy(&td->last_issue, &io_u->issue_time,
+ sizeof(io_u->issue_time));
+ }
}
return ret;
}
return ret;
@@
-686,17
+702,17
@@
int fio_show_ioengine_help(const char *engine)
}
td.o.ioengine = (char *)engine;
}
td.o.ioengine = (char *)engine;
- io_ops = load_ioengine(&td);
+
td.
io_ops = load_ioengine(&td);
- if (!io_ops) {
+ if (!
td.
io_ops) {
log_info("IO engine %s not found\n", engine);
return 1;
}
log_info("IO engine %s not found\n", engine);
return 1;
}
- if (io_ops->options)
- ret = show_cmd_help(io_ops->options, sep);
+ if (
td.
io_ops->options)
+ ret = show_cmd_help(
td.
io_ops->options, sep);
else
else
- log_info("IO engine %s has no options\n", io_ops->name);
+ log_info("IO engine %s has no options\n",
td.
io_ops->name);
free_ioengine(&td);
return ret;
free_ioengine(&td);
return ret;