while (len < FIO_IO_U_LIST_MAX_LEN && plist[len].u.f != 0.0)
len++;
+ if (!len)
+ return;
+
/*
* Sort the percentile list. Note that it may already be sorted if
* we are using the default values, but since it's a short list this
if (len > 1)
qsort((void*)plist, len, sizeof(plist[0]), double_cmp);
- log_info(" clat percentiles (usec) :");
+ log_info(" clat percentiles (usec):\n |");
for (i = 0; i < FIO_IO_U_PLAT_NR && !is_last; i++) {
sum += io_u_plat[i];
while (sum >= (plist[j].u.f / 100.0 * nr)) {
+ char fbuf[8];
+
assert(plist[j].u.f <= 100.0);
/* for formatting */
if (j != 0 && (j % 4) == 0)
- log_info(" ");
+ log_info(" |");
/* end of the list */
is_last = (j == len - 1);
- log_info(" %2.2fth=%u%c", plist[j], plat_idx_to_val(i),
- (is_last? '\n' : ','));
+ if (plist[j].u.f < 10.0)
+ sprintf(fbuf, " %2.2f", plist[j].u.f);
+ else
+ sprintf(fbuf, "%2.2f", plist[j].u.f);
+
+ log_info(" %sth=[%5u]%c", fbuf, plat_idx_to_val(i),
+ is_last ? '\n' : ',');
if (is_last)
break;
if (j % 4 == 3) /* for formatting */
log_info("\n");
- j++;
+ if (++j == FIO_IO_U_LIST_MAX_LEN)
+ break;
}
}
}
const char *ddir_str[] = { " READ", " WRITE" };
int i;
- log_info("\nRun status group %d (all jobs):\n", rs->groupid);
+ log_info("Run status group %d (all jobs):\n", rs->groupid);
for (i = 0; i <= DDIR_WRITE; i++) {
const int i2p = is_power_of_2(rs->kb_base);
dst->S.u.f = S;
}
+void sum_group_stats(struct group_run_stats *dst, struct group_run_stats *src)
+{
+ int i;
+
+ for (i = 0; i < 2; i++) {
+ if (dst->max_run[i] < src->max_run[i])
+ dst->max_run[i] = src->max_run[i];
+ if (dst->min_run[i] && dst->min_run[i] > src->min_run[i])
+ dst->min_run[i] = src->min_run[i];
+ if (dst->max_bw[i] < src->max_bw[i])
+ dst->max_bw[i] = src->max_bw[i];
+ if (dst->min_bw[i] && dst->min_bw[i] > src->min_bw[i])
+ dst->min_bw[i] = src->min_bw[i];
+
+ dst->io_kb[i] += src->io_kb[i];
+ dst->agg[i] += src->agg[i];
+ }
+
+}
+
void sum_thread_stats(struct thread_stat *dst, struct thread_stat *src, int nr)
{
int l, k;
dst->total_complete += src->total_complete;
}
+void init_group_run_stat(struct group_run_stats *gs)
+{
+ memset(gs, 0, sizeof(*gs));
+ gs->min_bw[0] = gs->min_run[0] = ~0UL;
+ gs->min_bw[1] = gs->min_run[1] = ~0UL;
+}
+
+void init_thread_stat(struct thread_stat *ts)
+{
+ int j;
+
+ memset(ts, 0, sizeof(*ts));
+
+ for (j = 0; j <= DDIR_WRITE; j++) {
+ ts->lat_stat[j].min_val = -1UL;
+ ts->clat_stat[j].min_val = -1UL;
+ ts->slat_stat[j].min_val = -1UL;
+ ts->bw_stat[j].min_val = -1UL;
+ }
+ ts->groupid = -1;
+}
+
void show_run_stats(void)
{
struct group_run_stats *runstats, *rs;
runstats = malloc(sizeof(struct group_run_stats) * (groupid + 1));
- for (i = 0; i < groupid + 1; i++) {
- rs = &runstats[i];
-
- memset(rs, 0, sizeof(*rs));
- rs->min_bw[0] = rs->min_run[0] = ~0UL;
- rs->min_bw[1] = rs->min_run[1] = ~0UL;
- }
+ for (i = 0; i < groupid + 1; i++)
+ init_group_run_stat(&runstats[i]);
/*
* find out how many threads stats we need. if group reporting isn't
threadstats = malloc(nr_ts * sizeof(struct thread_stat));
- for (i = 0; i < nr_ts; i++) {
- ts = &threadstats[i];
-
- memset(ts, 0, sizeof(*ts));
- for (j = 0; j <= DDIR_WRITE; j++) {
- ts->lat_stat[j].min_val = -1UL;
- ts->clat_stat[j].min_val = -1UL;
- ts->slat_stat[j].min_val = -1UL;
- ts->bw_stat[j].min_val = -1UL;
- }
- ts->groupid = -1;
- }
+ for (i = 0; i < nr_ts; i++)
+ init_thread_stat(&threadstats[i]);
j = 0;
last_ts = -1;