+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_data, ts) % sizeof(void *)) == 0, "ts");
+ 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_data, ts.clat_stat) % 8) == 0, "ts.clat_stat");
+ 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");
+ compiletime_assert((offsetof(struct jobs_eta, m_rate) % 8) == 0, "m_rate");
+
+ compiletime_assert(__TD_F_LAST <= TD_ENG_FLAG_SHIFT, "TD_ENG_FLAG_SHIFT");
+ compiletime_assert(BSSPLIT_MAX <= ZONESPLIT_MAX, "bsssplit/zone max");