X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=log.c;h=5ed30eb6f103efb8ed6150d04a807a9dc018ef63;hp=9669b4a7c336eb510a510679c7933d9e96c45bd1;hb=244e170ebd309303d124c57cde7bf7a3b40d09e7;hpb=733ed597a79e118bc2480974a4dc4676f2edede1 diff --git a/log.c b/log.c index 9669b4a7..5ed30eb6 100644 --- a/log.c +++ b/log.c @@ -8,6 +8,24 @@ void write_iolog_put(struct thread_data *td, struct io_u *io_u) fprintf(td->iolog_f, "%u,%llu,%lu\n", io_u->ddir, io_u->offset, io_u->buflen); } +static void iolog_delay(struct thread_data *td, unsigned long delay) +{ + unsigned long usec = utime_since_now(&td->last_issue); + + if (delay < usec) + return; + + delay -= usec; + + /* + * less than 100 usec delay, just regard it as noise + */ + if (delay < 100) + return; + + usec_sleep(td, delay); +} + int read_iolog_get(struct thread_data *td, struct io_u *io_u) { struct io_piece *ipo; @@ -19,6 +37,10 @@ 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; + + if (ipo->delay) + iolog_delay(td, ipo->delay); + /* * work around, this needs a format change to work for > 1 file */ @@ -158,7 +180,7 @@ static int init_iolog_read(struct thread_data *td) else if (reads && !writes) td->o.td_ddir = TD_DDIR_READ; else if (!reads && writes) - td->o.td_ddir = TD_DDIR_READ; + td->o.td_ddir = TD_DDIR_WRITE; else td->o.td_ddir = TD_DDIR_RW; @@ -199,9 +221,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;