X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=iolog.c;h=cf264916a9ecd83f7b3079bd186573441dba65fb;hb=d7e3adb683f85e49e078599a08aec7cd7c32d977;hp=b72dcf9791cfa242ceace8b4080a03934e9fa554;hpb=9617ecf415bd092a9603ac956ea9e8b00e11bdb7;p=fio.git diff --git a/iolog.c b/iolog.c index b72dcf97..cf264916 100644 --- a/iolog.c +++ b/iolog.c @@ -19,6 +19,7 @@ #include "smalloc.h" #include "blktrace.h" #include "pshared.h" +#include "lib/roundup.h" #include #include @@ -173,6 +174,7 @@ int read_iolog_get(struct thread_data *td, struct io_u *io_u) io_u->ddir = ipo->ddir; if (ipo->ddir != DDIR_WAIT) { io_u->offset = ipo->offset; + io_u->verify_offset = ipo->offset; io_u->buflen = ipo->len; io_u->file = td->files[ipo->fileno]; get_file(io_u->file); @@ -342,6 +344,9 @@ void trim_io_piece(const struct io_u *io_u) void write_iolog_close(struct thread_data *td) { + if (!td->iolog_f) + return; + fflush(td->iolog_f); fclose(td->iolog_f); free(td->iolog_buf); @@ -602,12 +607,11 @@ static int open_socket(const char *path) /* * open iolog, check version, and call appropriate parser */ -static bool init_iolog_read(struct thread_data *td) +static bool init_iolog_read(struct thread_data *td, char *fname) { - char buffer[256], *p, *fname; + char buffer[256], *p; FILE *f = NULL; - fname = get_name_by_idx(td->o.read_iolog_file, td->subjob_number); dprint(FD_IO, "iolog: name=%s\n", fname); if (is_socket(fname)) { @@ -616,6 +620,8 @@ static bool init_iolog_read(struct thread_data *td) fd = open_socket(fname); if (fd >= 0) f = fdopen(fd, "r"); + } else if (!strcmp(fname, "-")) { + f = stdin; } else f = fopen(fname, "r"); @@ -694,15 +700,16 @@ bool init_iolog(struct thread_data *td) if (td->o.read_iolog_file) { int need_swap; + char * fname = get_name_by_idx(td->o.read_iolog_file, td->subjob_number); /* * Check if it's a blktrace file and load that if possible. * Otherwise assume it's a normal log file and load that. */ - if (is_blktrace(td->o.read_iolog_file, &need_swap)) - ret = load_blktrace(td, td->o.read_iolog_file, need_swap); + if (is_blktrace(fname, &need_swap)) + ret = load_blktrace(td, fname, need_swap); else - ret = init_iolog_read(td); + ret = init_iolog_read(td, fname); } else if (td->o.write_iolog_file) ret = init_iolog_write(td); else @@ -745,10 +752,13 @@ void setup_log(struct io_log **log, struct log_params *p, } if (l->td && l->td->o.io_submit_mode != IO_MODE_OFFLOAD) { + unsigned int def_samples = DEF_LOG_ENTRIES; struct io_logs *__p; __p = calloc(1, sizeof(*l->pending)); - __p->max_samples = DEF_LOG_ENTRIES; + if (l->td->o.iodepth > DEF_LOG_ENTRIES) + def_samples = roundup_pow2(l->td->o.iodepth); + __p->max_samples = def_samples; __p->log = calloc(__p->max_samples, log_entry_sz(l)); l->pending = __p; } @@ -896,18 +906,18 @@ void flush_samples(FILE *f, void *samples, uint64_t sample_size) s = __get_sample(samples, log_offset, i); if (!log_offset) { - fprintf(f, "%lu, %" PRId64 ", %u, %llu\n", + fprintf(f, "%lu, %" PRId64 ", %u, %llu, %u\n", (unsigned long) s->time, s->data.val, - io_sample_ddir(s), (unsigned long long) s->bs); + io_sample_ddir(s), (unsigned long long) s->bs, s->priority_bit); } else { struct io_sample_offset *so = (void *) s; - fprintf(f, "%lu, %" PRId64 ", %u, %llu, %llu\n", + fprintf(f, "%lu, %" PRId64 ", %u, %llu, %llu, %u\n", (unsigned long) s->time, s->data.val, io_sample_ddir(s), (unsigned long long) s->bs, - (unsigned long long) so->offset); + (unsigned long long) so->offset, s->priority_bit); } } }