drifting in output of interval-averaged values was eventually causing IOP samples...
[fio.git] / stat.c
diff --git a/stat.c b/stat.c
index 704947f548950a3076651b54087ff6653b73a198..08a402a74c6d12e6c7bb339acce638dec5234514 100644 (file)
--- a/stat.c
+++ b/stat.c
@@ -16,6 +16,7 @@
 #include "lib/pow2.h"
 #include "lib/output_buffer.h"
 #include "helper_thread.h"
+#include "smalloc.h"
 
 struct fio_mutex *stat_mutex;
 
@@ -1877,7 +1878,7 @@ static struct io_logs *get_new_log(struct io_log *iolog)
 
        new_size = new_samples * log_entry_sz(iolog);
 
-       cur_log = malloc(sizeof(*cur_log));
+       cur_log = smalloc(sizeof(*cur_log));
        if (cur_log) {
                INIT_FLIST_HEAD(&cur_log->list);
                cur_log->log = malloc(new_size);
@@ -1888,7 +1889,7 @@ static struct io_logs *get_new_log(struct io_log *iolog)
                        iolog->cur_log_max = new_samples;
                        return cur_log;
                }
-               free(cur_log);
+               sfree(cur_log);
        }
 
        return NULL;
@@ -1948,6 +1949,7 @@ static struct io_logs *regrow_log(struct io_log *iolog)
                dst = get_sample(iolog, cur_log, i);
                memcpy(dst, src, log_entry_sz(iolog));
        }
+       cur_log->nr_samples = iolog->pending->nr_samples;
 
        iolog->pending->nr_samples = 0;
        return cur_log;
@@ -1982,11 +1984,14 @@ static struct io_logs *get_cur_log(struct io_log *iolog)
                return cur_log;
 
        /*
-        * Out of space. If we're in IO offload mode, add a new log chunk
-        * inline. If we're doing inline submissions, flag 'td' as needing
-        * a log regrow and we'll take care of it on the submission side.
+        * Out of space. If we're in IO offload mode, or we're not doing
+        * per unit logging (hence logging happens outside of the IO thread
+        * as well), add a new log chunk inline. If we're doing inline
+        * submissions, flag 'td' as needing a log regrow and we'll take
+        * care of it on the submission side.
         */
-       if (iolog->td->o.io_submit_mode == IO_MODE_OFFLOAD)
+       if (iolog->td->o.io_submit_mode == IO_MODE_OFFLOAD ||
+           !per_unit_log(iolog))
                return regrow_log(iolog);
 
        iolog->td->flags |= TD_F_REGROW_LOGS;
@@ -2137,7 +2142,7 @@ static void add_log_sample(struct thread_data *td, struct io_log *iolog,
 
        _add_stat_to_log(iolog, elapsed, td->o.log_max != 0);
 
-       iolog->avg_last = elapsed;
+       iolog->avg_last = elapsed - (this_window - iolog->avg_msec);
 }
 
 void finalize_logs(struct thread_data *td, bool unit_logs)
@@ -2387,7 +2392,7 @@ int calc_log_samples(void)
        fio_gettime(&now, NULL);
 
        for_each_td(td, i) {
-               if (!in_ramp_time(td) ||
+               if (in_ramp_time(td) ||
                    !(td->runstate == TD_RUNNING || td->runstate == TD_VERIFYING)) {
                        next = min(td->o.iops_avg_time, td->o.bw_avg_time);
                        continue;