#include <inttypes.h>
#include <assert.h>
-struct thread_data;
-
#include "compiler/compiler.h"
#include "thread_options.h"
#include "flist.h"
#include "lib/getopt.h"
#include "lib/rand.h"
#include "lib/rbtree.h"
+#include "client.h"
#include "server.h"
#include "stat.h"
#include "flow.h"
void *eo;
char verror[FIO_VERROR_SIZE];
pthread_t thread;
- int thread_number;
- int groupid;
+ unsigned int thread_number;
+ unsigned int groupid;
struct thread_stat ts;
+ int client_type;
+
struct io_log *slat_log;
struct io_log *clat_log;
struct io_log *lat_log;
size_t orig_buffer_size;
volatile int terminate;
volatile int runstate;
- unsigned int ioprio;
- unsigned int ioprio_set;
unsigned int last_was_sync;
enum fio_ddir last_ddir;
- char *mmapfile;
int mmapfd;
void *iolog_buf;
*/
struct prof_io_ops prof_io_ops;
void *prof_data;
+
+ void *pinned_mem;
};
/*
#define __td_verror(td, err, msg, func) \
do { \
+ int e = (err); \
if ((td)->error) \
break; \
- int e = (err); \
(td)->error = e; \
if (!(td)->first_error) \
snprintf(td->verror, sizeof(td->verror), "file:%s:%d, func=%s, error=%s", __FILE__, __LINE__, (func), (msg)); \
extern int exitall_on_terminate;
extern unsigned int thread_number;
extern unsigned int stat_number;
-extern unsigned int nr_process, nr_thread;
extern int shm_id;
extern int groupid;
extern int output_format;
extern int temp_stall_ts;
-extern unsigned long long mlock_size;
extern uintptr_t page_mask, page_size;
extern int read_only;
extern int eta_print;
extern int is_backend;
extern int nr_clients;
extern int log_syslog;
+extern int status_interval;
extern const char fio_version_string[];
extern struct thread_data *threads;
#define REAL_MAX_JOBS 2048
-static inline enum error_type_bit td_error_type(enum fio_ddir ddir, int err)
-{
- if (err == EILSEQ)
- return ERROR_TYPE_VERIFY_BIT;
- if (ddir == DDIR_READ)
- return ERROR_TYPE_READ_BIT;
- return ERROR_TYPE_WRITE_BIT;
-}
-
-static int __NON_FATAL_ERR[] = {EIO, EILSEQ};
-static inline int td_non_fatal_error(struct thread_data *td,
- enum error_type_bit etype, int err)
-{
- int i;
- if (!td->o.ignore_error[etype]) {
- td->o.ignore_error[etype] = __NON_FATAL_ERR;
- td->o.ignore_error_nr[etype] = sizeof(__NON_FATAL_ERR)
- / sizeof(int);
- }
-
- if (!(td->o.continue_on_error & (1 << etype)))
- return 0;
- for (i = 0; i < td->o.ignore_error_nr[etype]; i++)
- if (td->o.ignore_error[etype][i] == err)
- return 1;
- return 0;
-}
-
-static inline void update_error_count(struct thread_data *td, int err)
-{
- td->total_err_count++;
- if (td->total_err_count == 1)
- td->first_error = err;
-}
-
static inline int should_fsync(struct thread_data *td)
{
if (td->last_was_sync)
/*
* Init/option functions
*/
+extern int __must_check fio_init_options(void);
extern int __must_check parse_options(int, char **);
-extern int parse_jobs_ini(char *, int, int);
-extern int parse_cmd_line(int, char **);
+extern int parse_jobs_ini(char *, int, int, int);
+extern int parse_cmd_line(int, char **, int);
extern int fio_backend(void);
extern void reset_fio_state(void);
extern void clear_io_state(struct thread_data *);
extern void fio_options_mem_dupe(struct thread_data *);
extern void options_mem_dupe(void *data, struct fio_option *options);
extern void td_fill_rand_seeds(struct thread_data *);
-extern void add_job_opts(const char **);
+extern void add_job_opts(const char **, int);
extern char *num2str(unsigned long, int, int, int, int);
extern int ioengine_load(struct thread_data *);
+extern uintptr_t page_mask;
+extern uintptr_t page_size;
+extern int initialize_fio(char *envp[]);
+
#define FIO_GETOPT_JOB 0x89000000
#define FIO_GETOPT_IOENGINE 0x98000000
#define FIO_NR_OPTIONS (FIO_MAX_OPTS + 128)
*/
extern void print_thread_status(void);
extern void print_status_init(int);
+extern char *fio_uint_to_kmg(unsigned int val);
/*
* Thread life cycle. Once a thread has a runstate beyond TD_INITIALIZED, it
/*
* Memory helpers
*/
-extern int __must_check fio_pin_memory(void);
-extern void fio_unpin_memory(void);
+extern int __must_check fio_pin_memory(struct thread_data *);
+extern void fio_unpin_memory(struct thread_data *);
extern int __must_check allocate_io_mem(struct thread_data *);
extern void free_io_mem(struct thread_data *);
+extern void free_threads_shm(void);
/*
* Reset stats after ramp time completes
extern int load_blktrace(struct thread_data *, const char *);
#endif
-/*
- * Mark unused variables passed to ops functions as unused, to silence gcc
- */
-#define fio_unused __attribute((__unused__))
-#define fio_init __attribute__((constructor))
-#define fio_exit __attribute__((destructor))
-
#define for_each_td(td, i) \
for ((i) = 0, (td) = &threads[0]; (i) < (int) thread_number; (i)++, (td)++)
#define for_each_file(td, f, i) \
extern const char *fio_get_arch_string(int);
extern const char *fio_get_os_string(int);
+#define ARRAY_SIZE(x) (sizeof((x)) / (sizeof((x)[0])))
+
enum {
FIO_OUTPUT_TERSE = 0,
FIO_OUTPUT_JSON,