X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=steadystate.c;h=3468428f4ab97c228e9766274a79785820b561a8;hp=1f53ae46a88b504c225144a13563635422c72657;hb=d685adfb27d3f2f94a6623c774a246bcaac2f853;hpb=94f218f6e5ef1eb2bc9190f72df5c8d105e0bac3 diff --git a/steadystate.c b/steadystate.c index 1f53ae46..3468428f 100644 --- a/steadystate.c +++ b/steadystate.c @@ -38,12 +38,13 @@ void steadystate_setup(void) if (!td->o.group_reporting) { steadystate_alloc(td); + td->ss.state |= __FIO_SS_DATA; continue; } if (prev_groupid != td->groupid) { if (prev_td != NULL) { - prev_td->ss.state |= __FIO_SS_LAST; + prev_td->ss.state |= __FIO_SS_DATA; steadystate_alloc(prev_td); } prev_groupid = td->groupid; @@ -52,7 +53,7 @@ void steadystate_setup(void) } if (prev_td != NULL && prev_td->o.group_reporting) { - prev_td->ss.state |= __FIO_SS_LAST; + prev_td->ss.state |= __FIO_SS_DATA; steadystate_alloc(prev_td); } } @@ -107,7 +108,7 @@ static bool steadystate_slope(unsigned long iops, unsigned long bw, */ ss->slope = (ss->sum_xy - (double) ss->sum_x * ss->sum_y / ss->dur) / (ss->sum_x_sq - (double) ss->sum_x * ss->sum_x / ss->dur); - if (ss->pct) + if (ss->state & __FIO_SS_PCT) ss->criterion = 100.0 * ss->slope / (ss->sum_y / ss->dur); else ss->criterion = ss->slope; @@ -172,7 +173,7 @@ static bool steadystate_deviation(unsigned long iops, unsigned long bw, ss->deviation = max(ss->deviation, diff * (diff < 0.0 ? -1.0 : 1.0)); } - if (ss->pct) + if (ss->state & __FIO_SS_PCT) ss->criterion = 100.0 * ss->deviation / mean; else ss->criterion = ss->deviation; @@ -257,7 +258,7 @@ void steadystate_check(void) ss->prev_iops = td_iops; ss->prev_bytes = td_bytes; - if (td->o.group_reporting && !(ss->state & __FIO_SS_LAST)) + if (td->o.group_reporting && !(ss->state & __FIO_SS_DATA)) continue; /* @@ -294,31 +295,72 @@ void steadystate_check(void) } } -void td_steadystate_init(struct thread_data *td) +int td_steadystate_init(struct thread_data *td) { struct steadystate_data *ss = &td->ss; struct thread_options *o = &td->o; + struct thread_data *td2; + int j; memset(ss, 0, sizeof(*ss)); - if (!o->ss_dur) - return; + if (o->ss_dur) { + steadystate_enabled = true; + o->ss_dur /= 1000000L; + + /* put all steady state info in one place */ + ss->dur = o->ss_dur; + ss->limit = o->ss_limit.u.f; + ss->ramp_time = o->ss_ramp_time; + + ss->state = o->ss; + if (!td->ss.ramp_time) + ss->state |= __FIO_SS_RAMP_OVER; + + ss->sum_x = o->ss_dur * (o->ss_dur - 1) / 2; + ss->sum_x_sq = (o->ss_dur - 1) * (o->ss_dur) * (2*o->ss_dur - 1) / 6; + + td->ts.ss = ss; + } + + /* make sure that ss options are consistent within reporting group */ + for_each_td(td2, j) { + if (td2->groupid == td->groupid) { + struct steadystate_data *ss2 = &td2->ss; + + if (ss2->dur != ss->dur || + ss2->limit != ss->limit || + ss2->ramp_time != ss->ramp_time || + ss2->state != ss->state || + ss2->sum_x != ss->sum_x || + ss2->sum_x_sq != ss->sum_x_sq) { + td_verror(td, EINVAL, "job rejected: steadystate options must be consistent within reporting groups"); + return 1; + } + } + } + + return 0; +} - steadystate_enabled = true; - o->ss_dur /= 1000000L; +unsigned long long steadystate_bw_mean(struct steadystate_data *ss) +{ + int i; + unsigned long long sum; - /* put all steady state info in one place */ - ss->dur = o->ss_dur; - ss->limit = o->ss_limit.u.f; - ss->ramp_time = o->ss_ramp_time; - ss->pct = o->ss_pct; + for (i = 0, sum = 0; i < ss->dur; i++) + sum += ss->bw_data[i]; - ss->state = o->ss; - if (!td->ss.ramp_time) - ss->state |= __FIO_SS_RAMP_OVER; + return sum / ss->dur; +} + +unsigned long long steadystate_iops_mean(struct steadystate_data *ss) +{ + int i; + unsigned long long sum; - ss->sum_x = o->ss_dur * (o->ss_dur - 1) / 2; - ss->sum_x_sq = (o->ss_dur - 1) * (o->ss_dur) * (2*o->ss_dur - 1) / 6; + for (i = 0, sum = 0; i < ss->dur; i++) + sum += ss->iops_data[i]; - td->ts.ss = ss; + return sum / ss->dur; }