Improve data direction runtime logging
If we cut a data direction short, log that time so we don't
account the full runtime.
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
diff --git a/fio.c b/fio.c
index 29fecb7..9fabbe9 100644
--- a/fio.c
+++ b/fio.c
@@ -699,6 +699,7 @@
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;
@@ -723,6 +724,7 @@
{
unsigned long long runtime[2];
struct thread_data *td = data;
+ unsigned long elapsed;
int clear_state;
if (!td->o.use_thread)
@@ -811,10 +813,22 @@
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;
diff --git a/fio.h b/fio.h
index 1fb01d9..e333490 100644
--- a/fio.h
+++ b/fio.h
@@ -493,6 +493,8 @@
struct timeval start; /* start of this loop */
struct timeval epoch; /* time job was started */
+ struct timeval rw_end[2];
+ unsigned int rw_end_set[2];
/*
* read/write mixed workload state
diff --git a/io_u.c b/io_u.c
index 1f9ebbc..fd25dfe 100644
--- a/io_u.c
+++ b/io_u.c
@@ -235,8 +235,13 @@
*/
ddir = get_rand_ddir(td);
max_bytes = td->this_io_bytes[ddir];
- if (max_bytes >= (td->io_size * td->o.rwmix[ddir] / 100))
+ if (max_bytes >= (td->io_size * td->o.rwmix[ddir] / 100)) {
+ if (!td->rw_end_set[ddir]) {
+ td->rw_end_set[ddir] = 1;
+ memcpy(&td->rw_end[ddir], &now, sizeof(now));
+ }
ddir ^= 1;
+ }
if (ddir != td->rwmix_ddir)
set_rwmix_bytes(td);