Improve rate limiting

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
diff --git a/io_u.c b/io_u.c
index 126a9a8..bac6573 100644
--- a/io_u.c
+++ b/io_u.c
@@ -953,21 +953,27 @@
 		td->this_io_bytes[idx] += bytes;
 
 		if (ramp_time_over(td)) {
-			if (!td->o.disable_clat || !td->o.disable_bw ||
-			    __should_check_rate(td, idx))
-				usec = utime_since(&io_u->issue_time,
+			unsigned long uninitialized_var(lusec);
+			unsigned long uninitialized_var(rusec);
+
+			if (!td->o.disable_clat || !td->o.disable_bw)
+				lusec = utime_since(&io_u->issue_time,
+							&icd->time);
+			if (__should_check_rate(td, idx) ||
+			    __should_check_rate(td, idx ^ 1))
+				rusec = utime_since(&io_u->start_time,
 							&icd->time);
 
 			if (!td->o.disable_clat) {
 				add_clat_sample(td, idx, usec, bytes);
-				io_u_mark_latency(td, usec);
+				io_u_mark_latency(td, lusec);
 			}
 			if (!td->o.disable_bw)
 				add_bw_sample(td, idx, bytes, &icd->time);
 			if (__should_check_rate(td, idx))
-				td->rate_pending_usleep[idx] += (long) td->rate_usec_cycle[idx] - usec;
+				td->rate_pending_usleep[idx] += (long) td->rate_usec_cycle[idx] - rusec;
 			if (__should_check_rate(td, idx ^ 1))
-				td->rate_pending_usleep[idx ^ 1] -= usec;
+				td->rate_pending_usleep[idx ^ 1] -= lusec;
 		}
 
 		if (td_write(td) && idx == DDIR_WRITE &&