X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=log.c;h=fbc407d221f3b1e1bbee83c453e44085b95df1ce;hp=d59c38fd4e7cee46aa8f199b7f570e8c93b23501;hb=fdefd987d7ba284c7a9e101911c4b8e72fe326ad;hpb=c38e946828472daf5cd0450401a7aba06cda7f60 diff --git a/log.c b/log.c index d59c38fd..fbc407d2 100644 --- a/log.c +++ b/log.c @@ -19,6 +19,11 @@ int read_iolog_get(struct thread_data *td, struct io_u *io_u) io_u->buflen = ipo->len; io_u->ddir = ipo->ddir; io_u->file = ipo->file; + /* + * work around, this needs a format change to work for > 1 file + */ + if (!io_u->file) + io_u->file = &td->files[0]; free(ipo); return 0; } @@ -43,16 +48,34 @@ void prune_io_piece_log(struct thread_data *td) */ void log_io_piece(struct thread_data *td, struct io_u *io_u) { - struct rb_node **p = &td->io_hist_tree.rb_node; - struct rb_node *parent = NULL; + struct rb_node **p, *parent; struct io_piece *ipo, *__ipo; ipo = malloc(sizeof(struct io_piece)); - memset(&ipo->rb_node, 0, sizeof(ipo->rb_node)); ipo->file = io_u->file; ipo->offset = io_u->offset; ipo->len = io_u->buflen; + /* + * We don't need to sort the entries, if: + * + * Sequential writes, or + * Random writes that lay out the file as it goes along + * + * For both these cases, just reading back data in the order we + * wrote it out is the fastest. + */ + if (!td_random(td) || !td->o.overwrite || + (io_u->file->flags & FIO_FILE_NOSORT)) { + INIT_LIST_HEAD(&ipo->list); + list_add_tail(&ipo->list, &td->io_hist_list); + return; + } + + RB_CLEAR_NODE(&ipo->rb_node); + p = &td->io_hist_tree.rb_node; + parent = NULL; + /* * Sort the entry into the verification list */ @@ -60,12 +83,10 @@ void log_io_piece(struct thread_data *td, struct io_u *io_u) parent = *p; __ipo = rb_entry(parent, struct io_piece, rb_node); - if (ipo->offset < __ipo->offset) + if (ipo->offset <= __ipo->offset) p = &(*p)->rb_left; - else if (ipo->offset > __ipo->offset) - p = &(*p)->rb_right; else - break; + p = &(*p)->rb_right; } rb_link_node(&ipo->rb_node, parent, p); @@ -119,6 +140,7 @@ static int init_iolog_read(struct thread_data *td) } ipo = malloc(sizeof(*ipo)); + memset(ipo, 0, sizeof(*ipo)); INIT_LIST_HEAD(&ipo->list); ipo->offset = offset; ipo->len = bytes; @@ -150,6 +172,11 @@ static int init_iolog_write(struct thread_data *td) { FILE *f; + if (td->o.nr_files > 1) { + log_err("fio: write_iolog only works with 1 file currently\n"); + return 1; + } + f = fopen(td->o.write_iolog_file, "w+"); if (!f) { perror("fopen write iolog"); @@ -172,9 +199,16 @@ int init_iolog(struct thread_data *td) if (td->io_ops->flags & FIO_DISKLESSIO) return 0; - if (td->o.read_iolog_file) - ret = init_iolog_read(td); - else if (td->o.write_iolog_file) + if (td->o.read_iolog_file) { + /* + * 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)) + ret = load_blktrace(td, td->o.read_iolog_file); + else + ret = init_iolog_read(td); + } else if (td->o.write_iolog_file) ret = init_iolog_write(td); return ret;