time: ensure that offload mode switches parent out of ramp
authorJens Axboe <axboe@kernel.dk>
Wed, 13 Sep 2017 15:03:20 +0000 (09:03 -0600)
committerJens Axboe <axboe@kernel.dk>
Wed, 13 Sep 2017 15:03:20 +0000 (09:03 -0600)
If we have worker threads submitting IO for the jobs AND using
ramp time, then we need to ensure that the parent job is switched out of
ramp mode. This normally happens as part of IO submission, but since
we have worker threads doing that for us, it never happens for the
parent.

Fixes: https://github.com/axboe/fio/issues/459
Signed-off-by: Jens Axboe <axboe@kernel.dk>
time.c

diff --git a/time.c b/time.c
index 07984190d67a914173e1980f0ed0461b45ea5ee8..28c20717406029bc584e583810e24416d0cf2457 100644 (file)
--- a/time.c
+++ b/time.c
@@ -97,16 +97,17 @@ bool in_ramp_time(struct thread_data *td)
        return td->o.ramp_time && !td->ramp_time_over;
 }
 
        return td->o.ramp_time && !td->ramp_time_over;
 }
 
-static void parent_update_ramp(struct thread_data *td)
+static bool parent_update_ramp(struct thread_data *td)
 {
        struct thread_data *parent = td->parent;
 
        if (!parent || parent->ramp_time_over)
 {
        struct thread_data *parent = td->parent;
 
        if (!parent || parent->ramp_time_over)
-               return;
+               return false;
 
        reset_all_stats(parent);
        parent->ramp_time_over = 1;
        td_set_runstate(parent, TD_RAMP);
 
        reset_all_stats(parent);
        parent->ramp_time_over = 1;
        td_set_runstate(parent, TD_RAMP);
+       return true;
 }
 
 bool ramp_time_over(struct thread_data *td)
 }
 
 bool ramp_time_over(struct thread_data *td)
@@ -118,7 +119,15 @@ bool ramp_time_over(struct thread_data *td)
                td->ramp_time_over = 1;
                reset_all_stats(td);
                td_set_runstate(td, TD_RAMP);
                td->ramp_time_over = 1;
                reset_all_stats(td);
                td_set_runstate(td, TD_RAMP);
-               parent_update_ramp(td);
+
+               /*
+                * If we have a parent, the parent isn't doing IO. Hence
+                * the parent never enters do_io(), which will switch us
+                * from RAMP -> RUNNING. Do this manually here.
+                */
+               if (parent_update_ramp(td))
+                       td_set_runstate(td, TD_RUNNING);
+
                return true;
        }
 
                return true;
        }