+static int setup_rate(struct thread_data *td)
+{
+ unsigned long nr_reads_per_msec;
+ unsigned long long rate;
+ unsigned int bs;
+
+ if (!td->o.rate && !td->o.rate_iops)
+ return 0;
+
+ if (td_rw(td))
+ bs = td->o.rw_min_bs;
+ else if (td_read(td))
+ bs = td->o.min_bs[DDIR_READ];
+ else
+ bs = td->o.min_bs[DDIR_WRITE];
+
+ if (td->o.rate) {
+ rate = td->o.rate;
+ nr_reads_per_msec = (rate * 1024 * 1000LL) / bs;
+ } else
+ nr_reads_per_msec = td->o.rate_iops * 1000UL;
+
+ if (!nr_reads_per_msec) {
+ log_err("rate lower than supported\n");
+ return -1;
+ }
+
+ td->rate_usec_cycle = 1000000000ULL / nr_reads_per_msec;
+ td->rate_pending_usleep = 0;
+ return 0;
+}
+