X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=log.c;h=6c7c4d6b2680546663eeac7d179b2e11917b7997;hp=2b90f452e8c22bca740b235ebb26094a12892574;hb=8de8f047bd025f12d23cfc3fc1793434c6d8ff94;hpb=4b87898e8d76aaf05baec83077a11311c1447397 diff --git a/log.c b/log.c index 2b90f452..6c7c4d6b 100644 --- a/log.c +++ b/log.c @@ -43,16 +43,33 @@ 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) { + 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 +77,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); @@ -113,7 +128,7 @@ static int init_iolog_read(struct thread_data *td) reads++; else if (rw == DDIR_WRITE) writes++; - else { + else if (rw != DDIR_SYNC) { log_err("bad ddir: %d\n", rw); continue; }