X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=ioengines.c;h=2969840706d18f75965c083c574531d9ff2fa7e0;hb=87c27b45f8d50720d7a9f12abc7e83d0a7463021;hp=3e17897653f6a8d57a6a18a3b65297bfdd72653c;hpb=01743ee1718e7ec4b16ae3e53c8f64900c6052cc;p=fio.git diff --git a/ioengines.c b/ioengines.c index 3e178976..29698407 100644 --- a/ioengines.c +++ b/ioengines.c @@ -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; @@ -364,10 +367,23 @@ 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(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) @@ -389,3 +405,11 @@ int td_io_close_file(struct thread_data *td, struct fio_file *f) return put_file(td, f); } + +int td_io_get_file_size(struct thread_data *td, struct fio_file *f) +{ + if (!td->io_ops->get_file_size) + return 0; + + return td->io_ops->get_file_size(td, f); +}