summaryrefslogtreecommitdiff
path: root/libfio.c
diff options
context:
space:
mode:
Diffstat (limited to 'libfio.c')
-rw-r--r--libfio.c427
1 files changed, 0 insertions, 427 deletions
diff --git a/libfio.c b/libfio.c
deleted file mode 100644
index 83107084..00000000
--- a/libfio.c
+++ /dev/null
@@ -1,427 +0,0 @@
-/*
- * fio - the flexible io tester
- *
- * Copyright (C) 2005 Jens Axboe <axboe@suse.de>
- * Copyright (C) 2006-2012 Jens Axboe <axboe@kernel.dk>
- *
- * The license below covers all files distributed with fio unless otherwise
- * noted in the file itself.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <string.h>
-#include <sys/types.h>
-#include <signal.h>
-#include <stdint.h>
-#include <locale.h>
-#include <fcntl.h>
-
-#include "fio.h"
-#include "smalloc.h"
-#include "os/os.h"
-#include "filelock.h"
-#include "helper_thread.h"
-#include "filehash.h"
-
-FLIST_HEAD(disk_list);
-
-unsigned long arch_flags = 0;
-
-uintptr_t page_mask = 0;
-uintptr_t page_size = 0;
-
-/* see os/os.h */
-static const char *fio_os_strings[os_nr] = {
- "Invalid",
- "Linux",
- "AIX",
- "FreeBSD",
- "HP-UX",
- "OSX",
- "NetBSD",
- "OpenBSD",
- "Solaris",
- "Windows",
- "Android",
- "DragonFly",
-};
-
-/* see arch/arch.h */
-static const char *fio_arch_strings[arch_nr] = {
- "Invalid",
- "x86-64",
- "x86",
- "ppc",
- "ia64",
- "s390",
- "alpha",
- "sparc",
- "sparc64",
- "arm",
- "sh",
- "hppa",
- "mips",
- "aarch64",
- "generic"
-};
-
-static void reset_io_counters(struct thread_data *td, int all)
-{
- int ddir;
-
- if (all) {
- for (ddir = 0; ddir < DDIR_RWDIR_CNT; ddir++) {
- td->stat_io_bytes[ddir] = 0;
- td->this_io_bytes[ddir] = 0;
- td->stat_io_blocks[ddir] = 0;
- td->this_io_blocks[ddir] = 0;
- td->rate_bytes[ddir] = 0;
- td->rate_blocks[ddir] = 0;
- td->bytes_done[ddir] = 0;
- td->rate_io_issue_bytes[ddir] = 0;
- td->rate_next_io_time[ddir] = 0;
- }
- }
-
- td->zone_bytes = 0;
-
- td->last_was_sync = 0;
- td->rwmix_issues = 0;
-
- /*
- * reset file done count if we are to start over
- */
- if (td->o.time_based || td->o.loops || td->o.do_verify)
- td->nr_done_files = 0;
-}
-
-void clear_io_state(struct thread_data *td, int all)
-{
- struct fio_file *f;
- unsigned int i;
-
- reset_io_counters(td, all);
-
- close_files(td);
- for_each_file(td, f, i) {
- fio_file_clear_done(f);
- f->file_offset = get_start_offset(td, f);
- }
-
- /*
- * Re-Seed random number generator if rand_repeatable is true
- */
- if (td->o.rand_repeatable)
- td_fill_rand_seeds(td);
-}
-
-void reset_all_stats(struct thread_data *td)
-{
- int i;
-
- reset_io_counters(td, 1);
-
- for (i = 0; i < DDIR_RWDIR_CNT; i++) {
- td->io_bytes[i] = 0;
- td->io_blocks[i] = 0;
- td->io_issues[i] = 0;
- td->ts.total_io_u[i] = 0;
- td->ts.runtime[i] = 0;
- td->rwmix_issues = 0;
- }
-
- set_epoch_time(td, td->o.log_unix_epoch);
- memcpy(&td->start, &td->epoch, sizeof(struct timeval));
- memcpy(&td->iops_sample_time, &td->epoch, sizeof(struct timeval));
- memcpy(&td->bw_sample_time, &td->epoch, sizeof(struct timeval));
- memcpy(&td->ss.prev_time, &td->epoch, sizeof(struct timeval));
-
- lat_target_reset(td);
- clear_rusage_stat(td);
- helper_reset();
-}
-
-void reset_fio_state(void)
-{
- groupid = 0;
- thread_number = 0;
- stat_number = 0;
- done_secs = 0;
-}
-
-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;
-}
-
-static const char *td_runstates[] = {
- "NOT_CREATED",
- "CREATED",
- "INITIALIZED",
- "RAMP",
- "SETTING_UP",
- "RUNNING",
- "PRE_READING",
- "VERIFYING",
- "FSYNCING",
- "FINISHING",
- "EXITED",
- "REAPED",
-};
-
-const char *runstate_to_name(int runstate)
-{
- compiletime_assert(TD_LAST == 12, "td runstate list");
- if (runstate >= 0 && runstate < TD_LAST)
- return td_runstates[runstate];
-
- return "invalid";
-}
-
-void td_set_runstate(struct thread_data *td, int runstate)
-{
- if (td->runstate == runstate)
- return;
-
- dprint(FD_PROCESS, "pid=%d: runstate %s -> %s\n", (int) td->pid,
- runstate_to_name(td->runstate),
- runstate_to_name(runstate));
- td->runstate = runstate;
-}
-
-int td_bump_runstate(struct thread_data *td, int new_state)
-{
- int old_state = td->runstate;
-
- td_set_runstate(td, new_state);
- return old_state;
-}
-
-void td_restore_runstate(struct thread_data *td, int old_state)
-{
- td_set_runstate(td, old_state);
-}
-
-void fio_mark_td_terminate(struct thread_data *td)
-{
- fio_gettime(&td->terminate_time, NULL);
- write_barrier();
- td->terminate = 1;
-}
-
-void fio_terminate_threads(unsigned int group_id)
-{
- struct thread_data *td;
- pid_t pid = getpid();
- int i;
-
- dprint(FD_PROCESS, "terminate group_id=%d\n", group_id);
-
- for_each_td(td, i) {
- if (group_id == TERMINATE_ALL || group_id == td->groupid) {
- dprint(FD_PROCESS, "setting terminate on %s/%d\n",
- td->o.name, (int) td->pid);
-
- if (td->terminate)
- continue;
-
- fio_mark_td_terminate(td);
- td->o.start_delay = 0;
-
- /*
- * if the thread is running, just let it exit
- */
- if (!td->pid || pid == td->pid)
- continue;
- else if (td->runstate < TD_RAMP)
- kill(td->pid, SIGTERM);
- else {
- struct ioengine_ops *ops = td->io_ops;
-
- if (ops && ops->terminate)
- ops->terminate(td);
- }
- }
- }
-}
-
-int fio_running_or_pending_io_threads(void)
-{
- struct thread_data *td;
- int i;
- int nr_io_threads = 0;
-
- for_each_td(td, i) {
- if (td->io_ops_init && td_ioengine_flagged(td, FIO_NOIO))
- continue;
- nr_io_threads++;
- if (td->runstate < TD_EXITED)
- return 1;
- }
-
- if (!nr_io_threads)
- return -1; /* we only had cpuio threads to begin with */
- return 0;
-}
-
-int fio_set_fd_nonblocking(int fd, const char *who)
-{
- int flags;
-
- flags = fcntl(fd, F_GETFL);
- if (flags < 0)
- log_err("fio: %s failed to get file flags: %s\n", who, strerror(errno));
- else {
- int new_flags = flags | O_NONBLOCK;
-
- new_flags = fcntl(fd, F_SETFL, new_flags);
- if (new_flags < 0)
- log_err("fio: %s failed to get file flags: %s\n", who, strerror(errno));
- }
-
- return flags;
-}
-
-enum {
- ENDIAN_INVALID_BE = 1,
- ENDIAN_INVALID_LE,
- ENDIAN_INVALID_CONFIG,
- ENDIAN_BROKEN,
-};
-
-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(CONFIG_LITTLE_ENDIAN)
- if (be)
- return ENDIAN_INVALID_BE;
-#elif defined(CONFIG_BIG_ENDIAN)
- if (le)
- return ENDIAN_INVALID_LE;
-#else
- return ENDIAN_INVALID_CONFIG;
-#endif
-
- if (!le && !be)
- return ENDIAN_BROKEN;
-
- return 0;
-}
-
-int initialize_fio(char *envp[])
-{
- long ps;
- int err;
-
- /*
- * We need these to be properly 64-bit aligned, otherwise we
- * can run into problems on archs that fault on unaligned fp
- * access (ARM).
- */
- compiletime_assert((offsetof(struct thread_stat, percentile_list) % 8) == 0, "stat percentile_list");
- compiletime_assert((offsetof(struct thread_stat, total_run_time) % 8) == 0, "total_run_time");
- compiletime_assert((offsetof(struct thread_stat, total_err_count) % 8) == 0, "total_err_count");
- compiletime_assert((offsetof(struct thread_stat, latency_percentile) % 8) == 0, "stat latency_percentile");
- compiletime_assert((offsetof(struct thread_options_pack, zipf_theta) % 8) == 0, "zipf_theta");
- compiletime_assert((offsetof(struct thread_options_pack, pareto_h) % 8) == 0, "pareto_h");
- compiletime_assert((offsetof(struct thread_options_pack, percentile_list) % 8) == 0, "percentile_list");
- compiletime_assert((offsetof(struct thread_options_pack, latency_percentile) % 8) == 0, "latency_percentile");
-
- err = endian_check();
- if (err) {
- log_err("fio: endianness settings appear wrong.\n");
- switch (err) {
- case ENDIAN_INVALID_BE:
- log_err("fio: got big-endian when configured for little\n");
- break;
- case ENDIAN_INVALID_LE:
- log_err("fio: got little-endian when configured for big\n");
- break;
- case ENDIAN_INVALID_CONFIG:
- log_err("fio: not configured to any endianness\n");
- break;
- case ENDIAN_BROKEN:
- log_err("fio: failed to detect endianness\n");
- break;
- default:
- assert(0);
- break;
- }
- log_err("fio: please report this to fio@vger.kernel.org\n");
- return 1;
- }
-
-#if !defined(CONFIG_GETTIMEOFDAY) && !defined(CONFIG_CLOCK_GETTIME)
-#error "No available clock source!"
-#endif
-
- arch_init(envp);
-
- sinit();
-
- if (fio_filelock_init()) {
- log_err("fio: failed initializing filelock subsys\n");
- return 1;
- }
-
- file_hash_init();
-
- /*
- * 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();
- return 0;
-}
-
-void deinitialize_fio(void)
-{
- fio_keywords_exit();
-}