[PATCH] Time and seek optimizations

We did too many gettimeofday() calls, this patch cuts the number by
40%. Use clock_gettime() MONOTONIC instead, it is faster on my system
at least.

This patch also optimizes calling lseek() only when necessary for the
sync io engine.

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
diff --git a/io_u.c b/io_u.c
index 318614c..8ec9dd9 100644
--- a/io_u.c
+++ b/io_u.c
@@ -153,7 +153,7 @@
 		struct timeval now;
 		unsigned long elapsed;
 
-		gettimeofday(&now, NULL);
+		fio_gettime(&now, NULL);
 	 	elapsed = mtime_since_now(&td->rwmix_switch);
 
 		/*
@@ -296,14 +296,13 @@
 		return NULL;
 	}
 
-	gettimeofday(&io_u->start_time, NULL);
+	fio_gettime(&io_u->start_time, NULL);
 	return io_u;
 }
 
 void io_completed(struct thread_data *td, struct io_u *io_u,
 		  struct io_completion_data *icd)
 {
-	struct timeval e;
 	unsigned long msec;
 
 	if (io_u->ddir == DDIR_SYNC) {
@@ -313,8 +312,6 @@
 
 	td->last_was_sync = 0;
 
-	gettimeofday(&e, NULL);
-
 	if (!io_u->error) {
 		unsigned int bytes = io_u->buflen - io_u->resid;
 		const int idx = io_u->ddir;
@@ -324,10 +321,12 @@
 		td->zone_bytes += bytes;
 		td->this_io_bytes[idx] += bytes;
 
-		msec = mtime_since(&io_u->issue_time, &e);
+		io_u->file->last_completed_pos = io_u->offset + io_u->buflen;
+
+		msec = mtime_since(&io_u->issue_time, &icd->time);
 
 		add_clat_sample(td, idx, msec);
-		add_bw_sample(td, idx);
+		add_bw_sample(td, idx, &icd->time);
 
 		if ((td_rw(td) || td_write(td)) && idx == DDIR_WRITE)
 			log_io_piece(td, io_u);
@@ -342,6 +341,8 @@
 	struct io_u *io_u;
 	int i;
 
+	fio_gettime(&icd->time, NULL);
+
 	icd->error = 0;
 	icd->bytes_done[0] = icd->bytes_done[1] = 0;