X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=iolog.c;h=fa40c8572664a4e14d1e53d39eae3547dc43b672;hp=0f95c6080ea8d49fde24e868af82369d1dc7be2e;hb=9107a641e67f27003fa6cbe7b55b1ec6a0239197;hpb=71e6e5a2fd5c00ee42ecac36037a539fcad1efae diff --git a/iolog.c b/iolog.c index 0f95c608..fa40c857 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); @@ -447,7 +452,7 @@ static bool read_iolog2(struct thread_data *td) dprint(FD_FILE, "iolog: ignoring" " re-add of file %s\n", fname); } else { - fileno = add_file(td, fname, 0, 1); + fileno = add_file(td, fname, td->subjob_number, 1); file_action = FIO_LOG_ADD_FILE; } continue; @@ -566,7 +571,9 @@ static bool read_iolog2(struct thread_data *td) static bool is_socket(const char *path) { struct stat buf; - int r = stat(path, &buf); + int r; + + r = stat(path, &buf); if (r == -1) return false; @@ -575,16 +582,25 @@ static bool is_socket(const char *path) static int open_socket(const char *path) { - int fd = socket(AF_UNIX, SOCK_STREAM, 0); struct sockaddr_un addr; + int ret, fd; + + fd = socket(AF_UNIX, SOCK_STREAM, 0); if (fd < 0) return fd; + addr.sun_family = AF_UNIX; - strncpy(addr.sun_path, path, sizeof(addr.sun_path)); - if (connect(fd, (const struct sockaddr *)&addr, strlen(path) + sizeof(addr.sun_family)) == 0) + if (snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", path) >= + sizeof(addr.sun_path)) { + log_err("%s: path name %s is too long for a Unix socket\n", + __func__, path); + } + + ret = connect(fd, (const struct sockaddr *)&addr, strlen(path) + sizeof(addr.sun_family)); + if (!ret) return fd; - else - close(fd); + + close(fd); return -1; } @@ -593,16 +609,25 @@ static int open_socket(const char *path) */ static bool init_iolog_read(struct thread_data *td) { - char buffer[256], *p; + char buffer[256], *p, *fname; FILE *f = NULL; - bool ret; - if (is_socket(td->o.read_iolog_file)) { - int fd = open_socket(td->o.read_iolog_file); - if (fd >= 0) { + + 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)) { + int fd; + + fd = open_socket(fname); + if (fd >= 0) f = fdopen(fd, "r"); - } + } else if (!strcmp(fname, "-")) { + f = stdin; } else - f = fopen(td->o.read_iolog_file, "r"); + f = fopen(fname, "r"); + + free(fname); + if (!f) { perror("fopen read iolog"); return false; @@ -615,21 +640,20 @@ static bool init_iolog_read(struct thread_data *td) fclose(f); return false; } - td->io_log_rfile = f; + /* * version 2 of the iolog stores a specific string as the * first line, check for that */ if (!strncmp(iolog_ver2, buffer, strlen(iolog_ver2))) { free_release_files(td); - ret = read_iolog2(td); - } - else { - log_err("fio: iolog version 1 is no longer supported\n"); - ret = false; + td->io_log_rfile = f; + return read_iolog2(td); } - return ret; + log_err("fio: iolog version 1 is no longer supported\n"); + fclose(f); + return false; } /* @@ -728,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; } @@ -879,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); } } }