server: start conversion of data structures to network friendly types
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index a8608f49fdd4023c6e54d4e3cf38ec14234498f5..762303e5793447808efe36dc0553043b17d6b3af 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -46,6 +46,7 @@
 #include "profile.h"
 #include "lib/rand.h"
 #include "memalign.h"
+#include "server.h"
 
 unsigned long page_mask;
 unsigned long page_size;
@@ -70,6 +71,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 +105,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;
@@ -118,6 +123,7 @@ static void sig_int(int sig)
 {
        if (threads) {
                log_info("\nfio: terminating on signal %d\n", sig);
+               exit_backend = 1;
                fflush(stdout);
                exit_value = 128;
                terminate_threads(TERMINATE_ALL);
@@ -548,13 +554,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 +715,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 +876,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.
@@ -1045,10 +1054,11 @@ static void *thread_main(void *data)
        pthread_condattr_t attr;
        int clear_state;
 
-       if (!td->o.use_thread)
+       if (!td->o.use_thread) {
                setsid();
-
-       td->pid = getpid();
+               td->pid = getpid();
+       } else
+               td->pid = gettid();
 
        dprint(FD_PROCESS, "jobs pid=%d started\n", (int) td->pid);
 
@@ -1220,33 +1230,33 @@ static void *thread_main(void *data)
        td->ts.io_bytes[1] = td->io_bytes[1];
 
        fio_mutex_down(writeout_mutex);
-       if (td->ts.bw_log) {
+       if (td->bw_log) {
                if (td->o.bw_log_file) {
-                       finish_log_named(td, td->ts.bw_log,
+                       finish_log_named(td, td->bw_log,
                                                td->o.bw_log_file, "bw");
                } else
-                       finish_log(td, td->ts.bw_log, "bw");
+                       finish_log(td, td->bw_log, "bw");
        }
-       if (td->ts.lat_log) {
+       if (td->lat_log) {
                if (td->o.lat_log_file) {
-                       finish_log_named(td, td->ts.lat_log,
+                       finish_log_named(td, td->lat_log,
                                                td->o.lat_log_file, "lat");
                } else
-                       finish_log(td, td->ts.lat_log, "lat");
+                       finish_log(td, td->lat_log, "lat");
        }
-       if (td->ts.slat_log) {
+       if (td->slat_log) {
                if (td->o.lat_log_file) {
-                       finish_log_named(td, td->ts.slat_log,
+                       finish_log_named(td, td->slat_log,
                                                td->o.lat_log_file, "slat");
                } else
-                       finish_log(td, td->ts.slat_log, "slat");
+                       finish_log(td, td->slat_log, "slat");
        }
-       if (td->ts.clat_log) {
+       if (td->clat_log) {
                if (td->o.lat_log_file) {
-                       finish_log_named(td, td->ts.clat_log,
+                       finish_log_named(td, td->clat_log,
                                                td->o.lat_log_file, "clat");
                } else
-                       finish_log(td, td->ts.clat_log, "clat");
+                       finish_log(td, td->clat_log, "clat");
        }
        fio_mutex_up(writeout_mutex);
        if (td->o.exec_postrun)
@@ -1494,10 +1504,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,
@@ -1525,8 +1533,6 @@ static void run_threads(void)
                                        td_io_close_file(td, f);
                        }
                }
-
-               init_disk_util(td);
        }
 
        set_genesis_time();
@@ -1565,6 +1571,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.
@@ -1684,34 +1692,10 @@ static void run_threads(void)
        fio_unpin_memory();
 }
 
-int main(int argc, char *argv[])
+int exec_run(void)
 {
-       long ps;
-
-       sinit();
-       init_rand(&__fio_rand_state);
-
-       /*
-        * We need locale for number printing, if it isn't set then just
-        * go with the US format.
-        */
-       if (!getenv("LC_NUMERIC"))
-               setlocale(LC_NUMERIC, "en_US");
-
-       ps = sysconf(_SC_PAGESIZE);
-       if (ps < 0) {
-               log_err("Failed to get page size\n");
-               return 1;
-       }
-
-       page_size = ps;
-       page_mask = ps - 1;
-
-       fio_keywords_init();
-
-       if (parse_options(argc, argv))
-               return 1;
-
+       if (nr_clients)
+               return fio_handle_clients();
        if (exec_profile && load_profile(exec_profile))
                return 1;
 
@@ -1755,3 +1739,44 @@ int main(int argc, char *argv[])
        fio_mutex_remove(writeout_mutex);
        return exit_value;
 }
+
+void reset_fio_state(void)
+{
+       groupid = 0;
+       thread_number = 0;
+       nr_process = 0;
+       nr_thread = 0;
+       done_secs = 0;
+}
+
+int main(int argc, char *argv[], char *envp[])
+{
+       long ps;
+
+       arch_init(envp);
+
+       sinit();
+
+       /*
+        * We need locale for number printing, if it isn't set then just
+        * go with the US format.
+        */
+       if (!getenv("LC_NUMERIC"))
+               setlocale(LC_NUMERIC, "en_US");
+
+       ps = sysconf(_SC_PAGESIZE);
+       if (ps < 0) {
+               log_err("Failed to get page size\n");
+               return 1;
+       }
+
+       page_size = ps;
+       page_mask = ps - 1;
+
+       fio_keywords_init();
+
+       if (parse_options(argc, argv))
+               return 1;
+
+       return exec_run();
+}