/*
* If we're ignoring thinktime for the rate, add the number of bytes
- * we would have done while sleeping.
+ * we would have done while sleeping, minus one block to ensure we
+ * start issuing immediately after the sleep.
*/
- if (total && td->rate_bps[ddir] && td->o.rate_ign_think)
- td->rate_io_issue_bytes[ddir] += (td->rate_bps[ddir] * 1000000) / total;
+ if (total && td->rate_bps[ddir] && td->o.rate_ign_think) {
+ uint64_t missed = (td->rate_bps[ddir] * total) / 1000000ULL;
+ uint64_t bs = td->o.min_bs[ddir];
+ uint64_t usperop = bs * 1000000ULL / td->rate_bps[ddir];
+ uint64_t over;
+
+ if (usperop <= total)
+ over = bs;
+ else
+ over = (usperop - total) / usperop * -bs;
+
+ td->rate_io_issue_bytes[ddir] += (missed - over);
+ }
}
/*