Make histogram samples non-cumulative by tracking a linked-list
[fio.git] / iolog.h
diff --git a/iolog.h b/iolog.h
index 0438fa7b2993b5b44d170da03fb75ce7dc2d8a5d..ade4f1b80b379fe163ab085c3795b0fe1e30416a 100644 (file)
--- a/iolog.h
+++ b/iolog.h
@@ -18,6 +18,16 @@ struct io_stat {
        fio_fp64_t S;
 };
 
+struct io_u_plat_list {
+       struct flist_head list;
+};
+
+struct io_hist {
+       uint64_t samples;
+       unsigned long hist_last;
+       struct io_u_plat_list list;
+};
+
 /*
  * A single data sample
  */
@@ -39,6 +49,7 @@ enum {
        IO_LOG_TYPE_SLAT,
        IO_LOG_TYPE_BW,
        IO_LOG_TYPE_IOPS,
+       IO_LOG_TYPE_HIST,
 };
 
 #define DEF_LOG_ENTRIES                1024
@@ -103,6 +114,14 @@ struct io_log {
        unsigned long avg_msec;
        unsigned long avg_last;
 
+  /*
+   * Windowed latency histograms, for keeping track of when we need to
+   * save a copy of the histogram every approximately hist_msec milliseconds.
+   */
+       struct io_hist hist_window[DDIR_RWDIR_CNT];
+       unsigned long hist_msec;
+       int hist_coarseness;
+
        pthread_mutex_t chunk_lock;
        unsigned int chunk_seq;
        struct flist_head chunk_list;
@@ -218,6 +237,8 @@ extern int iolog_file_inflate(const char *);
 struct log_params {
        struct thread_data *td;
        unsigned long avg_msec;
+       unsigned long hist_msec;
+       int hist_coarseness;
        int log_type;
        int log_offset;
        int log_gz;