Fio 1.16.2
[fio.git] / log.c
diff --git a/log.c b/log.c
index 45be5fb6fdb94f718d3603bd769226f50abf7802..5ed30eb6f103efb8ed6150d04a807a9dc018ef63 100644 (file)
--- 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,15 @@ 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
+                */
+               if (!io_u->file)
+                       io_u->file = &td->files[0];
                free(ipo);
                return 0;
        }
@@ -135,6 +162,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;
@@ -152,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;
 
@@ -166,6 +194,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");
@@ -188,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;