Make histogram samples non-cumulative by tracking a linked-list
[fio.git] / iolog.h
diff --git a/iolog.h b/iolog.h
index 0da70670c796ef1e8685394d88bb455a843d917b..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;
@@ -230,9 +251,16 @@ static inline bool per_unit_log(struct io_log *log)
        return log && !log->avg_msec;
 }
 
+static inline bool inline_log(struct io_log *log)
+{
+       return log->log_type == IO_LOG_TYPE_LAT ||
+               log->log_type == IO_LOG_TYPE_CLAT ||
+               log->log_type == IO_LOG_TYPE_SLAT;
+}
+
 extern void finalize_logs(struct thread_data *td, bool);
 extern void setup_log(struct io_log **, struct log_params *, const char *);
-extern void flush_log(struct io_log *, int);
+extern void flush_log(struct io_log *, bool);
 extern void flush_samples(FILE *, void *, uint64_t);
 extern void free_log(struct io_log *);
 extern void fio_writeout_logs(bool);