projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Turn old debug printf() into a proper log_err()
[fio.git]
/
fio.c
diff --git
a/fio.c
b/fio.c
index 10746062927f32b0c6956c0770ec88ba416f8747..c18df12d70a874624e5a8b68a78f68bca7a5ea81 100644
(file)
--- a/
fio.c
+++ b/
fio.c
@@
-55,13
+55,20
@@
unsigned long page_size;
(char *) (((unsigned long) (buf) + page_mask) & ~page_mask)
int groupid = 0;
(char *) (((unsigned long) (buf) + page_mask) & ~page_mask)
int groupid = 0;
-int thread_number = 0;
-int nr_process = 0;
-int nr_thread = 0;
+
unsigned
int thread_number = 0;
+
unsigned
int nr_process = 0;
+
unsigned
int nr_thread = 0;
int shm_id = 0;
int temp_stall_ts;
unsigned long done_secs = 0;
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;
static struct fio_mutex *startup_mutex;
static struct fio_mutex *writeout_mutex;
static volatile int fio_abort;
@@
-75,9
+82,52
@@
unsigned long arch_flags = 0;
struct io_log *agg_io_log[2];
struct io_log *agg_io_log[2];
-#define TERMINATE_ALL (-1)
#define JOB_START_TIMEOUT (5 * 1000)
#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)
void td_set_runstate(struct thread_data *td, int runstate)
{
if (td->runstate == runstate)
@@
-88,7
+138,7
@@
void td_set_runstate(struct thread_data *td, int runstate)
td->runstate = runstate;
}
td->runstate = runstate;
}
-
static void
terminate_threads(int group_id)
+
void fio_
terminate_threads(int group_id)
{
struct thread_data *td;
int i;
{
struct thread_data *td;
int i;
@@
-122,11
+172,15
@@
static void terminate_threads(int group_id)
static void sig_int(int sig)
{
if (threads) {
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);
+ 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);
}
}
}
}
@@
-140,9
+194,7
@@
static void *disk_thread_main(void *data)
break;
update_io_ticks();
break;
update_io_ticks();
- if (is_backend)
- fio_server_send_status();
- else
+ if (!is_backend)
print_thread_status();
}
print_thread_status();
}
@@
-184,6
+236,13
@@
static void set_sig_handlers(void)
act.sa_handler = sig_int;
act.sa_flags = SA_RESTART;
sigaction(SIGTERM, &act, NULL);
act.sa_handler = sig_int;
act.sa_flags = SA_RESTART;
sigaction(SIGTERM, &act, NULL);
+
+ if (is_backend) {
+ memset(&act, 0, sizeof(act));
+ act.sa_handler = sig_int;
+ act.sa_flags = SA_RESTART;
+ sigaction(SIGPIPE, &act, NULL);
+ }
}
/*
}
/*
@@
-211,7
+270,7
@@
static int __check_min_rate(struct thread_data *td, struct timeval *now,
if (mtime_since(&td->start, now) < 2000)
return 0;
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];
bytes += td->this_io_bytes[ddir];
ratemin += td->o.ratemin[ddir];
rate_iops += td->o.rate_iops[ddir];
@@
-750,7
+809,7
@@
sync_done:
if (!in_ramp_time(td) && should_check_rate(td, bytes_done)) {
if (check_min_rate(td, &comp_time, bytes_done)) {
if (exitall_on_terminate)
if (!in_ramp_time(td) && should_check_rate(td, bytes_done)) {
if (check_min_rate(td, &comp_time, bytes_done)) {
if (exitall_on_terminate)
- terminate_threads(td->groupid);
+
fio_
terminate_threads(td->groupid);
td_verror(td, EIO, "check_min_rate");
break;
}
td_verror(td, EIO, "check_min_rate");
break;
}
@@
-774,7
+833,7
@@
sync_done:
}
if (td->trim_entries)
}
if (td->trim_entries)
-
printf("trim entries %ld
\n", td->trim_entries);
+
log_err("fio: %d trim entries leaked?
\n", td->trim_entries);
if (td->o.fill_device && td->error == ENOSPC) {
td->error = 0;
if (td->o.fill_device && td->error == ENOSPC) {
td->error = 0;
@@
-980,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_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;
td->zone_bytes = 0;
td->rate_bytes[0] = td->rate_bytes[1] = 0;
td->rate_blocks[0] = td->rate_blocks[1] = 0;
@@
-1178,12
+1239,12
@@
static void *thread_main(void *data)
clear_state = 0;
while (keep_running(td)) {
fio_gettime(&td->start, NULL);
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->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)
sizeof(td->lastrate));
if (clear_state)
@@
-1260,12
+1321,20
@@
static void *thread_main(void *data)
} else
finish_log(td, td->clat_log, "clat");
}
} 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);
if (exitall_on_terminate)
fio_mutex_up(writeout_mutex);
if (td->o.exec_postrun)
exec_string(td->o.exec_postrun);
if (exitall_on_terminate)
- terminate_threads(td->groupid);
+
fio_
terminate_threads(td->groupid);
err:
if (td->error)
err:
if (td->error)
@@
-1292,7
+1361,6
@@
err:
if (td->o.write_iolog_file)
write_iolog_close(td);
if (td->o.write_iolog_file)
write_iolog_close(td);
- options_mem_free(td);
td_set_runstate(td, TD_EXITED);
return (void *) (unsigned long) td->error;
}
td_set_runstate(td, TD_EXITED);
return (void *) (unsigned long) td->error;
}
@@
-1330,10
+1398,12
@@
static int fork_main(int shmid, int offset)
/*
* Run over the job map and reap the threads that have exited, if any.
*/
/*
* Run over the job map and reap the threads that have exited, if any.
*/
-static void reap_threads(int *nr_running, int *t_rate, int *m_rate)
+static void reap_threads(unsigned int *nr_running, unsigned int *t_rate,
+ unsigned int *m_rate)
{
struct thread_data *td;
{
struct thread_data *td;
- int i, cputhreads, realthreads, pending, status, ret;
+ unsigned int cputhreads, realthreads, pending;
+ int i, status, ret;
/*
* reap exited threads (TD_EXITED -> TD_REAPED)
/*
* reap exited threads (TD_EXITED -> TD_REAPED)
@@
-1419,7
+1489,7
@@
reaped:
}
if (*nr_running == cputhreads && !pending && realthreads)
}
if (*nr_running == cputhreads && !pending && realthreads)
- terminate_threads(TERMINATE_ALL);
+
fio_
terminate_threads(TERMINATE_ALL);
}
static void *gtod_thread_main(void *data)
}
static void *gtod_thread_main(void *data)
@@
-1473,7
+1543,7
@@
static void run_threads(void)
{
struct thread_data *td;
unsigned long spent;
{
struct thread_data *td;
unsigned long spent;
- int i, todo, nr_running, m_rate, t_rate, nr_started;
+
unsigned
int i, todo, nr_running, m_rate, t_rate, nr_started;
if (fio_pin_memory())
return;
if (fio_pin_memory())
return;
@@
-1481,6
+1551,8
@@
static void run_threads(void)
if (fio_gtod_offload && fio_start_gtod_thread())
return;
if (fio_gtod_offload && fio_start_gtod_thread())
return;
+ set_sig_handlers();
+
if (!terse_output) {
log_info("Starting ");
if (nr_thread)
if (!terse_output) {
log_info("Starting ");
if (nr_thread)
@@
-1488,7
+1560,7
@@
static void run_threads(void)
nr_thread > 1 ? "s" : "");
if (nr_process) {
if (nr_thread)
nr_thread > 1 ? "s" : "");
if (nr_process) {
if (nr_thread)
-
printf
(" and ");
+
log_info
(" and ");
log_info("%d process%s", nr_process,
nr_process > 1 ? "es" : "");
}
log_info("%d process%s", nr_process,
nr_process > 1 ? "es" : "");
}
@@
-1496,8
+1568,6
@@
static void run_threads(void)
fflush(stdout);
}
fflush(stdout);
}
- set_sig_handlers();
-
todo = thread_number;
nr_running = 0;
nr_started = 0;
todo = thread_number;
nr_running = 0;
nr_started = 0;
@@
-1613,7
+1683,7
@@
static void run_threads(void)
dprint(FD_MUTEX, "wait on startup_mutex\n");
if (fio_mutex_down_timeout(startup_mutex, 10)) {
log_err("fio: job startup hung? exiting.\n");
dprint(FD_MUTEX, "wait on startup_mutex\n");
if (fio_mutex_down_timeout(startup_mutex, 10)) {
log_err("fio: job startup hung? exiting.\n");
- terminate_threads(TERMINATE_ALL);
+
fio_
terminate_threads(TERMINATE_ALL);
fio_abort = 1;
nr_started--;
break;
fio_abort = 1;
nr_started--;
break;
@@
-1681,13
+1751,21
@@
static void run_threads(void)
reap_threads(&nr_running, &t_rate, &m_rate);
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) {
reap_threads(&nr_running, &t_rate, &m_rate);
}
while (nr_running) {
reap_threads(&nr_running, &t_rate, &m_rate);
- usleep(10000);
+
+ if (is_backend)
+ fio_server_idle_loop();
+ else
+ usleep(10000);
}
update_io_ticks();
}
update_io_ticks();
@@
-1696,11
+1774,17
@@
static void run_threads(void)
int exec_run(void)
{
int exec_run(void)
{
+ struct thread_data *td;
+ int i;
+
if (nr_clients)
return fio_handle_clients();
if (nr_clients)
return fio_handle_clients();
- if (exec_profile && load_profile(exec_profile))
- return 1;
-
+ if (exec_profile) {
+ if (load_profile(exec_profile))
+ return 1;
+ free(exec_profile);
+ exec_profile = NULL;
+ }
if (!thread_number)
return 0;
if (!thread_number)
return 0;
@@
-1733,6
+1817,9
@@
int exec_run(void)
}
}
}
}
+ for_each_td(td, i)
+ fio_options_free(td);
+
cgroup_kill(cgroup_list);
sfree(cgroup_list);
sfree(cgroup_mnt);
cgroup_kill(cgroup_list);
sfree(cgroup_list);
sfree(cgroup_mnt);
@@
-1751,10
+1838,46
@@
void reset_fio_state(void)
done_secs = 0;
}
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;
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();
arch_init(envp);
sinit();