Previously, fio checked this on completion, which means we could
almost spill over by the iodepth setting. Check this before
issue instead, taking the in flight IOs into account as well.
Reported-by: Robert Elliott <Elliott@hp.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
static int io_bytes_exceeded(struct thread_data *td)
{
static int io_bytes_exceeded(struct thread_data *td)
{
+ unsigned long long number_ios = 0;
unsigned long long bytes;
if (td_rw(td))
unsigned long long bytes;
if (td_rw(td))
else
bytes = td->this_io_bytes[DDIR_TRIM];
else
bytes = td->this_io_bytes[DDIR_TRIM];
- return bytes >= td->o.size;
+ if (td->o.number_ios) {
+ number_ios = ddir_rw_sum(td->this_io_blocks);
+ number_ios += td->io_u_queued + td->io_u_in_flight;
+ }
+
+ return bytes >= td->o.size ||
+ (number_ios && number_ios >= td->o.number_ios);
+ if (td->o.number_ios) {
+ unsigned long long number_ios = ddir_rw_sum(td->this_io_blocks);
+
+ number_ios += td->io_u_queued + td->io_u_in_flight;
+ if (number_ios >= td->o.number_ios)
+ return 0;
+ }
+
if (td->o.size != -1ULL && ddir_rw_sum(td->io_bytes) < td->o.size) {
uint64_t diff;
if (td->o.size != -1ULL && ddir_rw_sum(td->io_bytes) < td->o.size) {
uint64_t diff;
if (!gtod_reduce(td))
add_iops_sample(td, idx, bytes, &icd->time);
if (!gtod_reduce(td))
add_iops_sample(td, idx, bytes, &icd->time);
-
- if (td->o.number_ios && !--td->o.number_ios)
- td->done = 1;
}
static long long usec_for_io(struct thread_data *td, enum fio_ddir ddir)
}
static long long usec_for_io(struct thread_data *td, enum fio_ddir ddir)