X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=stat.c;h=1e889f537f24254cc9090a103a1993cf1a18e09d;hp=965ff9fc129dcdf791a3d67f6f3a1e516fdafa79;hb=effe99e4b18eb5c345629d7bbaae1879a2594b20;hpb=1e613c9c23932006263dd8334007865f32891a0c diff --git a/stat.c b/stat.c index 965ff9fc..1e889f53 100644 --- a/stat.c +++ b/stat.c @@ -257,13 +257,13 @@ out: free(ovals); } -int calc_lat(struct io_stat *is, unsigned long *min, unsigned long *max, - double *mean, double *dev) +bool calc_lat(struct io_stat *is, unsigned long *min, unsigned long *max, + double *mean, double *dev) { double n = (double) is->samples; if (n == 0) - return 0; + return false; *min = is->min_val; *max = is->max_val; @@ -274,7 +274,7 @@ int calc_lat(struct io_stat *is, unsigned long *min, unsigned long *max, else *dev = 0; - return 1; + return true; } void show_group_stats(struct group_run_stats *rs, struct buf_output *out) @@ -364,7 +364,7 @@ static void display_lat(const char *name, unsigned long min, unsigned long max, const char *base = "(usec)"; char *minp, *maxp; - if (!usec_to_msec(&min, &max, &mean, &dev)) + if (usec_to_msec(&min, &max, &mean, &dev)) base = "(msec)"; minp = num2str(min, 6, 1, 0, 0); @@ -669,6 +669,8 @@ static void show_thread_status_normal(struct thread_stat *ts, if (!ddir_rw_sum(ts->io_bytes) && !ddir_rw_sum(ts->total_io_u)) return; + + memset(time_buf, 0, sizeof(time_buf)); time(&time_p); os_ctime_r((const time_t *) &time_p, time_buf, sizeof(time_buf)); @@ -1090,8 +1092,8 @@ static void show_thread_status_terse_v3_v4(struct thread_stat *ts, log_buf(out, "\n"); } -void json_add_job_opts(struct json_object *root, const char *name, - struct flist_head *opt_list, bool num_jobs) +static void json_add_job_opts(struct json_object *root, const char *name, + struct flist_head *opt_list, bool num_jobs) { struct json_object *dir_object; struct flist_head *entry; @@ -1648,7 +1650,8 @@ void __show_run_stats(void) os_ctime_r((const time_t *) &now.tv_sec, time_buf, sizeof(time_buf)); - time_buf[strlen(time_buf) - 1] = '\0'; + if (time_buf[strlen(time_buf) - 1] == '\n') + time_buf[strlen(time_buf) - 1] = '\0'; root = json_create_object(); json_object_add_value_string(root, "fio version", fio_version_string); @@ -2020,7 +2023,7 @@ static void __add_log_sample(struct io_log *iolog, unsigned long val, s = get_sample(iolog, cur_log, cur_log->nr_samples); s->val = val; - s->time = t; + s->time = t + (iolog->td ? iolog->td->unix_epoch : 0); io_sample_set_ddir(iolog, s, ddir); s->bs = bs; @@ -2140,7 +2143,9 @@ static long add_log_sample(struct thread_data *td, struct io_log *iolog, * need to do. */ this_window = elapsed - iolog->avg_last; - if (this_window < iolog->avg_msec) { + if (elapsed < iolog->avg_last) + return iolog->avg_last - elapsed; + else if (this_window < iolog->avg_msec) { int diff = iolog->avg_msec - this_window; if (inline_log(iolog) || diff > LOG_MSEC_SLACK) @@ -2209,28 +2214,37 @@ void add_clat_sample(struct thread_data *td, enum fio_ddir ddir, add_clat_percentile_sample(ts, usec, ddir); if (iolog && iolog->hist_msec) { - struct io_hist *hw = &(iolog->hist_window[ddir]); - (hw->samples)++; + struct io_hist *hw = &iolog->hist_window[ddir]; + + hw->samples++; elapsed = mtime_since_now(&td->epoch); - if (! hw->hist_last) + if (!hw->hist_last) hw->hist_last = elapsed; this_window = elapsed - hw->hist_last; if (this_window >= iolog->hist_msec) { + unsigned int *io_u_plat; + struct io_u_plat_entry *dst; + /* - * Make a byte-for-byte copy of the latency histogram stored in - * td->ts.io_u_plat[ddir], recording it in a log sample. Note that - * the matching call to free() is located in iolog.c after printing - * this sample to the log file. + * Make a byte-for-byte copy of the latency histogram + * stored in td->ts.io_u_plat[ddir], recording it in a + * log sample. Note that the matching call to free() is + * located in iolog.c after printing this sample to the + * log file. */ - unsigned int *io_u_plat = (unsigned int *)(td->ts.io_u_plat[ddir]); - unsigned int *dst = malloc(FIO_IO_U_PLAT_NR * sizeof(unsigned int)); - memcpy(dst, io_u_plat, FIO_IO_U_PLAT_NR * sizeof(unsigned int)); - __add_log_sample(iolog, (uint64_t)dst, ddir, bs, elapsed, offset); + io_u_plat = (unsigned int *) td->ts.io_u_plat[ddir]; + dst = malloc(sizeof(struct io_u_plat_entry)); + memcpy(&(dst->io_u_plat), io_u_plat, + FIO_IO_U_PLAT_NR * sizeof(unsigned int)); + flist_add(&dst->list, &hw->list); + __add_log_sample(iolog, (unsigned long)dst, ddir, bs, + elapsed, offset); /* - * Update the last time we recorded as being now, minus any drift - * in time we encountered before actually making the record. + * Update the last time we recorded as being now, minus + * any drift in time we encountered before actually + * making the record. */ hw->hist_last = elapsed - (this_window - iolog->hist_msec); hw->samples = 0; @@ -2446,12 +2460,12 @@ int calc_log_samples(void) next = min(td->o.iops_avg_time, td->o.bw_avg_time); continue; } - if (!per_unit_log(td->bw_log)) { + if (td->bw_log && !per_unit_log(td->bw_log)) { tmp = add_bw_samples(td, &now); if (tmp < next) next = tmp; } - if (!per_unit_log(td->iops_log)) { + if (td->iops_log && !per_unit_log(td->iops_log)) { tmp = add_iops_samples(td, &now); if (tmp < next) next = tmp;