Merge branch 'master' of https://github.com/bvanassche/fio
[fio.git] / steadystate.h
index 6cd2940908a52bfd1d2729c04171c7c10e9fe4d3..51472c4698c0cfd72233a62c34cd1226741138a8 100644 (file)
@@ -1,46 +1,69 @@
 #ifndef FIO_STEADYSTATE_H
 #define FIO_STEADYSTATE_H
 
+#include "thread_options.h"
+
+extern void steadystate_free(struct thread_data *);
 extern void steadystate_check(void);
 extern void steadystate_setup(void);
-extern void steadystate_alloc(struct thread_data *);
-extern bool steadystate_deviation(unsigned long, unsigned long, struct thread_data *);
-extern bool steadystate_slope(unsigned long, unsigned long, struct thread_data *);
+extern int td_steadystate_init(struct thread_data *);
+extern uint64_t steadystate_bw_mean(struct thread_stat *);
+extern uint64_t steadystate_iops_mean(struct thread_stat *);
+
+extern bool steadystate_enabled;
 
-/*
- * For steady state detection
- */
 struct steadystate_data {
        double limit;
        unsigned long long dur;
        unsigned long long ramp_time;
-       bool (*evaluate)(unsigned long, unsigned long, struct thread_data *);
-       bool check_iops;
-       bool check_slope;
-       bool pct;
 
-       int attained;
-       int last_in_group;
-       int ramp_time_over;
+       uint32_t state;
 
        unsigned int head;
        unsigned int tail;
-       unsigned long *iops_data;
-       unsigned long *bw_data;
+       uint64_t *iops_data;
+       uint64_t *bw_data;
 
        double slope;
-       double criterion;
        double deviation;
+       double criterion;
+
+       uint64_t sum_y;
+       uint64_t sum_x;
+       uint64_t sum_x_sq;
+       uint64_t sum_xy;
+       uint64_t oldest_y;
 
-       unsigned long long sum_y;
-       unsigned long long sum_x;
-       unsigned long long sum_x_sq;
-       unsigned long long sum_xy;
-       unsigned long long oldest_y;
+       struct timespec prev_time;
+       uint64_t prev_iops;
+       uint64_t prev_bytes;
+};
 
-       struct timeval prev_time;
-       unsigned long long prev_iops;
-       unsigned long long prev_bytes;
+enum {
+       __FIO_SS_IOPS = 0,
+       __FIO_SS_BW,
+       __FIO_SS_SLOPE,
+       __FIO_SS_ATTAINED,
+       __FIO_SS_RAMP_OVER,
+       __FIO_SS_DATA,
+       __FIO_SS_PCT,
+       __FIO_SS_BUFFER_FULL,
 };
 
+enum {
+       FIO_SS_IOPS             = 1 << __FIO_SS_IOPS,
+       FIO_SS_BW               = 1 << __FIO_SS_BW,
+       FIO_SS_SLOPE            = 1 << __FIO_SS_SLOPE,
+       FIO_SS_ATTAINED         = 1 << __FIO_SS_ATTAINED,
+       FIO_SS_RAMP_OVER        = 1 << __FIO_SS_RAMP_OVER,
+       FIO_SS_DATA             = 1 << __FIO_SS_DATA,
+       FIO_SS_PCT              = 1 << __FIO_SS_PCT,
+       FIO_SS_BUFFER_FULL      = 1 << __FIO_SS_BUFFER_FULL,
+
+       FIO_SS_IOPS_SLOPE       = FIO_SS_IOPS | FIO_SS_SLOPE,
+       FIO_SS_BW_SLOPE         = FIO_SS_BW | FIO_SS_SLOPE,
+};
+
+#define STEADYSTATE_MSEC       1000
+
 #endif