X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=ioengines.c;h=c90a2ca5bde30e75dec5261130b6b77fb6a1999b;hp=ae55f951d413fbaeaf92dae3c8eb0746167d4c9d;hb=67202d0d5bf8c689cd17d302a7284ba1bb85162d;hpb=7903bf87725b18495a06f7199342f167147712eb diff --git a/ioengines.c b/ioengines.c index ae55f951..c90a2ca5 100644 --- a/ioengines.c +++ b/ioengines.c @@ -298,6 +298,7 @@ int td_io_queue(struct thread_data *td, struct io_u *io_u) td->io_issues[ddir]--; td->io_issue_bytes[ddir] -= buflen; td->rate_io_issue_bytes[ddir] -= buflen; + io_u_clear(td, io_u, IO_U_F_FLIGHT); } /* @@ -367,17 +368,17 @@ int td_io_init(struct thread_data *td) if (td->io_ops->init) { ret = td->io_ops->init(td); - if (ret && td->o.iodepth > 1) { - log_err("fio: io engine init failed. Perhaps try" - " reducing io depth?\n"); - } + if (ret) + log_err("fio: io engine %s init failed.%s\n", + td->io_ops->name, + td->o.iodepth > 1 ? + " Perhaps try reducing io depth?" : ""); + else + td->io_ops_init = 1; if (!td->error) td->error = ret; } - if (!ret && td_ioengine_flagged(td, FIO_NOIO)) - td->flags |= TD_F_NOIO; - return ret; } @@ -447,14 +448,24 @@ int td_io_open_file(struct thread_data *td, struct fio_file *f) if (td->o.invalidate_cache && file_invalidate_cache(td, f)) goto err; - if (td->o.fadvise_hint && - (f->filetype == FIO_TYPE_BD || f->filetype == FIO_TYPE_FILE)) { + if (td->o.fadvise_hint != F_ADV_NONE && + (f->filetype == FIO_TYPE_BLOCK || f->filetype == FIO_TYPE_FILE)) { int flags; - if (td_random(td)) + if (td->o.fadvise_hint == F_ADV_TYPE) { + if (td_random(td)) + flags = POSIX_FADV_RANDOM; + else + flags = POSIX_FADV_SEQUENTIAL; + } else if (td->o.fadvise_hint == F_ADV_RANDOM) flags = POSIX_FADV_RANDOM; - else + else if (td->o.fadvise_hint == F_ADV_SEQUENTIAL) flags = POSIX_FADV_SEQUENTIAL; + else { + log_err("fio: unknown fadvise type %d\n", + td->o.fadvise_hint); + flags = POSIX_FADV_NORMAL; + } if (posix_fadvise(f->fd, f->file_offset, f->io_size, flags) < 0) { td_verror(td, errno, "fadvise"); @@ -463,7 +474,7 @@ int td_io_open_file(struct thread_data *td, struct fio_file *f) } #ifdef FIO_HAVE_STREAMID if (td->o.fadvise_stream && - (f->filetype == FIO_TYPE_BD || f->filetype == FIO_TYPE_FILE)) { + (f->filetype == FIO_TYPE_BLOCK || f->filetype == FIO_TYPE_FILE)) { off_t stream = td->o.fadvise_stream; if (posix_fadvise(f->fd, stream, f->io_size, POSIX_FADV_STREAMID) < 0) { @@ -483,7 +494,12 @@ int td_io_open_file(struct thread_data *td, struct fio_file *f) if (ret) { td_verror(td, ret, "fio_set_odirect"); - log_err("fio: the file system does not seem to support direct IO\n"); + if (ret == ENOTTY) { /* ENOTTY suggests RAW device or ZFS */ + log_err("fio: doing directIO to RAW devices or ZFS not supported\n"); + } else { + log_err("fio: the file system does not seem to support direct IO\n"); + } + goto err; } } @@ -540,77 +556,19 @@ int td_io_get_file_size(struct thread_data *td, struct fio_file *f) return td->io_ops->get_file_size(td, f); } -static int do_sync_file_range(const struct thread_data *td, - struct fio_file *f) -{ - off64_t offset, nbytes; - - offset = f->first_write; - nbytes = f->last_write - f->first_write; - - if (!nbytes) - return 0; - - return sync_file_range(f->fd, offset, nbytes, td->o.sync_file_range); -} - -int do_io_u_sync(const struct thread_data *td, struct io_u *io_u) -{ - int ret; - - if (io_u->ddir == DDIR_SYNC) { - ret = fsync(io_u->file->fd); - } else if (io_u->ddir == DDIR_DATASYNC) { -#ifdef CONFIG_FDATASYNC - ret = fdatasync(io_u->file->fd); -#else - ret = io_u->xfer_buflen; - io_u->error = EINVAL; -#endif - } else if (io_u->ddir == DDIR_SYNC_FILE_RANGE) - ret = do_sync_file_range(td, io_u->file); - else { - ret = io_u->xfer_buflen; - io_u->error = EINVAL; - } - - if (ret < 0) - io_u->error = errno; - - return ret; -} - -int do_io_u_trim(const struct thread_data *td, struct io_u *io_u) -{ -#ifndef FIO_HAVE_TRIM - io_u->error = EINVAL; - return 0; -#else - struct fio_file *f = io_u->file; - int ret; - - ret = os_trim(f->fd, io_u->offset, io_u->xfer_buflen); - if (!ret) - return io_u->xfer_buflen; - - io_u->error = ret; - return 0; -#endif -} - int fio_show_ioengine_help(const char *engine) { struct flist_head *entry; struct thread_data td; + struct ioengine_ops *io_ops; char *sep; int ret = 1; if (!engine || !*engine) { log_info("Available IO engines:\n"); flist_for_each(entry, &engine_list) { - td.io_ops = flist_entry(entry, struct ioengine_ops, - list); - log_info("\t%s\n", td.io_ops->name); + io_ops = flist_entry(entry, struct ioengine_ops, list); + log_info("\t%s\n", io_ops->name); } return 0; } @@ -622,16 +580,16 @@ int fio_show_ioengine_help(const char *engine) memset(&td, 0, sizeof(td)); - td.io_ops = load_ioengine(&td, engine); - if (!td.io_ops) { + io_ops = load_ioengine(&td, engine); + if (!io_ops) { log_info("IO engine %s not found\n", engine); return 1; } - if (td.io_ops->options) - ret = show_cmd_help(td.io_ops->options, sep); + if (io_ops->options) + ret = show_cmd_help(io_ops->options, sep); else - log_info("IO engine %s has no options\n", td.io_ops->name); + log_info("IO engine %s has no options\n", io_ops->name); free_ioengine(&td);