#include "profile.h"
#include "lib/rand.h"
#include "memalign.h"
+#include "server.h"
unsigned long page_mask;
unsigned long page_size;
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)
/*
* 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;
{
if (threads) {
log_info("\nfio: terminating on signal %d\n", sig);
+ exit_backend = 1;
fflush(stdout);
exit_value = 128;
terminate_threads(TERMINATE_ALL);
if (!threads)
break;
update_io_ticks();
- print_thread_status();
+
+ if (!is_backend)
+ print_thread_status();
}
return NULL;
/*
* 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 {
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) ||
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.
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);
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,
td_io_close_file(td, f);
}
}
-
- init_disk_util(td);
}
set_genesis_time();
break;
}
+ init_disk_util(td);
+
/*
* Set state to created. Thread will transition
* to TD_INITIALIZED when it's done setting up.
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 (exec_profile && load_profile(exec_profile))
return 1;
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();
+}