Add low water mark for queuing depth
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index 6176b77a22d2cf54147e03da51684bdb431d2d30..1c2748e06ee4483b0cdef5457757985140a133a6 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -287,9 +287,13 @@ requeue:
                 * completed io_u's first.
                 */
                min_events = 0;
-               if (queue_full(td) || ret == FIO_Q_BUSY)
+               if (queue_full(td) || ret == FIO_Q_BUSY) {
                        min_events = 1;
 
+                       if (td->cur_depth > td->iodepth_low)
+                               min_events = td->cur_depth - td->iodepth_low;
+               }
+
                /*
                 * Reap required number of io units, if any, and do the
                 * verification on them through the callback handler
@@ -385,6 +389,13 @@ requeue:
                                ret = bytes_done;
                        break;
                case FIO_Q_QUEUED:
+                       /*
+                        * if the engine doesn't have a commit hook,
+                        * the io_u is really queued. if it does have such
+                        * a hook, it has to call io_u_queued() itself.
+                        */
+                       if (td->io_ops->commit == NULL)
+                               io_u_queued(td, io_u);
                        break;
                case FIO_Q_BUSY:
                        requeue_io_u(td, &io_u);
@@ -399,17 +410,18 @@ requeue:
                if (ret < 0 || td->error)
                        break;
 
-               if (io_u)
-                       add_slat_sample(td, io_u->ddir, mtime_since(&io_u->start_time, &io_u->issue_time));
-
                /*
                 * See if we need to complete some commands
                 */
                if (ret == FIO_Q_QUEUED || ret == FIO_Q_BUSY) {
                        min_evts = 0;
-                       if (queue_full(td) || ret == FIO_Q_BUSY)
+                       if (queue_full(td) || ret == FIO_Q_BUSY) {
                                min_evts = 1;
 
+                               if (td->cur_depth > td->iodepth_low)
+                                       min_evts = td->cur_depth - td->iodepth_low;
+                       }
+
                        fio_gettime(&comp_time, NULL);
                        bytes_done = io_u_queued_complete(td, min_evts, NULL);
                        if (bytes_done < 0)
@@ -593,7 +605,7 @@ static void clear_io_state(struct thread_data *td)
        struct fio_file *f;
        int i;
 
-       td->stat_io_bytes[0] = td->stat_io_bytes[1] = 0;
+       td->ts.stat_io_bytes[0] = td->ts.stat_io_bytes[1] = 0;
        td->this_io_bytes[0] = td->this_io_bytes[1] = 0;
        td->zone_bytes = 0;
 
@@ -682,15 +694,15 @@ static void *thread_main(void *data)
        }
 
        fio_gettime(&td->epoch, NULL);
-       getrusage(RUSAGE_SELF, &td->ru_start);
+       getrusage(RUSAGE_SELF, &td->ts.ru_start);
 
        runtime[0] = runtime[1] = 0;
        while (td->loops--) {
                fio_gettime(&td->start, NULL);
-               memcpy(&td->stat_sample_time, &td->start, sizeof(td->start));
+               memcpy(&td->ts.stat_sample_time, &td->start, sizeof(td->start));
 
                if (td->ratemin)
-                       memcpy(&td->lastrate, &td->stat_sample_time, sizeof(td->lastrate));
+                       memcpy(&td->lastrate, &td->ts.stat_sample_time, sizeof(td->lastrate));
 
                clear_io_state(td);
                prune_io_piece_log(td);
@@ -726,12 +738,12 @@ static void *thread_main(void *data)
        td->runtime[0] = runtime[0] / 1000;
        td->runtime[1] = runtime[1] / 1000;
 
-       if (td->bw_log)
-               finish_log(td, td->bw_log, "bw");
-       if (td->slat_log)
-               finish_log(td, td->slat_log, "slat");
-       if (td->clat_log)
-               finish_log(td, td->clat_log, "clat");
+       if (td->ts.bw_log)
+               finish_log(td, td->ts.bw_log, "bw");
+       if (td->ts.slat_log)
+               finish_log(td, td->ts.slat_log, "slat");
+       if (td->ts.clat_log)
+               finish_log(td, td->ts.clat_log, "clat");
        if (td->write_iolog_file)
                write_iolog_close(td);
        if (td->exec_postrun) {