eta: improve output for threads sitting in TD_SETTING_UP

Signed-off-by: Jens Axboe <axboe@kernel.dk>
diff --git a/client.c b/client.c
index 13e84f6..3cb46ab 100644
--- a/client.c
+++ b/client.c
@@ -887,6 +887,7 @@
 	je->nr_running		= le32_to_cpu(je->nr_running);
 	je->nr_ramp		= le32_to_cpu(je->nr_ramp);
 	je->nr_pending		= le32_to_cpu(je->nr_pending);
+	je->nr_setting_up	= le32_to_cpu(je->nr_setting_up);
 	je->files_open		= le32_to_cpu(je->files_open);
 
 	for (i = 0; i < DDIR_RWDIR_CNT; i++) {
@@ -912,6 +913,7 @@
 	dst->nr_running		+= je->nr_running;
 	dst->nr_ramp		+= je->nr_ramp;
 	dst->nr_pending		+= je->nr_pending;
+	dst->nr_setting_up	+= je->nr_setting_up;
 	dst->files_open		+= je->files_open;
 
 	for (i = 0; i < DDIR_RWDIR_CNT; i++) {
diff --git a/eta.c b/eta.c
index 769ac14..9fc6e27 100644
--- a/eta.c
+++ b/eta.c
@@ -186,6 +186,7 @@
 			eta_sec = td->o.timeout + done_secs - elapsed;
 	} else if (td->runstate == TD_NOT_CREATED || td->runstate == TD_CREATED
 			|| td->runstate == TD_INITIALIZED
+			|| td->runstate == TD_SETTING_UP
 			|| td->runstate == TD_RAMP
 			|| td->runstate == TD_PRE_READING) {
 		int t_eta = 0, r_eta = 0;
@@ -349,9 +350,10 @@
 		} else if (td->runstate == TD_RAMP) {
 			je->nr_running++;
 			je->nr_ramp++;
-		} else if (td->runstate == TD_SETTING_UP)
+		} else if (td->runstate == TD_SETTING_UP) {
 			je->nr_running++;
-		else if (td->runstate < TD_RUNNING)
+			je->nr_setting_up++;
+		} else if (td->runstate < TD_RUNNING)
 			je->nr_pending++;
 
 		if (je->elapsed_sec >= 3)
@@ -361,7 +363,7 @@
 
 		check_str_update(td);
 
-		if (td->runstate > TD_RAMP) {
+		if (td->runstate > TD_SETTING_UP) {
 			int ddir;
 
 			for (ddir = DDIR_READ; ddir < DDIR_RWDIR_CNT; ddir++) {
@@ -471,8 +473,13 @@
 		if ((!je->eta_sec && !eta_good) || je->nr_ramp == je->nr_running)
 			strcpy(perc_str, "-.-% done");
 		else {
+			double mult = 100.0;
+
+			if (je->nr_setting_up && je->nr_running)
+				mult *= (1.0 - (double) je->nr_setting_up / (double) je->nr_running);
+
 			eta_good = 1;
-			perc *= 100.0;
+			perc *= mult;
 			sprintf(perc_str, "%3.1f%% done", perc);
 		}
 
diff --git a/server.c b/server.c
index 884ff8e..e3fbf0f 100644
--- a/server.c
+++ b/server.c
@@ -681,6 +681,7 @@
 	je->nr_running		= cpu_to_le32(je->nr_running);
 	je->nr_ramp		= cpu_to_le32(je->nr_ramp);
 	je->nr_pending		= cpu_to_le32(je->nr_pending);
+	je->nr_setting_up	= cpu_to_le32(je->nr_setting_up);
 	je->files_open		= cpu_to_le32(je->files_open);
 
 	for (i = 0; i < DDIR_RWDIR_CNT; i++) {
diff --git a/server.h b/server.h
index 478c283..46745aa 100644
--- a/server.h
+++ b/server.h
@@ -38,7 +38,7 @@
 };
 
 enum {
-	FIO_SERVER_VER			= 22,
+	FIO_SERVER_VER			= 23,
 
 	FIO_SERVER_MAX_FRAGMENT_PDU	= 1024,
 
diff --git a/stat.h b/stat.h
index 76a71d4..0125f57 100644
--- a/stat.h
+++ b/stat.h
@@ -181,6 +181,7 @@
 	uint32_t nr_running;
 	uint32_t nr_ramp;
 	uint32_t nr_pending;
+	uint32_t nr_setting_up;
 	uint32_t files_open;
 	uint32_t m_rate[DDIR_RWDIR_CNT], t_rate[DDIR_RWDIR_CNT];
 	uint32_t m_iops[DDIR_RWDIR_CNT], t_iops[DDIR_RWDIR_CNT];