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