Call path below SIGALRM isn't safe
[fio.git] / eta.c
diff --git a/eta.c b/eta.c
index 6629c29d1c8591fee2a4d1671da0eac8d6f69a58..608e0dd4cfa59a130c35bf39d0e3918618aca893 100644 (file)
--- a/eta.c
+++ b/eta.c
@@ -110,6 +110,13 @@ static int thread_eta(struct thread_data *td)
 
        bytes_total = td->total_io_size;
 
+       if (td->o.fill_device && td->o.size  == -1ULL) {
+               if (!td->fill_device_size || td->fill_device_size == -1ULL)
+                       return 0;
+
+               bytes_total = td->fill_device_size;
+       }
+
        /*
         * if writing, bytes_total will be twice the size. If mixing,
         * assume a 50/50 split and thus bytes_total will be 50% larger.
@@ -124,9 +131,6 @@ static int thread_eta(struct thread_data *td)
        if (td->o.zone_size && td->o.zone_skip)
                bytes_total /= (td->o.zone_skip / td->o.zone_size);
 
-       if (td->o.fill_device && td->o.size  == -1ULL)
-               return 0;
-
        if (td->runstate == TD_RUNNING || td->runstate == TD_VERIFYING) {
                double perc, perc_t;
 
@@ -169,7 +173,8 @@ static int thread_eta(struct thread_data *td)
                        }
                }
                if (td->o.rate[0] || td->o.rate[1]) {
-                       r_eta = (bytes_total / 1024) / (td->o.rate[0] + td->o.rate[1]);
+                       r_eta = (bytes_total / 1024) /
+                                       (td->o.rate[0] + td->o.rate[1]);
                        r_eta += td->o.start_delay;
                }
 
@@ -232,6 +237,7 @@ void print_thread_status(void)
        static unsigned int rate[2], iops[2];
        static int linelen_last;
        static int eta_good;
+       int i2p = 0;
 
        if (temp_stall_ts || terse_output || eta_print == FIO_ETA_NEVER)
                return;
@@ -263,7 +269,8 @@ void print_thread_status(void)
                        t_rate += td->o.rate[0] + td->o.rate[1];
                        m_rate += td->o.ratemin[0] + td->o.ratemin[1];
                        t_iops += td->o.rate_iops[0] + td->o.rate_iops[1];
-                       m_iops += td->o.rate_iops_min[0] + td->o.rate_iops_min[1];
+                       m_iops += td->o.rate_iops_min[0] +
+                                       td->o.rate_iops_min[1];
                        files_open += td->nr_open_files;
                } else if (td->runstate == TD_RAMP) {
                        nr_running++;
@@ -292,6 +299,8 @@ void print_thread_status(void)
                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] < eta_sec)
                                eta_sec = eta_secs[i];
@@ -319,7 +328,11 @@ void print_thread_status(void)
        }
 
        disp_time = mtime_since(&disp_prev_time, &now);
-       if (disp_time < 1000)
+
+       /*
+        * Allow a little slack, the target is to print it every 1000 msecs
+        */
+       if (disp_time < 900)
                return;
 
        calc_rate(disp_time, io_bytes, disp_io_bytes, rate);
@@ -334,8 +347,8 @@ void print_thread_status(void)
        if (m_rate || t_rate) {
                char *tr, *mr;
 
-               mr = num2str(m_rate, 4, 0, 1);
-               tr = num2str(t_rate, 4, 0, 1);
+               mr = num2str(m_rate, 4, 0, i2p);
+               tr = num2str(t_rate, 4, 0, i2p);
                printf(", CR=%s/%s KB/s", tr, mr);
                free(tr);
                free(mr);
@@ -355,14 +368,14 @@ void print_thread_status(void)
                        sprintf(perc_str, "%3.1f%% done", perc);
                }
 
-               rate_str[0] = num2str(rate[0], 5, 10, 1);
-               rate_str[1] = num2str(rate[1], 5, 10, 1);
+               rate_str[0] = num2str(rate[0], 5, 10, i2p);
+               rate_str[1] = num2str(rate[1], 5, 10, i2p);
 
                iops_str[0] = num2str(iops[0], 4, 1, 0);
                iops_str[1] = num2str(iops[1], 4, 1, 0);
 
                l = printf(": [%s] [%s] [%s/%s /s] [%s/%s iops] [eta %s]",
-                                run_str, perc_str, rate_str[0], rate_str[1], 
+                                run_str, perc_str, rate_str[0], rate_str[1],
                                 iops_str[0], iops_str[1], eta_str);
                if (l >= 0 && l < linelen_last)
                        printf("%*s", linelen_last - l, "");