Merge branch 'master' into gfio

Conflicts:
	client.c
	eta.c
	server.c
	server.h

Signed-off-by: Jens Axboe <axboe@kernel.dk>
diff --git a/client.c b/client.c
index 685472e..c1e516d 100644
--- a/client.c
+++ b/client.c
@@ -846,6 +846,7 @@
 	je->elapsed_sec		= le64_to_cpu(je->elapsed_sec);
 	je->eta_sec		= le64_to_cpu(je->eta_sec);
 	je->nr_threads		= le32_to_cpu(je->nr_threads);
+	je->is_pow2		= le32_to_cpu(je->is_pow2);
 }
 
 void fio_client_sum_jobs_eta(struct jobs_eta *dst, struct jobs_eta *je)
diff --git a/eta.c b/eta.c
index a068e1e..34afe0c 100644
--- a/eta.c
+++ b/eta.c
@@ -216,8 +216,14 @@
 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 @@
 	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 @@
 	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
@@ -314,8 +321,6 @@
 		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];
@@ -366,7 +371,6 @@
 	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);
@@ -377,8 +381,8 @@
 	if (je->m_rate[0] || je->m_rate[1] || je->t_rate[0] || je->t_rate[1]) {
 		char *tr, *mr;
 
-		mr = num2str(je->m_rate[0] + je->m_rate[1], 4, 0, i2p);
-		tr = num2str(je->t_rate[0] + je->t_rate[1], 4, 0, i2p);
+		mr = num2str(je->m_rate[0] + je->m_rate[1], 4, 0, je->is_pow2);
+		tr = num2str(je->t_rate[0] + je->t_rate[1], 4, 0, je->is_pow2);
 		p += sprintf(p, ", CR=%s/%s KB/s", tr, mr);
 		free(tr);
 		free(mr);
@@ -402,8 +406,8 @@
 			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/fio.1 b/fio.1
index 10cb51d..d94be33 100644
--- a/fio.1
+++ b/fio.1
@@ -70,7 +70,7 @@
 All fio parser warnings are fatal, causing fio to exit with an error.
 .TP
 .BI \-\-max\-jobs \fR=\fPnr
-Set the maximum allowed number of jobs (threads/processes) to suport.
+Set the maximum allowed number of jobs (threads/processes) to support.
 .TP
 .BI \-\-server \fR=\fPargs
 Start a backend server, with \fIargs\fP specifying what to listen to. See client/server section.
@@ -1324,46 +1324,46 @@
 
 on that machine, where args defines what fio listens to. The arguments
 are of the form 'type:hostname or IP:port'. 'type' is either 'ip' (or ip4)
-for TCP/IP v4, 'ip6' for TCP/IP v6, or 'sock' for a local unix domain socket.
-'hostname' is either a hostname or IP address, and 'port' is the port to
+for TCP/IP v4, 'ip6' for TCP/IP v6, or 'sock' for a local unix domain
+socket. 'hostname' is either a hostname or IP address, and 'port' is the port to
 listen to (only valid for TCP/IP, not a local socket). Some examples:
 
-1) fio --server
+1) fio \-\-server
 
    Start a fio server, listening on all interfaces on the default port (8765).
 
-2) fio --server=ip:hostname,4444
+2) fio \-\-server=ip:hostname,4444
 
    Start a fio server, listening on IP belonging to hostname and on port 4444.
 
-3) fio --server=ip6:::1,4444
+3) fio \-\-server=ip6:::1,4444
 
    Start a fio server, listening on IPv6 localhost ::1 and on port 4444.
 
-4) fio --server=,4444
+4) fio \-\-server=,4444
 
    Start a fio server, listening on all interfaces on port 4444.
 
-5) fio --server=1.2.3.4
+5) fio \-\-server=1.2.3.4
 
    Start a fio server, listening on IP 1.2.3.4 on the default port.
 
-6) fio --server=sock:/tmp/fio.sock
+6) fio \-\-server=sock:/tmp/fio.sock
 
    Start a fio server, listening on the local socket /tmp/fio.sock.
 
 When a server is running, you can connect to it from a client. The client
 is run with:
 
-fio --local-args --client=server --remote-args <job file(s)>
+fio \-\-local-args \-\-client=server \-\-remote-args <job file(s)>
 
-where --local-args are arguments that are local to the client where it is
-running, 'server' is the connect string, and --remote-args and <job file(s)>
+where \-\-local-args are arguments that are local to the client where it is
+running, 'server' is the connect string, and \-\-remote-args and <job file(s)>
 are sent to the server. The 'server' string follows the same format as it
 does on the server side, to allow IP/hostname/socket and port strings.
 You can connect to multiple clients as well, to do that you could run:
 
-fio --client=server2 --client=server2 <job file(s)>
+fio \-\-client=server2 \-\-client=server2 <job file(s)>
 .SH AUTHORS
 
 .B fio
diff --git a/server.c b/server.c
index 456c88c..27356c6 100644
--- a/server.c
+++ b/server.c
@@ -671,6 +671,7 @@
 	je->elapsed_sec		= cpu_to_le64(je->elapsed_sec);
 	je->eta_sec		= cpu_to_le64(je->eta_sec);
 	je->nr_threads		= cpu_to_le32(je->nr_threads);
+	je->is_pow2		= cpu_to_le32(je->is_pow2);
 
 	fio_net_send_cmd(server_fd, FIO_NET_CMD_ETA, je, size, &tag, NULL);
 	free(je);
diff --git a/server.h b/server.h
index b7ae7ee..a838126 100644
--- a/server.h
+++ b/server.h
@@ -38,7 +38,7 @@
 };
 
 enum {
-	FIO_SERVER_VER			= 16,
+	FIO_SERVER_VER			= 17,
 
 	FIO_SERVER_MAX_FRAGMENT_PDU	= 1024,
 
diff --git a/stat.h b/stat.h
index cbbbf44..d7184aa 100644
--- a/stat.h
+++ b/stat.h
@@ -183,6 +183,7 @@
 	uint32_t iops[2];
 	uint64_t elapsed_sec;
 	uint64_t eta_sec;
+	uint32_t is_pow2;
 
 	/*
 	 * Network 'copy' of run_str[]