Improve data direction runtime logging
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index de5c976e85cb0d636eadd21768fefaf601a66c95..9fabbe93bc53a7887cc6457371b55ea202ff3ebc 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -588,6 +588,7 @@ static void fill_rand_buf(struct io_u *io_u, int max_bs)
 
 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;
@@ -599,12 +600,19 @@ static int init_io_u(struct thread_data *td)
                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);
-       else
-               td->orig_buffer_size += page_mask;
+       else if (td->orig_buffer_size & page_mask)
+               td->orig_buffer_size = (td->orig_buffer_size + page_mask) & ~page_mask;
 
        if (allocate_io_mem(td))
                return 1;
@@ -691,6 +699,7 @@ static int clear_io_state(struct thread_data *td)
        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;
 
@@ -715,6 +724,7 @@ static void *thread_main(void *data)
 {
        unsigned long long runtime[2];
        struct thread_data *td = data;
+       unsigned long elapsed;
        int clear_state;
 
        if (!td->o.use_thread)
@@ -773,6 +783,9 @@ static void *thread_main(void *data)
        if (open_files(td))
                goto err;
 
+       if (init_random_map(td))
+               goto err;
+
        if (td->o.exec_prerun) {
                if (system(td->o.exec_prerun) < 0)
                        goto err;
@@ -800,10 +813,22 @@ static void *thread_main(void *data)
 
                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;