X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=ioengines.c;h=9c5ac603d3291c04c7d754fdc8ddea56389b0d5d;hp=07d1d5678986cbe86fd3c87eae1c3a413526ba2a;hb=50a8ce864e2c5bee7c44935b39b357aa8071615b;hpb=1f440ece6127d2d274b961b6af0aa9091787702a diff --git a/ioengines.c b/ioengines.c index 07d1d567..9c5ac603 100644 --- a/ioengines.c +++ b/ioengines.c @@ -264,13 +264,15 @@ out: int td_io_queue(struct thread_data *td, struct io_u *io_u) { + const enum fio_ddir ddir = acct_ddir(io_u); + unsigned long buflen = io_u->xfer_buflen; int ret; dprint_io_u(io_u, "queue"); fio_ro_check(td, io_u); assert((io_u->flags & IO_U_F_FLIGHT) == 0); - io_u->flags |= IO_U_F_FLIGHT; + io_u_set(io_u, IO_U_F_FLIGHT); assert(fio_file_open(io_u->file)); @@ -294,13 +296,22 @@ int td_io_queue(struct thread_data *td, struct io_u *io_u) sizeof(struct timeval)); } - if (ddir_rw(acct_ddir(io_u))) - td->io_issues[acct_ddir(io_u)]++; + if (ddir_rw(ddir)) { + td->io_issues[ddir]++; + td->io_issue_bytes[ddir] += buflen; + td->rate_io_issue_bytes[ddir] += buflen; + } ret = td->io_ops->queue(td, io_u); unlock_file(td, io_u->file); + if (ret == FIO_Q_BUSY && ddir_rw(ddir)) { + td->io_issues[ddir]--; + td->io_issue_bytes[ddir] -= buflen; + td->rate_io_issue_bytes[ddir] -= buflen; + } + /* * If an error was seen and the io engine didn't propagate it * back to 'td', do so. @@ -318,10 +329,11 @@ int td_io_queue(struct thread_data *td, struct io_u *io_u) td->o.odirect) { log_info("fio: first direct IO errored. File system may not " - "support direct IO, or iomem_align= is bad.\n"); + "support direct IO, or iomem_align= is bad. Try " + "setting direct=0.\n"); } - if (!td->io_ops->commit || ddir_trim(io_u->ddir)) { + if (!td->io_ops->commit || io_u->ddir == DDIR_TRIM) { io_u_mark_submit(td, 1); io_u_mark_complete(td, 1); } @@ -461,6 +473,17 @@ int td_io_open_file(struct thread_data *td, struct fio_file *f) goto err; } } +#ifdef FIO_HAVE_STREAMID + if (td->o.fadvise_stream && + (f->filetype == FIO_TYPE_BD || 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) { + td_verror(td, errno, "fadvise streamid"); + goto err; + } + } +#endif #ifdef FIO_OS_DIRECTIO /*