12e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe/*
22e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe * fio - the flexible io tester
32e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *
42e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe * Copyright (C) 2005 Jens Axboe <axboe@suse.de>
52e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe * Copyright (C) 2006-2012 Jens Axboe <axboe@kernel.dk>
62e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *
72e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe * The license below covers all files distributed with fio unless otherwise
82e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe * noted in the file itself.
92e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *
102e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *  This program is free software; you can redistribute it and/or modify
112e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *  it under the terms of the GNU General Public License version 2 as
122e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *  published by the Free Software Foundation.
132e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *
142e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *  This program is distributed in the hope that it will be useful,
152e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *  but WITHOUT ANY WARRANTY; without even the implied warranty of
162e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
172e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *  GNU General Public License for more details.
182e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *
192e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *  You should have received a copy of the GNU General Public License
202e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *  along with this program; if not, write to the Free Software
212e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
222e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *
232e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe */
242e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
252e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe#include <string.h>
2659dfce577869f0a6668d682ad06874b3398a4b93Jens Axboe#include <sys/types.h>
2759dfce577869f0a6668d682ad06874b3398a4b93Jens Axboe#include <signal.h>
28a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe#include <stdint.h>
29a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe#include <locale.h>
304a851614cfdbebddeb78de04ac89a39d26f25459Jens Axboe#include <fcntl.h>
31a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe
322e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe#include "fio.h"
33a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe#include "smalloc.h"
34a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe#include "os/os.h"
35243bfe190245a10e9d0981bf2a7c722edc4c43d4Jens Axboe#include "filelock.h"
362e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
37a3efc919b0dcc27d65a6e84edca209b91cee173dJens Axboe/*
38a3efc919b0dcc27d65a6e84edca209b91cee173dJens Axboe * Just expose an empty list, if the OS does not support disk util stats
39a3efc919b0dcc27d65a6e84edca209b91cee173dJens Axboe */
40a3efc919b0dcc27d65a6e84edca209b91cee173dJens Axboe#ifndef FIO_HAVE_DISK_UTIL
41a3efc919b0dcc27d65a6e84edca209b91cee173dJens AxboeFLIST_HEAD(disk_list);
42a3efc919b0dcc27d65a6e84edca209b91cee173dJens Axboe#endif
43a3efc919b0dcc27d65a6e84edca209b91cee173dJens Axboe
44a3efc919b0dcc27d65a6e84edca209b91cee173dJens Axboeunsigned long arch_flags = 0;
45a3efc919b0dcc27d65a6e84edca209b91cee173dJens Axboe
46a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboeuintptr_t page_mask = 0;
47a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboeuintptr_t page_size = 0;
48a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe
492e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboestatic const char *fio_os_strings[os_nr] = {
502e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"Invalid",
512e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"Linux",
522e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"AIX",
532e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"FreeBSD",
542e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"HP-UX",
552e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"OSX",
562e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"NetBSD",
571c7eaa7b2e8d06e56fc1db3f9e0a48293e96b27fJens Axboe	"OpenBSD",
582e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"Solaris",
591c7eaa7b2e8d06e56fc1db3f9e0a48293e96b27fJens Axboe	"Windows",
601c7eaa7b2e8d06e56fc1db3f9e0a48293e96b27fJens Axboe	"Android",
612e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe};
622e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
632e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboestatic const char *fio_arch_strings[arch_nr] = {
642e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"Invalid",
652e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"x86-64",
662e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"x86",
672e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"ppc",
682e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"ia64",
692e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"s390",
702e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"alpha",
712e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"sparc",
722e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"sparc64",
732e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"arm",
742e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"sh",
752e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"hppa",
762e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"generic"
772e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe};
782e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
792e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboestatic void reset_io_counters(struct thread_data *td)
802e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe{
816eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	int ddir;
82bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe
836eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	for (ddir = 0; ddir < DDIR_RWDIR_CNT; ddir++) {
846eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		td->stat_io_bytes[ddir] = 0;
856eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		td->this_io_bytes[ddir] = 0;
866eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		td->stat_io_blocks[ddir] = 0;
876eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		td->this_io_blocks[ddir] = 0;
886eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		td->rate_bytes[ddir] = 0;
896eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		td->rate_blocks[ddir] = 0;
906eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	}
912e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	td->zone_bytes = 0;
922e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
932e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	td->last_was_sync = 0;
94bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe	td->rwmix_issues = 0;
952e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
962e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	/*
972e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	 * reset file done count if we are to start over
982e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	 */
9944cbc6daaae3674ea5d0a113b66596ca24f372e0Jens Axboe	if (td->o.time_based || td->o.loops || td->o.do_verify)
1002e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe		td->nr_done_files = 0;
1012e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe}
1022e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1032e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboevoid clear_io_state(struct thread_data *td)
1042e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe{
1052e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	struct fio_file *f;
1062e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	unsigned int i;
1072e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1082e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	reset_io_counters(td);
1092e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1102e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	close_files(td);
1112e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	for_each_file(td, f, i)
1122e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe		fio_file_clear_done(f);
1132e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1142e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	/*
1152e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	 * Set the same seed to get repeatable runs
1162e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	 */
1172e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	td_fill_rand_seeds(td);
1182e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe}
1192e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1202e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboevoid reset_all_stats(struct thread_data *td)
1212e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe{
1222e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	struct timeval tv;
1232e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	int i;
1242e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1252e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	reset_io_counters(td);
1262e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1276eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	for (i = 0; i < DDIR_RWDIR_CNT; i++) {
1282e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe		td->io_bytes[i] = 0;
1292e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe		td->io_blocks[i] = 0;
1302e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe		td->io_issues[i] = 0;
1312e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe		td->ts.total_io_u[i] = 0;
1326eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		td->ts.runtime[i] = 0;
1335b3faae6f26beb2572ebeae7caf8cd7d693bb818SEOKYOUNG KO		td->rwmix_issues = 0;
1342e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	}
1352e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1362e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	fio_gettime(&tv, NULL);
1372e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	memcpy(&td->epoch, &tv, sizeof(tv));
1382e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	memcpy(&td->start, &tv, sizeof(tv));
1393e260a46ea9a8de224c3d0a29a608da3440f284aJens Axboe
1406bb58215842760895071d9f331da4dc2dfc16f30Jens Axboe	lat_target_reset(td);
1412e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe}
1422e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1432e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboevoid reset_fio_state(void)
1442e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe{
1452e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	groupid = 0;
1462e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	thread_number = 0;
1472caefeecf95c2e01ccffc3e286d17a84b12f4dc1Jens Axboe	stat_number = 0;
1482e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	done_secs = 0;
1492e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe}
1502e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1512e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboeconst char *fio_get_os_string(int nr)
1522e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe{
1532e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	if (nr < os_nr)
1542e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe		return fio_os_strings[nr];
1552e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1562e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	return NULL;
1572e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe}
1582e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1592e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboeconst char *fio_get_arch_string(int nr)
1602e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe{
1612e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	if (nr < arch_nr)
1622e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe		return fio_arch_strings[nr];
1632e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1642e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	return NULL;
1652e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe}
1662e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1672e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboevoid td_set_runstate(struct thread_data *td, int runstate)
1682e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe{
1692e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	if (td->runstate == runstate)
1702e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe		return;
1712e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1722e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	dprint(FD_PROCESS, "pid=%d: runstate %d -> %d\n", (int) td->pid,
1732e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe						td->runstate, runstate);
1742e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	td->runstate = runstate;
1752e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe}
1762e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1778edd973d57a311d4c590d7385796bbdf111ed04cJens Axboeint td_bump_runstate(struct thread_data *td, int new_state)
1788edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe{
1798edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	int old_state = td->runstate;
1808edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe
1818edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	td_set_runstate(td, new_state);
1828edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	return old_state;
1838edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe}
1848edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe
1858edd973d57a311d4c590d7385796bbdf111ed04cJens Axboevoid td_restore_runstate(struct thread_data *td, int old_state)
1868edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe{
1878edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	td_set_runstate(td, old_state);
1888edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe}
1898edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe
1902e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboevoid fio_terminate_threads(int group_id)
1912e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe{
1922e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	struct thread_data *td;
19341fa20ec4b70d727128b0aa72640e53817d12cdaJens Axboe	pid_t pid = getpid();
1942e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	int i;
1952e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1962e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	dprint(FD_PROCESS, "terminate group_id=%d\n", group_id);
1972e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1982e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	for_each_td(td, i) {
1992e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe		if (group_id == TERMINATE_ALL || groupid == td->groupid) {
2002e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe			dprint(FD_PROCESS, "setting terminate on %s/%d\n",
2012e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe						td->o.name, (int) td->pid);
2022e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe			td->terminate = 1;
2032e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe			td->o.start_delay = 0;
2042e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
2052e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe			/*
2062e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe			 * if the thread is running, just let it exit
2072e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe			 */
20836d80bc7c7f7fbc2612941b7dd7ceaf645798c7fJens Axboe			if (!td->pid || pid == td->pid)
2092e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe				continue;
2102e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe			else if (td->runstate < TD_RAMP)
2112e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe				kill(td->pid, SIGTERM);
21236d80bc7c7f7fbc2612941b7dd7ceaf645798c7fJens Axboe			else {
2132e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe				struct ioengine_ops *ops = td->io_ops;
2142e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
21536d80bc7c7f7fbc2612941b7dd7ceaf645798c7fJens Axboe				if (ops && ops->terminate)
21636d80bc7c7f7fbc2612941b7dd7ceaf645798c7fJens Axboe					ops->terminate(td);
2172e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe			}
2182e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe		}
2192e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	}
2202e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe}
2212e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
222046395d7ab181288d14737c1d0041e98328f473fJens Axboeint fio_running_or_pending_io_threads(void)
223046395d7ab181288d14737c1d0041e98328f473fJens Axboe{
224046395d7ab181288d14737c1d0041e98328f473fJens Axboe	struct thread_data *td;
225046395d7ab181288d14737c1d0041e98328f473fJens Axboe	int i;
226046395d7ab181288d14737c1d0041e98328f473fJens Axboe
227046395d7ab181288d14737c1d0041e98328f473fJens Axboe	for_each_td(td, i) {
228046395d7ab181288d14737c1d0041e98328f473fJens Axboe		if (td->flags & TD_F_NOIO)
229046395d7ab181288d14737c1d0041e98328f473fJens Axboe			continue;
230046395d7ab181288d14737c1d0041e98328f473fJens Axboe		if (td->runstate < TD_EXITED)
231046395d7ab181288d14737c1d0041e98328f473fJens Axboe			return 1;
232046395d7ab181288d14737c1d0041e98328f473fJens Axboe	}
233046395d7ab181288d14737c1d0041e98328f473fJens Axboe
234046395d7ab181288d14737c1d0041e98328f473fJens Axboe	return 0;
235046395d7ab181288d14737c1d0041e98328f473fJens Axboe}
236046395d7ab181288d14737c1d0041e98328f473fJens Axboe
2373a35845f7756a8a86b420650bff41267192dce22Jens Axboeint fio_set_fd_nonblocking(int fd, const char *who)
2384a851614cfdbebddeb78de04ac89a39d26f25459Jens Axboe{
2394a851614cfdbebddeb78de04ac89a39d26f25459Jens Axboe	int flags;
2404a851614cfdbebddeb78de04ac89a39d26f25459Jens Axboe
2414a851614cfdbebddeb78de04ac89a39d26f25459Jens Axboe	flags = fcntl(fd, F_GETFL);
2424a851614cfdbebddeb78de04ac89a39d26f25459Jens Axboe	if (flags < 0)
2434a851614cfdbebddeb78de04ac89a39d26f25459Jens Axboe		log_err("fio: %s failed to get file flags: %s\n", who, strerror(errno));
2444a851614cfdbebddeb78de04ac89a39d26f25459Jens Axboe	else {
2453a35845f7756a8a86b420650bff41267192dce22Jens Axboe		int new_flags = flags | O_NONBLOCK;
2463a35845f7756a8a86b420650bff41267192dce22Jens Axboe
2473a35845f7756a8a86b420650bff41267192dce22Jens Axboe		new_flags = fcntl(fd, F_SETFL, new_flags);
2483a35845f7756a8a86b420650bff41267192dce22Jens Axboe		if (new_flags < 0)
2494a851614cfdbebddeb78de04ac89a39d26f25459Jens Axboe			log_err("fio: %s failed to get file flags: %s\n", who, strerror(errno));
2504a851614cfdbebddeb78de04ac89a39d26f25459Jens Axboe	}
2513a35845f7756a8a86b420650bff41267192dce22Jens Axboe
2523a35845f7756a8a86b420650bff41267192dce22Jens Axboe	return flags;
2534a851614cfdbebddeb78de04ac89a39d26f25459Jens Axboe}
2544a851614cfdbebddeb78de04ac89a39d26f25459Jens Axboe
255a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboestatic int endian_check(void)
256a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe{
257a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	union {
258a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe		uint8_t c[8];
259a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe		uint64_t v;
260a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	} u;
261a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	int le = 0, be = 0;
262a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe
263a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	u.v = 0x12;
264a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	if (u.c[7] == 0x12)
265a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe		be = 1;
266a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	else if (u.c[0] == 0x12)
267a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe		le = 1;
268a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe
269a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe#if defined(CONFIG_LITTLE_ENDIAN)
270a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	if (be)
271a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe		return 1;
272a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe#elif defined(CONFIG_BIG_ENDIAN)
273a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	if (le)
274a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe		return 1;
275a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe#else
276a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	return 1;
277a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe#endif
278a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe
279a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	if (!le && !be)
280a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe		return 1;
281a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe
282a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	return 0;
283a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe}
284a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe
285a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboeint initialize_fio(char *envp[])
286a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe{
287a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	long ps;
288a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe
289a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	if (endian_check()) {
290a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe		log_err("fio: endianness settings appear wrong.\n");
291a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe		log_err("fio: please report this to fio@vger.kernel.org\n");
292a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe		return 1;
293a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	}
294a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe
295a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe#if !defined(CONFIG_GETTIMEOFDAY) && !defined(CONFIG_CLOCK_GETTIME)
296a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe#error "No available clock source!"
297a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe#endif
298a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe
299a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	arch_init(envp);
300a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe
301a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	sinit();
302a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe
303243bfe190245a10e9d0981bf2a7c722edc4c43d4Jens Axboe	if (fio_filelock_init()) {
304243bfe190245a10e9d0981bf2a7c722edc4c43d4Jens Axboe		log_err("fio: failed initializing filelock subsys\n");
305243bfe190245a10e9d0981bf2a7c722edc4c43d4Jens Axboe		return 1;
306243bfe190245a10e9d0981bf2a7c722edc4c43d4Jens Axboe	}
307243bfe190245a10e9d0981bf2a7c722edc4c43d4Jens Axboe
308a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	/*
309a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	 * We need locale for number printing, if it isn't set then just
310a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	 * go with the US format.
311a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	 */
312a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	if (!getenv("LC_NUMERIC"))
313a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe		setlocale(LC_NUMERIC, "en_US");
314a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe
315a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	ps = sysconf(_SC_PAGESIZE);
316a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	if (ps < 0) {
317a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe		log_err("Failed to get page size\n");
318a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe		return 1;
319a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	}
320a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe
321a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	page_size = ps;
322a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	page_mask = ps - 1;
3232e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
324a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	fio_keywords_init();
325a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe	return 0;
326a569b45f68ebaa93fbbaca424dc827f4bbc5d655Jens Axboe}
327