flow: quiesce pending IO before sleep
[fio.git] / backend.c
index f48b43dc8f58c3794003e5fd98303a9dcb26e284..6b6da67645870b74a59eb6c619d82ed870aee60b 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -822,6 +822,8 @@ sync_done:
                        if (!(b % td->o.thinktime_blocks)) {
                                int left;
 
+                               io_u_quiesce(td);
+
                                if (td->o.thinktime_spin)
                                        usec_spin(td->o.thinktime_spin);
 
@@ -1558,6 +1560,12 @@ reaped:
                fio_terminate_threads(TERMINATE_ALL);
 }
 
+static void do_usleep(unsigned int usecs)
+{
+       check_for_running_stats();
+       usleep(usecs);
+}
+
 /*
  * Main function for kicking off and reaping jobs, as needed.
  */
@@ -1736,7 +1744,7 @@ static void run_threads(void)
                        if (mtime_since_now(&this_start) > JOB_START_TIMEOUT)
                                break;
 
-                       usleep(100000);
+                       do_usleep(100000);
 
                        for (i = 0; i < this_jobs; i++) {
                                td = map[i];
@@ -1788,12 +1796,12 @@ static void run_threads(void)
                reap_threads(&nr_running, &t_rate, &m_rate);
 
                if (todo)
-                       usleep(100000);
+                       do_usleep(100000);
        }
 
        while (nr_running) {
                reap_threads(&nr_running, &t_rate, &m_rate);
-               usleep(10000);
+               do_usleep(10000);
        }
 
        fio_idle_prof_stop();
@@ -1889,6 +1897,7 @@ int fio_backend(void)
                return 1;
 
        set_genesis_time();
+       stat_init();
        create_disk_util_thread();
 
        cgroup_list = smalloc(sizeof(*cgroup_list));
@@ -1918,5 +1927,6 @@ int fio_backend(void)
        fio_mutex_remove(startup_mutex);
        fio_mutex_remove(writeout_mutex);
        fio_mutex_remove(disk_thread_mutex);
+       stat_exit();
        return exit_value;
 }