Fix io piece logging to not have O(n) runtime
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index 29fecb79d1203e9d93502ca1c685ab865412ab62..504b78db0b0cd6dc1390435f56fd89d6bf19345c 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -699,6 +699,7 @@ static int clear_io_state(struct thread_data *td)
        td->zone_bytes = 0;
        td->rate_bytes = 0;
        td->rate_blocks = 0;
+       td->rw_end_set[0] = td->rw_end_set[1] = 0;
 
        td->last_was_sync = 0;
 
@@ -723,6 +724,7 @@ static void *thread_main(void *data)
 {
        unsigned long long runtime[2];
        struct thread_data *td = data;
+       unsigned long elapsed;
        int clear_state;
 
        if (!td->o.use_thread)
@@ -733,7 +735,6 @@ static void *thread_main(void *data)
        INIT_LIST_HEAD(&td->io_u_freelist);
        INIT_LIST_HEAD(&td->io_u_busylist);
        INIT_LIST_HEAD(&td->io_u_requeues);
-       INIT_LIST_HEAD(&td->io_hist_list);
        INIT_LIST_HEAD(&td->io_log_list);
 
        if (init_io_u(td))
@@ -811,10 +812,22 @@ static void *thread_main(void *data)
 
                clear_state = 1;
 
-               if (td_read(td) && td->io_bytes[DDIR_READ])
-                       runtime[DDIR_READ] += utime_since_now(&td->start);
-               if (td_write(td) && td->io_bytes[DDIR_WRITE])
-                       runtime[DDIR_WRITE] += utime_since_now(&td->start);
+               if (td_read(td) && td->io_bytes[DDIR_READ]) {
+                       if (td->rw_end_set[DDIR_READ])
+                               elapsed = utime_since(&td->start, &td->rw_end[DDIR_READ]);
+                       else
+                               elapsed = utime_since_now(&td->start);
+
+                       runtime[DDIR_READ] += elapsed;
+               }
+               if (td_write(td) && td->io_bytes[DDIR_WRITE]) {
+                       if (td->rw_end_set[DDIR_WRITE])
+                               elapsed = utime_since(&td->start, &td->rw_end[DDIR_WRITE]);
+                       else
+                               elapsed = utime_since_now(&td->start);
+
+                       runtime[DDIR_WRITE] += elapsed;
+               }
                
                if (td->error || td->terminate)
                        break;
@@ -864,6 +877,7 @@ err:
        close_files(td);
        close_ioengine(td);
        cleanup_io_u(td);
+       options_mem_free(td);
        td_set_runstate(td, TD_EXITED);
        return (void *) (unsigned long) td->error;
 err_sem: