From b7f05eb03c84bdc1259d1bb1c348328b16164430 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Fri, 11 May 2012 20:33:02 +0200 Subject: [PATCH] eta: ETA bandwidth was off by 1.024 Same fix as 033bbb51 essentially. Since mtime is a 1000th of a second, for the usual option of having 1024 be the KB base, we end up being off by 1.024 if we don't multiply by 1000 before dividing by the runtime (and then dividing by 1024 to get to next power-of-2). Signed-off-by: Jens Axboe --- client.c | 1 + eta.c | 24 ++++++++++++++---------- server.c | 1 + server.h | 2 +- stat.h | 1 + 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/client.c b/client.c index 0ce7a6eb..7c991096 100644 --- a/client.c +++ b/client.c @@ -725,6 +725,7 @@ static void convert_jobs_eta(struct jobs_eta *je) je->elapsed_sec = le64_to_cpu(je->elapsed_sec); je->eta_sec = le64_to_cpu(je->eta_sec); + je->is_pow2 = le32_to_cpu(je->is_pow2); } static void sum_jobs_eta(struct jobs_eta *dst, struct jobs_eta *je) diff --git a/eta.c b/eta.c index 4679a21a..91145950 100644 --- a/eta.c +++ b/eta.c @@ -216,8 +216,14 @@ static int thread_eta(struct thread_data *td) static void calc_rate(unsigned long mtime, unsigned long long *io_bytes, unsigned long long *prev_io_bytes, unsigned int *rate) { - rate[0] = (io_bytes[0] - prev_io_bytes[0]) / mtime; - rate[1] = (io_bytes[1] - prev_io_bytes[1]) / mtime; + int i; + + for (i = 0; i <= DDIR_WRITE; i++) { + unsigned long long diff; + + diff = io_bytes[i] - prev_io_bytes[i]; + rate[i] = ((1000 * diff) / mtime) / 1024; + } prev_io_bytes[0] = io_bytes[0]; prev_io_bytes[1] = io_bytes[1]; } @@ -248,7 +254,6 @@ int calc_thread_status(struct jobs_eta *je, int force) static unsigned long long disp_io_bytes[2]; static unsigned long long disp_io_iops[2]; static struct timeval rate_prev_time, disp_prev_time; - int i2p = 0; if (!force) { if (temp_stall_ts || terse_output || eta_print == FIO_ETA_NEVER) @@ -272,6 +277,8 @@ int calc_thread_status(struct jobs_eta *je, int force) io_iops[0] = io_iops[1] = 0; bw_avg_time = ULONG_MAX; for_each_td(td, i) { + if (is_power_of_2(td->o.kb_base)) + je->is_pow2 = 1; if (td->o.bw_avg_time < bw_avg_time) bw_avg_time = td->o.bw_avg_time; if (td->runstate == TD_RUNNING || td->runstate == TD_VERIFYING @@ -311,8 +318,6 @@ int calc_thread_status(struct jobs_eta *je, int force) je->eta_sec = 0; for_each_td(td, i) { - if (!i2p && is_power_of_2(td->o.kb_base)) - i2p = 1; if (exitall_on_terminate) { if (eta_secs[i] < je->eta_sec) je->eta_sec = eta_secs[i]; @@ -363,7 +368,6 @@ void display_thread_status(struct jobs_eta *je) char output[REAL_MAX_JOBS + 512], *p = output; char eta_str[128]; double perc = 0.0; - int i2p = 0; if (je->eta_sec != INT_MAX && je->elapsed_sec) { perc = (double) je->elapsed_sec / (double) (je->elapsed_sec + je->eta_sec); @@ -374,8 +378,8 @@ void display_thread_status(struct jobs_eta *je) if (je->m_rate || je->t_rate) { char *tr, *mr; - mr = num2str(je->m_rate, 4, 0, i2p); - tr = num2str(je->t_rate, 4, 0, i2p); + mr = num2str(je->m_rate, 4, 0, je->is_pow2); + tr = num2str(je->t_rate, 4, 0, je->is_pow2); p += sprintf(p, ", CR=%s/%s KB/s", tr, mr); free(tr); free(mr); @@ -396,8 +400,8 @@ void display_thread_status(struct jobs_eta *je) sprintf(perc_str, "%3.1f%% done", perc); } - rate_str[0] = num2str(je->rate[0], 5, 10, i2p); - rate_str[1] = num2str(je->rate[1], 5, 10, i2p); + rate_str[0] = num2str(je->rate[0], 5, 1024, je->is_pow2); + rate_str[1] = num2str(je->rate[1], 5, 1024, je->is_pow2); iops_str[0] = num2str(je->iops[0], 4, 1, 0); iops_str[1] = num2str(je->iops[1], 4, 1, 0); diff --git a/server.c b/server.c index 169f50ad..72def7e0 100644 --- a/server.c +++ b/server.c @@ -451,6 +451,7 @@ static int handle_send_eta_cmd(struct fio_net_cmd *cmd) je->elapsed_sec = cpu_to_le64(je->elapsed_sec); je->eta_sec = cpu_to_le64(je->eta_sec); + je->is_pow2 = cpu_to_le32(je->is_pow2); fio_net_send_cmd(server_fd, FIO_NET_CMD_ETA, je, size, cmd->tag); free(je); diff --git a/server.h b/server.h index 494a40a9..6d5a83d5 100644 --- a/server.h +++ b/server.h @@ -36,7 +36,7 @@ struct fio_net_int_cmd { }; enum { - FIO_SERVER_VER = 7, + FIO_SERVER_VER = 8, FIO_SERVER_MAX_PDU = 1024, diff --git a/stat.h b/stat.h index be27c72c..c15f26ea 100644 --- a/stat.h +++ b/stat.h @@ -180,6 +180,7 @@ struct jobs_eta { uint32_t iops[2]; uint64_t elapsed_sec; uint64_t eta_sec; + uint32_t is_pow2; /* * Network 'copy' of run_str[] -- 2.25.1