Add options for disabling slat/clat/bw measurements

Useful for cutting down on the number of gettimeofday calls in
situations where that does impact performance. This is mostly for
really high IOPS rates.

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
diff --git a/HOWTO b/HOWTO
index 129926b..1d1aa61 100644
--- a/HOWTO
+++ b/HOWTO
@@ -835,6 +835,19 @@
 disk_util=bool	Generate disk utilization statistics, if the platform
 		supports it. Defaults to on.
 
+disable_clat=bool Disable measurements of completion latency numbers. Useful
+		only for cutting back the number of calls to gettimeofday,
+		as that does impact performance at really high IOPS rates.
+		Note that to really get rid of a large amount of these
+		calls, this option must be used with disable_slat and
+		disable_bw as well.
+
+disable_slat=bool Disable measurements of submission latency numbers. See
+		disable_clat.
+
+disable_bw=bool	Disable measurements of throughput/bandwidth numbers. See
+		disable_clat.
+
 
 6.0 Interpreting the output
 ---------------------------
diff --git a/fio.h b/fio.h
index 1484749..690afad 100644
--- a/fio.h
+++ b/fio.h
@@ -496,6 +496,9 @@
 	unsigned int zero_buffers;
 	unsigned int refill_buffers;
 	unsigned int time_based;
+	unsigned int disable_clat;
+	unsigned int disable_slat;
+	unsigned int disable_bw;
 
 	char *read_iolog_file;
 	char *write_iolog_file;
diff --git a/io_u.c b/io_u.c
index 0896942..62a76b9 100644
--- a/io_u.c
+++ b/io_u.c
@@ -905,11 +905,16 @@
 		td->this_io_bytes[idx] += bytes;
 
 		if (ramp_time_over(td)) {
-			usec = utime_since(&io_u->issue_time, &icd->time);
+			if (!td->o.disable_clat || !td->o.disable_bw)
+				usec = utime_since(&io_u->issue_time,
+							&icd->time);
 
-			add_clat_sample(td, idx, usec);
-			add_bw_sample(td, idx, &icd->time);
-			io_u_mark_latency(td, usec);
+			if (!td->o.disable_clat) {
+				add_clat_sample(td, idx, usec);
+				io_u_mark_latency(td, usec);
+			}
+			if (!td->o.disable_bw)
+				add_bw_sample(td, idx, &icd->time);
 		}
 
 		if (td_write(td) && idx == DDIR_WRITE &&
@@ -930,9 +935,11 @@
 	}
 }
 
-static void init_icd(struct io_completion_data *icd, int nr)
+static void init_icd(struct thread_data *td, struct io_completion_data *icd,
+		     int nr)
 {
-	fio_gettime(&icd->time, NULL);
+	if (!td->o.disable_clat || !td->o.disable_bw)
+		fio_gettime(&icd->time, NULL);
 
 	icd->nr = nr;
 
@@ -961,7 +968,7 @@
 {
 	struct io_completion_data icd;
 
-	init_icd(&icd, 1);
+	init_icd(td, &icd, 1);
 	io_completed(td, io_u, &icd);
 	put_io_u(td, io_u);
 
@@ -994,7 +1001,7 @@
 	} else if (!ret)
 		return ret;
 
-	init_icd(&icd, ret);
+	init_icd(td, &icd, ret);
 	ios_completed(td, &icd);
 	if (!icd.error)
 		return icd.bytes_done[0] + icd.bytes_done[1];
@@ -1008,10 +1015,12 @@
  */
 void io_u_queued(struct thread_data *td, struct io_u *io_u)
 {
-	unsigned long slat_time;
+	if (!td->o.disable_slat) {
+		unsigned long slat_time;
 
-	slat_time = utime_since(&io_u->start_time, &io_u->issue_time);
-	add_slat_sample(td, io_u->ddir, slat_time);
+		slat_time = utime_since(&io_u->start_time, &io_u->issue_time);
+		add_slat_sample(td, io_u->ddir, slat_time);
+	}
 }
 
 /*
diff --git a/ioengines.c b/ioengines.c
index 3ef0d03..9daeaab 100644
--- a/ioengines.c
+++ b/ioengines.c
@@ -210,6 +210,15 @@
 	return r;
 }
 
+static inline int get_issue_time(struct thread_data *td)
+{
+	if (td->o.read_iolog_file ||
+	    !td->o.disable_clat || !td->o.disable_slat || !td->o.disable_bw)
+		return 1;
+
+	return 0;
+}
+
 int td_io_queue(struct thread_data *td, struct io_u *io_u)
 {
 	int ret;
@@ -226,7 +235,8 @@
 	io_u->resid = 0;
 
 	if (td->io_ops->flags & FIO_SYNCIO) {
-		fio_gettime(&io_u->issue_time, NULL);
+		if (get_issue_time(td))
+			fio_gettime(&io_u->issue_time, NULL);
 
 		/*
 		 * only used for iolog
@@ -269,7 +279,8 @@
 	}
 
 	if ((td->io_ops->flags & FIO_SYNCIO) == 0) {
-		fio_gettime(&io_u->issue_time, NULL);
+		if (get_issue_time(td))
+			fio_gettime(&io_u->issue_time, NULL);
 
 		/*
 		 * only used for iolog
diff --git a/options.c b/options.c
index 8723adf..d4fc184 100644
--- a/options.c
+++ b/options.c
@@ -1291,6 +1291,27 @@
 	},
 #endif
 	{
+		.name	= "disable_clat",
+		.type	= FIO_OPT_BOOL,
+		.off1	= td_var_offset(disable_clat),
+		.help	= "Disable completion latency numbers",
+		.def	= "0",
+	},
+	{
+		.name	= "disable_slat",
+		.type	= FIO_OPT_BOOL,
+		.off1	= td_var_offset(disable_slat),
+		.help	= "Disable submissionn latency numbers",
+		.def	= "0",
+	},
+	{
+		.name	= "disable_bw_measurement",
+		.type	= FIO_OPT_BOOL,
+		.off1	= td_var_offset(disable_bw),
+		.help	= "Disable bandwidth logging",
+		.def	= "0",
+	},
+	{
 		.name = NULL,
 	},
 };