X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=ioengines.c;h=8073d1b74dc8ca0a815b1dc4577953b39a804506;hp=662d55d7cf9d1087750a209fee471de0203dc532;hb=6d459ee7e90393af490a64709aec206d8a585ebd;hpb=2992b059b8f54ac91e723a8bde629b4d8fed513e diff --git a/ioengines.c b/ioengines.c index 662d55d7..8073d1b7 100644 --- a/ioengines.c +++ b/ioengines.c @@ -18,7 +18,7 @@ #include "fio.h" -static LIST_HEAD(engine_list); +static FLIST_HEAD(engine_list); static int check_engine_ops(struct ioengine_ops *ops) { @@ -58,24 +58,24 @@ static int check_engine_ops(struct ioengine_ops *ops) void unregister_ioengine(struct ioengine_ops *ops) { dprint(FD_IO, "ioengine %s unregistered\n", ops->name); - list_del(&ops->list); - INIT_LIST_HEAD(&ops->list); + flist_del(&ops->list); + INIT_FLIST_HEAD(&ops->list); } void register_ioengine(struct ioengine_ops *ops) { dprint(FD_IO, "ioengine %s registered\n", ops->name); - INIT_LIST_HEAD(&ops->list); - list_add_tail(&ops->list, &engine_list); + INIT_FLIST_HEAD(&ops->list); + flist_add_tail(&ops->list, &engine_list); } static struct ioengine_ops *find_ioengine(const char *name) { struct ioengine_ops *ops; - struct list_head *entry; + struct flist_head *entry; - list_for_each(entry, &engine_list) { - ops = list_entry(entry, struct ioengine_ops, list); + flist_for_each(entry, &engine_list) { + ops = flist_entry(entry, struct ioengine_ops, list); if (!strcmp(name, ops->name)) return ops; } @@ -195,9 +195,13 @@ int td_io_getevents(struct thread_data *td, unsigned int min, unsigned int max, if (r < 0) goto out; } + if (max > td->cur_depth) + max = td->cur_depth; + if (min > max) + max = min; r = 0; - if (td->io_ops->getevents) + if (max && td->io_ops->getevents) r = td->io_ops->getevents(td, min, max, t); out: if (r >= 0) @@ -222,16 +226,15 @@ int td_io_queue(struct thread_data *td, struct io_u *io_u) io_u->resid = 0; if (td->io_ops->flags & FIO_SYNCIO) { - fio_gettime(&io_u->issue_time, NULL); - memcpy(&td->last_issue, &io_u->issue_time, - sizeof(struct timeval)); + if (fio_fill_issue_time(td)) + fio_gettime(&io_u->issue_time, NULL); /* - * for a sync engine, set the timeout upfront + * only used for iolog */ - if (mtime_since(&td->timeout_end, &io_u->issue_time) - < IO_U_TIMEOUT) - io_u_set_timeout(td); + if (td->o.read_iolog_file) + memcpy(&td->last_issue, &io_u->issue_time, + sizeof(struct timeval)); } if (io_u->ddir != DDIR_SYNC) @@ -267,18 +270,15 @@ int td_io_queue(struct thread_data *td, struct io_u *io_u) } if ((td->io_ops->flags & FIO_SYNCIO) == 0) { - fio_gettime(&io_u->issue_time, NULL); - memcpy(&td->last_issue, &io_u->issue_time, - sizeof(struct timeval)); + if (fio_fill_issue_time(td)) + fio_gettime(&io_u->issue_time, NULL); /* - * async engine, set the timeout here + * only used for iolog */ - if (ret == FIO_Q_QUEUED && - (mtime_since(&td->timeout_end, &io_u->issue_time) - < IO_U_TIMEOUT)) { - io_u_set_timeout(td); - } + if (td->o.read_iolog_file) + memcpy(&td->last_issue, &io_u->issue_time, + sizeof(struct timeval)); } return ret; @@ -329,6 +329,13 @@ int td_io_open_file(struct thread_data *td, struct fio_file *f) return 1; } + fio_file_reset(f); + f->flags |= FIO_FILE_OPEN; + f->flags &= ~FIO_FILE_CLOSING; + + td->nr_open_files++; + get_file(f); + if (f->filetype == FIO_TYPE_PIPE) { if (td_random(td)) { log_err("fio: can't seek on pipes (no random io)\n"); @@ -336,10 +343,6 @@ int td_io_open_file(struct thread_data *td, struct fio_file *f) } } - fio_file_reset(f); - f->flags |= FIO_FILE_OPEN; - f->flags &= ~FIO_FILE_CLOSING; - if (td->io_ops->flags & FIO_DISKLESSIO) goto done; @@ -362,12 +365,25 @@ int td_io_open_file(struct thread_data *td, struct fio_file *f) } if (f->file_map) - memset(f->file_map, 0, f->num_maps * sizeof(long)); + memset(f->file_map, 0, f->num_maps * sizeof(int)); + +#ifdef FIO_OS_DIRECTIO + /* + * Some OS's have a distinct call to mark the file non-buffered, + * instead of using O_DIRECT (Solaris) + */ + if (td->o.odirect) { + int ret = fio_set_odirect(f->fd); + + if (ret) { + td_verror(td, ret, "fio_set_odirect"); + goto err; + } + } +#endif done: log_file(td, f, FIO_LOG_OPEN_FILE); - td->nr_open_files++; - get_file(f); return 0; err: if (td->io_ops->close_file)