client: use temp buffer for single output flush for json/disk util
[fio.git] / steadystate.c
index d0abb47cb4416859cef952e2f804f760c5e1e24d..bd2f70dd3af1b6084994b2409ef6d7f862e2aac4 100644 (file)
@@ -2,7 +2,6 @@
 
 #include "fio.h"
 #include "steadystate.h"
-#include "helper_thread.h"
 
 bool steadystate_enabled = false;
 
@@ -24,8 +23,8 @@ static void steadystate_alloc(struct thread_data *td)
 
 void steadystate_setup(void)
 {
-       int i, prev_groupid;
        struct thread_data *td, *prev_td;
+       int i, prev_groupid;
 
        if (!steadystate_enabled)
                return;
@@ -47,17 +46,15 @@ void steadystate_setup(void)
                }
 
                if (prev_groupid != td->groupid) {
-                       if (prev_td != NULL) {
+                       if (prev_td)
                                steadystate_alloc(prev_td);
-                       }
                        prev_groupid = td->groupid;
                }
                prev_td = td;
        }
 
-       if (prev_td != NULL && prev_td->o.group_reporting) {
+       if (prev_td && prev_td->o.group_reporting)
                steadystate_alloc(prev_td);
-       }
 }
 
 static bool steadystate_slope(uint64_t iops, uint64_t bw,
@@ -211,6 +208,7 @@ void steadystate_check(void)
 
        prev_groupid = -1;
        for_each_td(td, i) {
+               const bool needs_lock = td_async_processing(td);
                struct steadystate_data *ss = &td->ss;
 
                if (!ss->dur || td->runstate <= TD_SETTING_UP ||
@@ -238,12 +236,16 @@ void steadystate_check(void)
                                ss->state |= FIO_SS_RAMP_OVER;
                }
 
-               td_io_u_lock(td);
+               if (needs_lock)
+                       __td_io_u_lock(td);
+
                for (ddir = 0; ddir < DDIR_RWDIR_CNT; ddir++) {
                        td_iops += td->io_blocks[ddir];
                        td_bytes += td->io_bytes[ddir];
                }
-               td_io_u_unlock(td);
+
+               if (needs_lock)
+                       __td_io_u_unlock(td);
 
                rate_time = mtime_since(&ss->prev_time, &now);
                memcpy(&ss->prev_time, &now, sizeof(now));
@@ -353,6 +355,9 @@ uint64_t steadystate_bw_mean(struct thread_stat *ts)
        int i;
        uint64_t sum;
 
+       if (!ts->ss_dur)
+               return 0;
+
        for (i = 0, sum = 0; i < ts->ss_dur; i++)
                sum += ts->ss_bw_data[i];
 
@@ -364,6 +369,9 @@ uint64_t steadystate_iops_mean(struct thread_stat *ts)
        int i;
        uint64_t sum;
 
+       if (!ts->ss_dur)
+               return 0;
+
        for (i = 0, sum = 0; i < ts->ss_dur; i++)
                sum += ts->ss_iops_data[i];