client/server: add support for passing disk_util structures
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index 3e4dbb749fd97d9a7af718d27a22d5cc15cb749c..e5d3bbf3c204790e7f98b2b36b749f870acdac22 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -62,6 +62,13 @@ int shm_id = 0;
 int temp_stall_ts;
 unsigned long done_secs = 0;
 
+/*
+ * Just expose an empty list, if the OS does not support disk util stats
+ */
+#ifndef FIO_HAVE_DISK_UTIL
+FLIST_HEAD(disk_list);
+#endif
+
 static struct fio_mutex *startup_mutex;
 static struct fio_mutex *writeout_mutex;
 static volatile int fio_abort;
@@ -77,6 +84,50 @@ struct io_log *agg_io_log[2];
 
 #define JOB_START_TIMEOUT      (5 * 1000)
 
+static const char *fio_os_strings[os_nr] = {
+       "Invalid",
+       "Linux",
+       "AIX",
+       "FreeBSD",
+       "HP-UX",
+       "OSX",
+       "NetBSD",
+       "Solaris",
+       "Windows"
+};
+
+static const char *fio_arch_strings[arch_nr] = {
+       "Invalid",
+       "x86-64",
+       "x86",
+       "ppc",
+       "ia64",
+       "s390",
+       "alpha",
+       "sparc",
+       "sparc64",
+       "arm",
+       "sh",
+       "hppa",
+       "generic"
+};
+
+const char *fio_get_os_string(int nr)
+{
+       if (nr < os_nr)
+               return fio_os_strings[nr];
+
+       return NULL;
+}
+
+const char *fio_get_arch_string(int nr)
+{
+       if (nr < arch_nr)
+               return fio_arch_strings[nr];
+
+       return NULL;
+}
+
 void td_set_runstate(struct thread_data *td, int runstate)
 {
        if (td->runstate == runstate)
@@ -121,10 +172,14 @@ void fio_terminate_threads(int group_id)
 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;
+               if (is_backend)
+                       fio_server_got_signal(sig);
+               else {
+                       log_info("\nfio: terminating on signal %d\n", sig);
+                       fflush(stdout);
+                       exit_value = 128;
+               }
+
                fio_terminate_threads(TERMINATE_ALL);
        }
 }
@@ -139,9 +194,7 @@ static void *disk_thread_main(void *data)
                        break;
                update_io_ticks();
 
-               if (is_backend)
-                       fio_server_send_status();
-               else
+               if (!is_backend)
                        print_thread_status();
        }
 
@@ -217,7 +270,7 @@ static int __check_min_rate(struct thread_data *td, struct timeval *now,
        if (mtime_since(&td->start, now) < 2000)
                return 0;
 
-       iops += td->io_blocks[ddir];
+       iops += td->this_io_blocks[ddir];
        bytes += td->this_io_bytes[ddir];
        ratemin += td->o.ratemin[ddir];
        rate_iops += td->o.rate_iops[ddir];
@@ -986,6 +1039,8 @@ static void reset_io_counters(struct thread_data *td)
 {
        td->stat_io_bytes[0] = td->stat_io_bytes[1] = 0;
        td->this_io_bytes[0] = td->this_io_bytes[1] = 0;
+       td->stat_io_blocks[0] = td->stat_io_blocks[1] = 0;
+       td->this_io_blocks[0] = td->this_io_blocks[1] = 0;
        td->zone_bytes = 0;
        td->rate_bytes[0] = td->rate_bytes[1] = 0;
        td->rate_blocks[0] = td->rate_blocks[1] = 0;
@@ -1184,12 +1239,12 @@ static void *thread_main(void *data)
        clear_state = 0;
        while (keep_running(td)) {
                fio_gettime(&td->start, NULL);
-               memcpy(&td->stat_sample_time[0], &td->start, sizeof(td->start));
-               memcpy(&td->stat_sample_time[1], &td->start, sizeof(td->start));
+               memcpy(&td->bw_sample_time, &td->start, sizeof(td->start));
+               memcpy(&td->iops_sample_time, &td->start, sizeof(td->start));
                memcpy(&td->tv_cache, &td->start, sizeof(td->start));
 
                if (td->o.ratemin[0] || td->o.ratemin[1])
-                       memcpy(&td->lastrate, &td->stat_sample_time,
+                       memcpy(&td->lastrate, &td->bw_sample_time,
                                                        sizeof(td->lastrate));
 
                if (clear_state)
@@ -1266,6 +1321,14 @@ static void *thread_main(void *data)
                } else
                        finish_log(td, td->clat_log, "clat");
        }
+       if (td->iops_log) {
+               if (td->o.iops_log_file) {
+                       finish_log_named(td, td->iops_log,
+                                               td->o.iops_log_file, "iops");
+               } else
+                       finish_log(td, td->iops_log, "iops");
+       }
+
        fio_mutex_up(writeout_mutex);
        if (td->o.exec_postrun)
                exec_string(td->o.exec_postrun);
@@ -1687,8 +1750,12 @@ static void run_threads(void)
 
                reap_threads(&nr_running, &t_rate, &m_rate);
 
-               if (todo)
-                       usleep(100000);
+               if (todo) {
+                       if (is_backend)
+                               fio_server_idle_loop();
+                       else
+                               usleep(100000);
+               }
        }
 
        while (nr_running) {
@@ -1761,10 +1828,46 @@ void reset_fio_state(void)
        done_secs = 0;
 }
 
+static int endian_check(void)
+{
+       union {
+               uint8_t c[8];
+               uint64_t v;
+       } u;
+       int le = 0, be = 0;
+
+       u.v = 0x12;
+       if (u.c[7] == 0x12)
+               be = 1;
+       else if (u.c[0] == 0x12)
+               le = 1;
+
+#if defined(FIO_LITTLE_ENDIAN)
+       if (be)
+               return 1;
+#elif defined(FIO_BIG_ENDIAN)
+       if (le)
+               return 1;
+#else
+       return 1;
+#endif
+
+       if (!le && !be)
+               return 1;
+
+       return 0;
+}
+
 int main(int argc, char *argv[], char *envp[])
 {
        long ps;
 
+       if (endian_check()) {
+               log_err("fio: endianness settings appear wrong.\n");
+               log_err("fio: please report this to fio@vger.kernel.org\n");
+               return 1;
+       }
+
        arch_init(envp);
 
        sinit();