Add total latency log

We log submission and completion latencies, also log total latencies.
This makes it easier to graph and make histograms, if you care only
about the complete latency.

Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
diff --git a/stat.c b/stat.c
index 143325a..0f259d2 100644
--- a/stat.c
+++ b/stat.c
@@ -210,6 +210,22 @@
 		free(minp);
 		free(maxp);
 	}
+	if (calc_lat(&ts->lat_stat[ddir], &min, &max, &mean, &dev)) {
+		const char *base = "(usec)";
+		char *minp, *maxp;
+
+		if (!usec_to_msec(&min, &max, &mean, &dev))
+			base = "(msec)";
+
+		minp = num2str(min, 6, 1, 0);
+		maxp = num2str(max, 6, 1, 0);
+
+		log_info("     lat %s: min=%s, max=%s, avg=%5.02f,"
+			 " stdev=%5.02f\n", base, minp, maxp, mean, dev);
+
+		free(minp);
+		free(maxp);
+	}
 	if (calc_lat(&ts->bw_stat[ddir], &min, &max, &mean, &dev)) {
 		double p_of_agg;
 
@@ -371,6 +387,11 @@
 	else
 		log_info(";%lu;%lu;%f;%f", 0UL, 0UL, 0.0, 0.0);
 
+	if (calc_lat(&ts->lat_stat[ddir], &min, &max, &mean, &dev))
+		log_info(";%lu;%lu;%f;%f", min, max, mean, dev);
+	else
+		log_info(";%lu;%lu;%f;%f", 0UL, 0UL, 0.0, 0.0);
+
 	if (calc_lat(&ts->bw_stat[ddir], &min, &max, &mean, &dev)) {
 		double p_of_agg;
 
@@ -498,6 +519,7 @@
 
 		memset(ts, 0, sizeof(*ts));
 		for (j = 0; j <= DDIR_WRITE; j++) {
+			ts->lat_stat[j].min_val = -1UL;
 			ts->clat_stat[j].min_val = -1UL;
 			ts->slat_stat[j].min_val = -1UL;
 			ts->bw_stat[j].min_val = -1UL;
@@ -559,6 +581,7 @@
 		for (l = 0; l <= DDIR_WRITE; l++) {
 			sum_stat(&ts->clat_stat[l], &td->ts.clat_stat[l], idx);
 			sum_stat(&ts->slat_stat[l], &td->ts.slat_stat[l], idx);
+			sum_stat(&ts->lat_stat[l], &td->ts.lat_stat[l], idx);
 			sum_stat(&ts->bw_stat[l], &td->ts.bw_stat[l], idx);
 
 			ts->stat_io_bytes[l] += td->ts.stat_io_bytes[l];
@@ -742,6 +765,17 @@
 		add_log_sample(td, ts->slat_log, usec, ddir, bs);
 }
 
+void add_lat_sample(struct thread_data *td, enum fio_ddir ddir,
+		    unsigned long usec, unsigned int bs)
+{
+	struct thread_stat *ts = &td->ts;
+
+	add_stat_sample(&ts->lat_stat[ddir], usec);
+
+	if (ts->lat_log)
+		add_log_sample(td, ts->lat_log, usec, ddir, bs);
+}
+
 void add_bw_sample(struct thread_data *td, enum fio_ddir ddir, unsigned int bs,
 		   struct timeval *t)
 {