X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=ioengines.c;h=5dd4355d29467f1156c71014323f4160987032e3;hb=2e976800fe74a58fadbbd9b069c01120b48cf9f0;hp=280da3c8262457451d776b67ac34093ed2c3c24b;hpb=d46b4565dfdaddbfdd91976a57b2564aa7a52f62;p=fio.git diff --git a/ioengines.c b/ioengines.c index 280da3c8..5dd4355d 100644 --- a/ioengines.c +++ b/ioengines.c @@ -17,6 +17,7 @@ #include #include #include +#include #include "fio.h" #include "diskutil.h" @@ -342,8 +343,13 @@ enum fio_q_status td_io_queue(struct thread_data *td, struct io_u *io_u) * flag is now set */ if (td_offload_overlap(td)) { - int res = pthread_mutex_unlock(&overlap_check); - assert(res == 0); + int res; + + res = pthread_mutex_unlock(&overlap_check); + if (fio_unlikely(res != 0)) { + log_err("failed to unlock overlap check mutex, err: %i:%s", errno, strerror(errno)); + abort(); + } } assert(fio_file_open(io_u->file)); @@ -358,15 +364,16 @@ enum fio_q_status td_io_queue(struct thread_data *td, struct io_u *io_u) if (td_ioengine_flagged(td, FIO_SYNCIO) || async_ioengine_sync_trim(td, io_u)) { - if (fio_fill_issue_time(td)) + if (fio_fill_issue_time(td)) { 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 +413,7 @@ enum fio_q_status td_io_queue(struct thread_data *td, struct io_u *io_u) if (io_u->error == EINVAL && td->io_issues[io_u->ddir & 1] == 1 && td->o.odirect) { - log_info("fio: first direct IO errored. File system may not " + log_err("fio: first direct IO errored. File system may not " "support direct IO, or iomem_align= is bad, or " "invalid block size. Try setting direct=0.\n"); } @@ -414,7 +421,7 @@ enum fio_q_status td_io_queue(struct thread_data *td, struct io_u *io_u) if (zbd_unaligned_write(io_u->error) && td->io_issues[io_u->ddir & 1] == 1 && td->o.zone_mode != ZONE_MODE_ZBD) { - log_info("fio: first I/O failed. If %s is a zoned block device, consider --zonemode=zbd\n", + log_err("fio: first I/O failed. If %s is a zoned block device, consider --zonemode=zbd\n", io_u->file->file_name); } @@ -442,15 +449,17 @@ enum fio_q_status td_io_queue(struct thread_data *td, struct io_u *io_u) if (!td_ioengine_flagged(td, FIO_SYNCIO) && !async_ioengine_sync_trim(td, io_u)) { - if (fio_fill_issue_time(td)) + if (fio_fill_issue_time(td) && + !td_ioengine_flagged(td, FIO_ASYNCIO_SETS_ISSUE_TIME)) { 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; @@ -562,6 +571,10 @@ int td_io_open_file(struct thread_data *td, struct fio_file *f) flags = POSIX_FADV_RANDOM; else if (td->o.fadvise_hint == F_ADV_SEQUENTIAL) flags = POSIX_FADV_SEQUENTIAL; +#ifdef POSIX_FADV_NOREUSE + else if (td->o.fadvise_hint == F_ADV_NOREUSE) + flags = POSIX_FADV_NOREUSE; +#endif else { log_err("fio: unknown fadvise type %d\n", td->o.fadvise_hint); @@ -577,19 +590,21 @@ int td_io_open_file(struct thread_data *td, struct fio_file *f) if (fio_option_is_set(&td->o, write_hint) && (f->filetype == FIO_TYPE_BLOCK || f->filetype == FIO_TYPE_FILE)) { uint64_t hint = td->o.write_hint; - int cmd; + int res; /* - * For direct IO, we just need/want to set the hint on - * the file descriptor. For buffered IO, we need to set - * it on the inode. + * For direct IO, set the hint on the file descriptor if that is + * supported. Otherwise set it on the inode. For buffered IO, we + * need to set it on the inode. */ - if (td->o.odirect) - cmd = F_SET_FILE_RW_HINT; - else - cmd = F_SET_RW_HINT; - - if (fcntl(f->fd, cmd, &hint) < 0) { + if (td->o.odirect) { + res = fcntl(f->fd, F_SET_FILE_RW_HINT, &hint); + if (res < 0) + res = fcntl(f->fd, F_SET_RW_HINT, &hint); + } else { + res = fcntl(f->fd, F_SET_RW_HINT, &hint); + } + if (res < 0) { td_verror(td, errno, "fcntl write hint"); goto err; }