X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=steadystate.c;h=bd2f70dd3af1b6084994b2409ef6d7f862e2aac4;hp=d0abb47cb4416859cef952e2f804f760c5e1e24d;hb=34a8f35f0854cd3627952187da73616a39165367;hpb=c27cc65f33f4f39e33e5203199048e0a85a8921c diff --git a/steadystate.c b/steadystate.c index d0abb47c..bd2f70dd 100644 --- a/steadystate.c +++ b/steadystate.c @@ -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];