+ for (i = 0; i < nr_ts; i++) {
+ ts = &threadstats[i];
+
+ memset(ts, 0, sizeof(*ts));
+ for (j = 0; j <= DDIR_WRITE; j++) {
+ ts->clat_stat[j].min_val = -1UL;
+ ts->slat_stat[j].min_val = -1UL;
+ ts->bw_stat[j].min_val = -1UL;
+ }
+ ts->groupid = -1;
+ }
+
+ j = 0;
+ last_ts = -1;
+ idx = 0;
+ for_each_td(td, i) {
+ if (idx && (!td->o.group_reporting ||
+ (td->o.group_reporting && last_ts != td->groupid))) {
+ idx = 0;
+ j++;
+ }
+
+ last_ts = td->groupid;
+
+ ts = &threadstats[j];
+
+ idx++;
+ ts->members++;
+
+ if (ts->groupid == -1) {
+ /*
+ * These are per-group shared already
+ */
+ ts->name = td->o.name;
+ ts->description = td->o.description;
+ ts->groupid = td->groupid;
+
+ /*
+ * first pid in group, not very useful...
+ */
+ ts->pid = td->pid;
+ }
+
+ if (td->error && !ts->error) {
+ ts->error = td->error;
+ ts->verror = td->verror;
+ }
+
+ for (l = 0; l <= DDIR_WRITE; l++) {
+ sum_stat(&ts->clat_stat[l], &td->ts.clat_stat[l], idx);
+ sum_stat(&ts->slat_stat[l], &td->ts.slat_stat[l], idx);
+ sum_stat(&ts->bw_stat[l], &td->ts.bw_stat[l], idx);
+
+ ts->stat_io_bytes[l] += td->ts.stat_io_bytes[l];
+ ts->io_bytes[l] += td->ts.io_bytes[l];
+
+ if (ts->runtime[l] < td->ts.runtime[l])
+ ts->runtime[l] = td->ts.runtime[l];
+ }
+
+ ts->usr_time += td->ts.usr_time;
+ ts->sys_time += td->ts.sys_time;
+ ts->ctx += td->ts.ctx;
+ ts->majf += td->ts.majf;
+ ts->minf += td->ts.minf;
+
+ for (k = 0; k < FIO_IO_U_MAP_NR; k++)
+ ts->io_u_map[k] += td->ts.io_u_map[k];
+ for (k = 0; k < FIO_IO_U_LAT_U_NR; k++)
+ ts->io_u_lat_u[k] += td->ts.io_u_lat_u[k];
+ for (k = 0; k < FIO_IO_U_LAT_M_NR; k++)
+ ts->io_u_lat_m[k] += td->ts.io_u_lat_m[k];
+
+
+ for (k = 0; k <= DDIR_WRITE; k++) {
+ ts->total_io_u[k] += td->ts.total_io_u[k];
+ ts->short_io_u[k] += td->ts.short_io_u[k];