gfio: make 'light yellow' color a little lighter
[fio.git] / fio.h
diff --git a/fio.h b/fio.h
index cafc93ae54115db57df57f929f1ec094287bf222..7f11861d074bb6855d6690fc4c0a8b1f765ea7e9 100644 (file)
--- a/fio.h
+++ b/fio.h
@@ -20,7 +20,7 @@ struct thread_data;
 #include "thread_options.h"
 #include "flist.h"
 #include "fifo.h"
-#include "rbtree.h"
+#include "lib/rbtree.h"
 #include "arch/arch.h"
 #include "os/os.h"
 #include "mutex.h"
@@ -66,20 +66,22 @@ struct thread_data {
        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;
        struct io_log *bw_log;
        struct io_log *iops_log;
 
-       uint64_t stat_io_bytes[2];
+       uint64_t stat_io_bytes[DDIR_RWDIR_CNT];
        struct timeval bw_sample_time;
 
-       uint64_t stat_io_blocks[2];
+       uint64_t stat_io_blocks[DDIR_RWDIR_CNT];
        struct timeval iops_sample_time;
 
        struct rusage ru_start;
@@ -97,18 +99,16 @@ struct thread_data {
                struct frand_state __next_file_state;
        };
        int error;
+       int sig;
        int done;
        pid_t pid;
        char *orig_buffer;
        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;
@@ -180,21 +180,21 @@ struct thread_data {
        /*
         * Rate state
         */
-       unsigned long long rate_bps[2];
-       long rate_pending_usleep[2];
-       unsigned long rate_bytes[2];
-       unsigned long rate_blocks[2];
-       struct timeval lastrate[2];
+       unsigned long long rate_bps[DDIR_RWDIR_CNT];
+       long rate_pending_usleep[DDIR_RWDIR_CNT];
+       unsigned long rate_bytes[DDIR_RWDIR_CNT];
+       unsigned long rate_blocks[DDIR_RWDIR_CNT];
+       struct timeval lastrate[DDIR_RWDIR_CNT];
 
        unsigned long long total_io_size;
        unsigned long long fill_device_size;
 
-       unsigned long io_issues[2];
-       unsigned long long io_blocks[2];
-       unsigned long long this_io_blocks[2];
-       unsigned long long io_bytes[2];
+       unsigned long io_issues[DDIR_RWDIR_CNT];
+       unsigned long long io_blocks[DDIR_RWDIR_CNT];
+       unsigned long long this_io_blocks[DDIR_RWDIR_CNT];
+       unsigned long long io_bytes[DDIR_RWDIR_CNT];
        unsigned long long io_skip_bytes;
-       unsigned long long this_io_bytes[2];
+       unsigned long long this_io_bytes[DDIR_RWDIR_CNT];
        unsigned long long zone_bytes;
        struct fio_mutex *mutex;
 
@@ -274,6 +274,8 @@ struct thread_data {
         */
        struct prof_io_ops prof_io_ops;
        void *prof_data;
+
+       void *pinned_mem;
 };
 
 /*
@@ -308,13 +310,11 @@ enum {
 
 extern int exitall_on_terminate;
 extern unsigned int thread_number;
-extern unsigned int nr_process, nr_thread;
 extern int shm_id;
 extern int groupid;
-extern int terse_output;
+extern int output_format;
 extern int temp_stall_ts;
-extern unsigned long long mlock_size;
-extern unsigned long page_mask, page_size;
+extern uintptr_t page_mask, page_size;
 extern int read_only;
 extern int eta_print;
 extern unsigned long done_secs;
@@ -344,15 +344,32 @@ static inline void fio_ro_check(struct thread_data *td, struct io_u *io_u)
 
 #define REAL_MAX_JOBS          2048
 
-#define td_non_fatal_error(e)  ((e) == EIO || (e) == EILSEQ)
-
 static inline enum error_type td_error_type(enum fio_ddir ddir, int err)
 {
        if (err == EILSEQ)
-               return ERROR_TYPE_VERIFY;
+               return ERROR_TYPE_VERIFY_BIT;
        if (ddir == DDIR_READ)
-               return ERROR_TYPE_READ;
-       return ERROR_TYPE_WRITE;
+               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)
@@ -379,8 +396,8 @@ static inline int should_fsync(struct thread_data *td)
  */
 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 *);
@@ -395,7 +412,7 @@ extern void fio_options_dup_and_init(struct option *);
 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);
 extern int ioengine_load(struct thread_data *);
 
@@ -412,6 +429,7 @@ extern int initialize_fio(char *envp[]);
  */
 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
@@ -439,10 +457,11 @@ extern void fio_terminate_threads(int);
 /*
  * 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
@@ -511,10 +530,12 @@ static inline int should_check_rate(struct thread_data *td,
 {
        int ret = 0;
 
-       if (bytes_done[0])
-               ret |= __should_check_rate(td, 0);
-       if (bytes_done[1])
-               ret |= __should_check_rate(td, 1);
+       if (bytes_done[DDIR_READ])
+               ret |= __should_check_rate(td, DDIR_READ);
+       if (bytes_done[DDIR_WRITE])
+               ret |= __should_check_rate(td, DDIR_WRITE);
+       if (bytes_done[DDIR_TRIM])
+               ret |= __should_check_rate(td, DDIR_TRIM);
 
        return ret;
 }
@@ -549,4 +570,12 @@ static inline void td_io_u_free_notify(struct thread_data *td)
 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,
+       FIO_OUTPUT_NORMAL,
+};
+
 #endif