eta: ETA bandwidth was off by 1.024
authorJens Axboe <axboe@kernel.dk>
Fri, 11 May 2012 18:33:02 +0000 (20:33 +0200)
committerJens Axboe <axboe@kernel.dk>
Fri, 11 May 2012 18:33:02 +0000 (20:33 +0200)
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 <axboe@kernel.dk>
client.c
eta.c
server.c
server.h
stat.h

index 0ce7a6e..7c99109 100644 (file)
--- 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 4679a21..9114595 100644 (file)
--- 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);
index 169f50a..72def7e 100644 (file)
--- 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);
index 494a40a..6d5a83d 100644 (file)
--- 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 be27c72..c15f26e 100644 (file)
--- 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[]