static int init_io_u(struct thread_data *td)
{
+ unsigned long long buf_size;
struct io_u *io_u;
unsigned int max_bs;
int i, max_units;
max_units = td->o.iodepth;
max_bs = max(td->o.max_bs[DDIR_READ], td->o.max_bs[DDIR_WRITE]);
- td->orig_buffer_size = max_bs * max_units;
+ buf_size = (unsigned long long) max_bs * (unsigned long long) max_units;
+ buf_size += page_mask;
+ if (buf_size != (size_t) buf_size) {
+ log_err("fio: IO memory too large. Reduce max_bs or iodepth\n");
+ return 1;
+ }
+
+ td->orig_buffer_size = buf_size;
if (td->o.mem_type == MEM_SHMHUGE || td->o.mem_type == MEM_MMAPHUGE)
td->orig_buffer_size = (td->orig_buffer_size + td->o.hugepage_size - 1) & ~(td->o.hugepage_size - 1);
td->zone_bytes = 0;
td->rate_bytes = 0;
td->rate_blocks = 0;
+ td->rw_end_set[0] = td->rw_end_set[1] = 0;
td->last_was_sync = 0;
{
unsigned long long runtime[2];
struct thread_data *td = data;
+ unsigned long elapsed;
int clear_state;
if (!td->o.use_thread)
clear_state = 1;
- if (td_read(td) && td->io_bytes[DDIR_READ])
- runtime[DDIR_READ] += utime_since_now(&td->start);
- if (td_write(td) && td->io_bytes[DDIR_WRITE])
- runtime[DDIR_WRITE] += utime_since_now(&td->start);
+ if (td_read(td) && td->io_bytes[DDIR_READ]) {
+ if (td->rw_end_set[DDIR_READ])
+ elapsed = utime_since(&td->start, &td->rw_end[DDIR_READ]);
+ else
+ elapsed = utime_since_now(&td->start);
+
+ runtime[DDIR_READ] += elapsed;
+ }
+ if (td_write(td) && td->io_bytes[DDIR_WRITE]) {
+ if (td->rw_end_set[DDIR_WRITE])
+ elapsed = utime_since(&td->start, &td->rw_end[DDIR_WRITE]);
+ else
+ elapsed = utime_since_now(&td->start);
+
+ runtime[DDIR_WRITE] += elapsed;
+ }
if (td->error || td->terminate)
break;