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)
INIT_LIST_HEAD(&td->io_u_freelist);
INIT_LIST_HEAD(&td->io_u_busylist);
INIT_LIST_HEAD(&td->io_u_requeues);
- INIT_LIST_HEAD(&td->io_hist_list);
INIT_LIST_HEAD(&td->io_log_list);
+ INIT_LIST_HEAD(&td->io_hist_list);
+ td->io_hist_tree = RB_ROOT;
if (init_io_u(td))
goto err_sem;
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;
close_files(td);
close_ioengine(td);
cleanup_io_u(td);
+ options_mem_free(td);
td_set_runstate(td, TD_EXITED);
return (void *) (unsigned long) td->error;
err_sem: