Scramble fix
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index 2855ddf289748cf93e506aa7950aa82c2ac43e11..b492889f740b1745922fe2fb0a2388b73d91f7b2 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -70,6 +70,8 @@ static pthread_t disk_util_thread;
 static struct flist_head *cgroup_list;
 static char *cgroup_mnt;
 
+unsigned long arch_flags = 0;
+
 struct io_log *agg_io_log[2];
 
 #define TERMINATE_ALL          (-1)
@@ -102,7 +104,9 @@ static void terminate_threads(int group_id)
                        /*
                         * if the thread is running, just let it exit
                         */
-                       if (td->runstate < TD_RAMP)
+                       if (!td->pid)
+                               continue;
+                       else if (td->runstate < TD_RAMP)
                                kill(td->pid, SIGTERM);
                        else {
                                struct ioengine_ops *ops = td->io_ops;
@@ -548,13 +552,14 @@ sync_done:
 
                /*
                 * if we can queue more, do so. but check if there are
-                * completed io_u's first.
+                * completed io_u's first. Note that we can get BUSY even
+                * without IO queued, if the system is resource starved.
                 */
-               full = queue_full(td) || ret == FIO_Q_BUSY;
+               full = queue_full(td) || (ret == FIO_Q_BUSY && td->cur_depth);
                if (full || !td->o.iodepth_batch_complete) {
                        min_events = min(td->o.iodepth_batch_complete,
                                         td->cur_depth);
-                       if (full && !min_events)
+                       if (full && !min_events && td->o.iodepth_batch_complete != 0)
                                min_events = 1;
 
                        do {
@@ -708,13 +713,15 @@ sync_done:
                        break;
 
                /*
-                * See if we need to complete some commands
+                * See if we need to complete some commands. Note that we
+                * can get BUSY even without IO queued, if the system is
+                * resource starved.
                 */
-               full = queue_full(td) || ret == FIO_Q_BUSY;
+               full = queue_full(td) || (ret == FIO_Q_BUSY && td->cur_depth);
                if (full || !td->o.iodepth_batch_complete) {
                        min_evts = min(td->o.iodepth_batch_complete,
                                        td->cur_depth);
-                       if (full && !min_evts)
+                       if (full && !min_evts && td->o.iodepth_batch_complete != 0)
                                min_evts = 1;
 
                        if (__should_check_rate(td, 0) ||
@@ -867,9 +874,9 @@ static int init_io_u(struct thread_data *td)
                        io_u->buf = p + max_bs * i;
                        dprint(FD_MEM, "io_u %p, mem %p\n", io_u, io_u->buf);
 
-                       if (td_write(td) && !td->o.refill_buffers)
+                       if (td_write(td))
                                io_u_fill_buffer(td, io_u, max_bs);
-                       else if (td_write(td) && td->o.verify_pattern_bytes) {
+                       if (td_write(td) && td->o.verify_pattern_bytes) {
                                /*
                                 * Fill the buffer with the pattern if we are
                                 * going to be doing writes.
@@ -1495,10 +1502,8 @@ static void run_threads(void)
        for_each_td(td, i) {
                print_status_init(td->thread_number - 1);
 
-               if (!td->o.create_serialize) {
-                       init_disk_util(td);
+               if (!td->o.create_serialize)
                        continue;
-               }
 
                /*
                 * do file setup here so it happens sequentially,
@@ -1526,8 +1531,6 @@ static void run_threads(void)
                                        td_io_close_file(td, f);
                        }
                }
-
-               init_disk_util(td);
        }
 
        set_genesis_time();
@@ -1566,6 +1569,8 @@ static void run_threads(void)
                                break;
                        }
 
+                       init_disk_util(td);
+
                        /*
                         * Set state to created. Thread will transition
                         * to TD_INITIALIZED when it's done setting up.
@@ -1685,12 +1690,13 @@ static void run_threads(void)
        fio_unpin_memory();
 }
 
-int main(int argc, char *argv[])
+int main(int argc, char *argv[], char *envp[])
 {
        long ps;
 
+       arch_init(envp);
+
        sinit();
-       init_rand(&__fio_rand_state);
 
        /*
         * We need locale for number printing, if it isn't set then just