Home | History | Annotate | Download | only in fio
      1 #ifndef FIO_H
      2 #define FIO_H
      3 
      4 #include <sched.h>
      5 #include <limits.h>
      6 #include <pthread.h>
      7 #include <sys/time.h>
      8 #include <sys/resource.h>
      9 #include <errno.h>
     10 #include <stdlib.h>
     11 #include <stdio.h>
     12 #include <unistd.h>
     13 #include <string.h>
     14 #include <inttypes.h>
     15 #include <assert.h>
     16 
     17 #include "compiler/compiler.h"
     18 #include "thread_options.h"
     19 #include "flist.h"
     20 #include "fifo.h"
     21 #include "arch/arch.h"
     22 #include "os/os.h"
     23 #include "mutex.h"
     24 #include "log.h"
     25 #include "debug.h"
     26 #include "file.h"
     27 #include "io_ddir.h"
     28 #include "ioengines.h"
     29 #include "iolog.h"
     30 #include "helpers.h"
     31 #include "options.h"
     32 #include "profile.h"
     33 #include "fio_time.h"
     34 #include "gettime.h"
     35 #include "oslib/getopt.h"
     36 #include "lib/rand.h"
     37 #include "lib/rbtree.h"
     38 #include "lib/num2str.h"
     39 #include "client.h"
     40 #include "server.h"
     41 #include "stat.h"
     42 #include "flow.h"
     43 #include "io_u.h"
     44 #include "io_u_queue.h"
     45 #include "workqueue.h"
     46 #include "steadystate.h"
     47 
     48 #ifdef CONFIG_SOLARISAIO
     49 #include <sys/asynch.h>
     50 #endif
     51 
     52 #ifdef CONFIG_LIBNUMA
     53 #include <linux/mempolicy.h>
     54 #include <numa.h>
     55 
     56 /*
     57  * "local" is pseudo-policy
     58  */
     59 #define MPOL_LOCAL MPOL_MAX
     60 #endif
     61 
     62 #ifdef CONFIG_CUDA
     63 #include <cuda.h>
     64 #endif
     65 
     66 /*
     67  * offset generator types
     68  */
     69 enum {
     70 	RW_SEQ_SEQ	= 0,
     71 	RW_SEQ_IDENT,
     72 };
     73 
     74 enum {
     75 	TD_F_VER_BACKLOG	= 1U << 0,
     76 	TD_F_TRIM_BACKLOG	= 1U << 1,
     77 	TD_F_READ_IOLOG		= 1U << 2,
     78 	TD_F_REFILL_BUFFERS	= 1U << 3,
     79 	TD_F_SCRAMBLE_BUFFERS	= 1U << 4,
     80 	TD_F_VER_NONE		= 1U << 5,
     81 	TD_F_PROFILE_OPS	= 1U << 6,
     82 	TD_F_COMPRESS		= 1U << 7,
     83 	TD_F_RESERVED		= 1U << 8, /* not used */
     84 	TD_F_COMPRESS_LOG	= 1U << 9,
     85 	TD_F_VSTATE_SAVED	= 1U << 10,
     86 	TD_F_NEED_LOCK		= 1U << 11,
     87 	TD_F_CHILD		= 1U << 12,
     88 	TD_F_NO_PROGRESS        = 1U << 13,
     89 	TD_F_REGROW_LOGS	= 1U << 14,
     90 };
     91 
     92 enum {
     93 	FIO_RAND_BS_OFF		= 0,
     94 	FIO_RAND_VER_OFF,
     95 	FIO_RAND_MIX_OFF,
     96 	FIO_RAND_FILE_OFF,
     97 	FIO_RAND_BLOCK_OFF,
     98 	FIO_RAND_FILE_SIZE_OFF,
     99 	FIO_RAND_TRIM_OFF,
    100 	FIO_RAND_BUF_OFF,
    101 	FIO_RAND_SEQ_RAND_READ_OFF,
    102 	FIO_RAND_SEQ_RAND_WRITE_OFF,
    103 	FIO_RAND_SEQ_RAND_TRIM_OFF,
    104 	FIO_RAND_START_DELAY,
    105 	FIO_DEDUPE_OFF,
    106 	FIO_RAND_POISSON_OFF,
    107 	FIO_RAND_ZONE_OFF,
    108 	FIO_RAND_POISSON2_OFF,
    109 	FIO_RAND_POISSON3_OFF,
    110 	FIO_RAND_NR_OFFS,
    111 };
    112 
    113 enum {
    114 	IO_MODE_INLINE = 0,
    115 	IO_MODE_OFFLOAD = 1,
    116 
    117 	RATE_PROCESS_LINEAR = 0,
    118 	RATE_PROCESS_POISSON = 1,
    119 };
    120 
    121 enum {
    122 	F_ADV_NONE = 0,
    123 	F_ADV_TYPE,
    124 	F_ADV_RANDOM,
    125 	F_ADV_SEQUENTIAL,
    126 };
    127 
    128 /*
    129  * Per-thread/process specific data. Only used for the network client
    130  * for now.
    131  */
    132 void sk_out_assign(struct sk_out *);
    133 void sk_out_drop(void);
    134 
    135 struct zone_split_index {
    136 	uint8_t size_perc;
    137 	uint8_t size_perc_prev;
    138 };
    139 
    140 /*
    141  * This describes a single thread/process executing a fio job.
    142  */
    143 struct thread_data {
    144 	struct flist_head opt_list;
    145 	unsigned long flags;
    146 	struct thread_options o;
    147 	void *eo;
    148 	pthread_t thread;
    149 	unsigned int thread_number;
    150 	unsigned int subjob_number;
    151 	unsigned int groupid;
    152 	struct thread_stat ts;
    153 
    154 	int client_type;
    155 
    156 	struct io_log *slat_log;
    157 	struct io_log *clat_log;
    158 	struct io_log *clat_hist_log;
    159 	struct io_log *lat_log;
    160 	struct io_log *bw_log;
    161 	struct io_log *iops_log;
    162 
    163 	struct workqueue log_compress_wq;
    164 
    165 	struct thread_data *parent;
    166 
    167 	uint64_t stat_io_bytes[DDIR_RWDIR_CNT];
    168 	struct timeval bw_sample_time;
    169 
    170 	uint64_t stat_io_blocks[DDIR_RWDIR_CNT];
    171 	struct timeval iops_sample_time;
    172 
    173 	volatile int update_rusage;
    174 	struct fio_mutex *rusage_sem;
    175 	struct rusage ru_start;
    176 	struct rusage ru_end;
    177 
    178 	struct fio_file **files;
    179 	unsigned char *file_locks;
    180 	unsigned int files_size;
    181 	unsigned int files_index;
    182 	unsigned int nr_open_files;
    183 	unsigned int nr_done_files;
    184 	unsigned int nr_normal_files;
    185 	union {
    186 		unsigned int next_file;
    187 		struct frand_state next_file_state;
    188 	};
    189 	union {
    190 		struct zipf_state next_file_zipf;
    191 		struct gauss_state next_file_gauss;
    192 	};
    193 	union {
    194 		double zipf_theta;
    195 		double pareto_h;
    196 		double gauss_dev;
    197 	};
    198 	int error;
    199 	int sig;
    200 	int done;
    201 	int stop_io;
    202 	pid_t pid;
    203 	char *orig_buffer;
    204 	size_t orig_buffer_size;
    205 	volatile int terminate;
    206 	volatile int runstate;
    207 	unsigned int last_was_sync;
    208 	enum fio_ddir last_ddir;
    209 
    210 	int mmapfd;
    211 
    212 	void *iolog_buf;
    213 	FILE *iolog_f;
    214 
    215 	unsigned long rand_seeds[FIO_RAND_NR_OFFS];
    216 
    217 	struct frand_state bsrange_state;
    218 	struct frand_state verify_state;
    219 	struct frand_state trim_state;
    220 	struct frand_state delay_state;
    221 
    222 	struct frand_state buf_state;
    223 	struct frand_state buf_state_prev;
    224 	struct frand_state dedupe_state;
    225 	struct frand_state zone_state;
    226 
    227 	struct zone_split_index **zone_state_index;
    228 
    229 	unsigned int verify_batch;
    230 	unsigned int trim_batch;
    231 
    232 	struct thread_io_list *vstate;
    233 
    234 	int shm_id;
    235 
    236 	/*
    237 	 * IO engine hooks, contains everything needed to submit an io_u
    238 	 * to any of the available IO engines.
    239 	 */
    240 	struct ioengine_ops *io_ops;
    241 	int io_ops_init;
    242 
    243 	/*
    244 	 * IO engine private data and dlhandle.
    245 	 */
    246 	void *io_ops_data;
    247 	void *io_ops_dlhandle;
    248 
    249 	/*
    250 	 * Queue depth of io_u's that fio MIGHT do
    251 	 */
    252 	unsigned int cur_depth;
    253 
    254 	/*
    255 	 * io_u's about to be committed
    256 	 */
    257 	unsigned int io_u_queued;
    258 
    259 	/*
    260 	 * io_u's submitted but not completed yet
    261 	 */
    262 	unsigned int io_u_in_flight;
    263 
    264 	/*
    265 	 * List of free and busy io_u's
    266 	 */
    267 	struct io_u_ring io_u_requeues;
    268 	struct io_u_queue io_u_freelist;
    269 	struct io_u_queue io_u_all;
    270 	pthread_mutex_t io_u_lock;
    271 	pthread_cond_t free_cond;
    272 
    273 	/*
    274 	 * async verify offload
    275 	 */
    276 	struct flist_head verify_list;
    277 	pthread_t *verify_threads;
    278 	unsigned int nr_verify_threads;
    279 	pthread_cond_t verify_cond;
    280 	int verify_thread_exit;
    281 
    282 	/*
    283 	 * Rate state
    284 	 */
    285 	uint64_t rate_bps[DDIR_RWDIR_CNT];
    286 	uint64_t rate_next_io_time[DDIR_RWDIR_CNT];
    287 	unsigned long rate_bytes[DDIR_RWDIR_CNT];
    288 	unsigned long rate_blocks[DDIR_RWDIR_CNT];
    289 	unsigned long long rate_io_issue_bytes[DDIR_RWDIR_CNT];
    290 	struct timeval lastrate[DDIR_RWDIR_CNT];
    291 	int64_t last_usec[DDIR_RWDIR_CNT];
    292 	struct frand_state poisson_state[DDIR_RWDIR_CNT];
    293 
    294 	/*
    295 	 * Enforced rate submission/completion workqueue
    296 	 */
    297 	struct workqueue io_wq;
    298 
    299 	uint64_t total_io_size;
    300 	uint64_t fill_device_size;
    301 
    302 	/*
    303 	 * Issue side
    304 	 */
    305 	uint64_t io_issues[DDIR_RWDIR_CNT];
    306 	uint64_t io_issue_bytes[DDIR_RWDIR_CNT];
    307 	uint64_t loops;
    308 
    309 	/*
    310 	 * Completions
    311 	 */
    312 	uint64_t io_blocks[DDIR_RWDIR_CNT];
    313 	uint64_t this_io_blocks[DDIR_RWDIR_CNT];
    314 	uint64_t io_bytes[DDIR_RWDIR_CNT];
    315 	uint64_t this_io_bytes[DDIR_RWDIR_CNT];
    316 	uint64_t io_skip_bytes;
    317 	uint64_t zone_bytes;
    318 	struct fio_mutex *mutex;
    319 	uint64_t bytes_done[DDIR_RWDIR_CNT];
    320 
    321 	/*
    322 	 * State for random io, a bitmap of blocks done vs not done
    323 	 */
    324 	struct frand_state random_state;
    325 
    326 	struct timeval start;	/* start of this loop */
    327 	struct timeval epoch;	/* time job was started */
    328 	unsigned long long unix_epoch; /* Time job was started, unix epoch based. */
    329 	struct timeval last_issue;
    330 	long time_offset;
    331 	struct timeval tv_cache;
    332 	struct timeval terminate_time;
    333 	unsigned int tv_cache_nr;
    334 	unsigned int tv_cache_mask;
    335 	unsigned int ramp_time_over;
    336 
    337 	/*
    338 	 * Time since last latency_window was started
    339 	 */
    340 	struct timeval latency_ts;
    341 	unsigned int latency_qd;
    342 	unsigned int latency_qd_high;
    343 	unsigned int latency_qd_low;
    344 	unsigned int latency_failed;
    345 	uint64_t latency_ios;
    346 	int latency_end_run;
    347 
    348 	/*
    349 	 * read/write mixed workload state
    350 	 */
    351 	struct frand_state rwmix_state;
    352 	unsigned long rwmix_issues;
    353 	enum fio_ddir rwmix_ddir;
    354 	unsigned int ddir_seq_nr;
    355 
    356 	/*
    357 	 * rand/seq mixed workload state
    358 	 */
    359 	struct frand_state seq_rand_state[DDIR_RWDIR_CNT];
    360 
    361 	/*
    362 	 * IO history logs for verification. We use a tree for sorting,
    363 	 * if we are overwriting. Otherwise just use a fifo.
    364 	 */
    365 	struct rb_root io_hist_tree;
    366 	struct flist_head io_hist_list;
    367 	unsigned long io_hist_len;
    368 
    369 	/*
    370 	 * For IO replaying
    371 	 */
    372 	struct flist_head io_log_list;
    373 
    374 	/*
    375 	 * For tracking/handling discards
    376 	 */
    377 	struct flist_head trim_list;
    378 	unsigned long trim_entries;
    379 
    380 	struct flist_head next_rand_list;
    381 
    382 	/*
    383 	 * for fileservice, how often to switch to a new file
    384 	 */
    385 	unsigned int file_service_nr;
    386 	unsigned int file_service_left;
    387 	struct fio_file *file_service_file;
    388 
    389 	unsigned int sync_file_range_nr;
    390 
    391 	/*
    392 	 * For generating file sizes
    393 	 */
    394 	struct frand_state file_size_state;
    395 
    396 	/*
    397 	 * Error counts
    398 	 */
    399 	unsigned int total_err_count;
    400 	int first_error;
    401 
    402 	struct fio_flow *flow;
    403 
    404 	/*
    405 	 * Can be overloaded by profiles
    406 	 */
    407 	struct prof_io_ops prof_io_ops;
    408 	void *prof_data;
    409 
    410 	void *pinned_mem;
    411 
    412 	struct steadystate_data ss;
    413 
    414 	char verror[FIO_VERROR_SIZE];
    415 
    416 #ifdef CONFIG_CUDA
    417 	/*
    418 	 * for GPU memory management
    419 	 */
    420 	int gpu_dev_cnt;
    421 	int gpu_dev_id;
    422 	CUdevice  cu_dev;
    423 	CUcontext cu_ctx;
    424 	CUdeviceptr dev_mem_ptr;
    425 #endif
    426 
    427 };
    428 
    429 /*
    430  * when should interactive ETA output be generated
    431  */
    432 enum {
    433 	FIO_ETA_AUTO,
    434 	FIO_ETA_ALWAYS,
    435 	FIO_ETA_NEVER,
    436 };
    437 
    438 #define __td_verror(td, err, msg, func)					\
    439 	do {								\
    440 		unsigned int ____e = (err);				\
    441 		if ((td)->error)					\
    442 			break;						\
    443 		(td)->error = ____e;					\
    444 		if (!(td)->first_error)					\
    445 			snprintf(td->verror, sizeof(td->verror), "file:%s:%d, func=%s, error=%s", __FILE__, __LINE__, (func), (msg));		\
    446 	} while (0)
    447 
    448 
    449 #define td_clear_error(td)		do {		\
    450 	(td)->error = 0;				\
    451 	if ((td)->parent)				\
    452 		(td)->parent->error = 0;		\
    453 } while (0)
    454 
    455 #define td_verror(td, err, func)	do {			\
    456 	__td_verror((td), (err), strerror((err)), (func));	\
    457 	if ((td)->parent)					\
    458 		__td_verror((td)->parent, (err), strerror((err)), (func)); \
    459 } while (0)
    460 
    461 #define td_vmsg(td, err, msg, func)	do {			\
    462 	__td_verror((td), (err), (msg), (func));		\
    463 	if ((td)->parent)					\
    464 		__td_verror((td)->parent, (err), (msg), (func));	\
    465 } while (0)
    466 
    467 #define __fio_stringify_1(x)	#x
    468 #define __fio_stringify(x)	__fio_stringify_1(x)
    469 
    470 extern int exitall_on_terminate;
    471 extern unsigned int thread_number;
    472 extern unsigned int stat_number;
    473 extern int shm_id;
    474 extern int groupid;
    475 extern int output_format;
    476 extern int append_terse_output;
    477 extern int temp_stall_ts;
    478 extern uintptr_t page_mask, page_size;
    479 extern int read_only;
    480 extern int eta_print;
    481 extern int eta_new_line;
    482 extern unsigned long done_secs;
    483 extern int fio_gtod_offload;
    484 extern int fio_gtod_cpu;
    485 extern enum fio_cs fio_clock_source;
    486 extern int fio_clock_source_set;
    487 extern int warnings_fatal;
    488 extern int terse_version;
    489 extern int is_backend;
    490 extern int nr_clients;
    491 extern int log_syslog;
    492 extern int status_interval;
    493 extern const char fio_version_string[];
    494 extern char *trigger_file;
    495 extern char *trigger_cmd;
    496 extern char *trigger_remote_cmd;
    497 extern long long trigger_timeout;
    498 extern char *aux_path;
    499 
    500 extern struct thread_data *threads;
    501 
    502 static inline void fio_ro_check(const struct thread_data *td, struct io_u *io_u)
    503 {
    504 	assert(!(io_u->ddir == DDIR_WRITE && !td_write(td)));
    505 }
    506 
    507 #define REAL_MAX_JOBS		4096
    508 
    509 static inline int should_fsync(struct thread_data *td)
    510 {
    511 	if (td->last_was_sync)
    512 		return 0;
    513 	if (td_write(td) || td->o.override_sync)
    514 		return 1;
    515 
    516 	return 0;
    517 }
    518 
    519 /*
    520  * Init/option functions
    521  */
    522 extern int __must_check fio_init_options(void);
    523 extern int __must_check parse_options(int, char **);
    524 extern int parse_jobs_ini(char *, int, int, int);
    525 extern int parse_cmd_line(int, char **, int);
    526 extern int fio_backend(struct sk_out *);
    527 extern void reset_fio_state(void);
    528 extern void clear_io_state(struct thread_data *, int);
    529 extern int fio_options_parse(struct thread_data *, char **, int);
    530 extern void fio_keywords_init(void);
    531 extern void fio_keywords_exit(void);
    532 extern int fio_cmd_option_parse(struct thread_data *, const char *, char *);
    533 extern int fio_cmd_ioengine_option_parse(struct thread_data *, const char *, char *);
    534 extern void fio_fill_default_options(struct thread_data *);
    535 extern int fio_show_option_help(const char *);
    536 extern void fio_options_set_ioengine_opts(struct option *long_options, struct thread_data *td);
    537 extern void fio_options_dup_and_init(struct option *);
    538 extern void fio_options_mem_dupe(struct thread_data *);
    539 extern void td_fill_rand_seeds(struct thread_data *);
    540 extern void td_fill_verify_state_seed(struct thread_data *);
    541 extern void add_job_opts(const char **, int);
    542 extern int ioengine_load(struct thread_data *);
    543 extern bool parse_dryrun(void);
    544 extern int fio_running_or_pending_io_threads(void);
    545 extern int fio_set_fd_nonblocking(int, const char *);
    546 extern void sig_show_status(int sig);
    547 extern struct thread_data *get_global_options(void);
    548 
    549 extern uintptr_t page_mask;
    550 extern uintptr_t page_size;
    551 extern int initialize_fio(char *envp[]);
    552 extern void deinitialize_fio(void);
    553 
    554 #define FIO_GETOPT_JOB		0x89000000
    555 #define FIO_GETOPT_IOENGINE	0x98000000
    556 #define FIO_NR_OPTIONS		(FIO_MAX_OPTS + 128)
    557 
    558 /*
    559  * ETA/status stuff
    560  */
    561 extern void print_thread_status(void);
    562 extern void print_status_init(int);
    563 extern char *fio_uint_to_kmg(unsigned int val);
    564 
    565 /*
    566  * Thread life cycle. Once a thread has a runstate beyond TD_INITIALIZED, it
    567  * will never back again. It may cycle between running/verififying/fsyncing.
    568  * Once the thread reaches TD_EXITED, it is just waiting for the core to
    569  * reap it.
    570  */
    571 enum {
    572 	TD_NOT_CREATED = 0,
    573 	TD_CREATED,
    574 	TD_INITIALIZED,
    575 	TD_RAMP,
    576 	TD_SETTING_UP,
    577 	TD_RUNNING,
    578 	TD_PRE_READING,
    579 	TD_VERIFYING,
    580 	TD_FSYNCING,
    581 	TD_FINISHING,
    582 	TD_EXITED,
    583 	TD_REAPED,
    584 	TD_LAST,
    585 	TD_NR,
    586 };
    587 
    588 #define TD_ENG_FLAG_SHIFT	16
    589 #define TD_ENG_FLAG_MASK	((1U << 16) - 1)
    590 
    591 static inline enum fio_ioengine_flags td_ioengine_flags(struct thread_data *td)
    592 {
    593 	return (enum fio_ioengine_flags)
    594 		((td->flags >> TD_ENG_FLAG_SHIFT) & TD_ENG_FLAG_MASK);
    595 }
    596 
    597 static inline void td_set_ioengine_flags(struct thread_data *td)
    598 {
    599 	td->flags = (~(TD_ENG_FLAG_MASK << TD_ENG_FLAG_SHIFT) & td->flags) |
    600 		    (td->io_ops->flags << TD_ENG_FLAG_SHIFT);
    601 }
    602 
    603 static inline bool td_ioengine_flagged(struct thread_data *td,
    604 				       enum fio_ioengine_flags flags)
    605 {
    606 	return ((td->flags >> TD_ENG_FLAG_SHIFT) & flags) != 0;
    607 }
    608 
    609 extern void td_set_runstate(struct thread_data *, int);
    610 extern int td_bump_runstate(struct thread_data *, int);
    611 extern void td_restore_runstate(struct thread_data *, int);
    612 extern const char *runstate_to_name(int runstate);
    613 
    614 /*
    615  * Allow 60 seconds for a job to quit on its own, otherwise reap with
    616  * a vengeance.
    617  */
    618 #define FIO_REAP_TIMEOUT	300
    619 
    620 #define TERMINATE_ALL		(-1U)
    621 extern void fio_terminate_threads(unsigned int);
    622 extern void fio_mark_td_terminate(struct thread_data *);
    623 
    624 /*
    625  * Memory helpers
    626  */
    627 extern int __must_check fio_pin_memory(struct thread_data *);
    628 extern void fio_unpin_memory(struct thread_data *);
    629 extern int __must_check allocate_io_mem(struct thread_data *);
    630 extern void free_io_mem(struct thread_data *);
    631 extern void free_threads_shm(void);
    632 
    633 #ifdef FIO_INTERNAL
    634 #define PTR_ALIGN(ptr, mask)	\
    635 	(char *) (((uintptr_t) (ptr) + (mask)) & ~(mask))
    636 #endif
    637 
    638 /*
    639  * Reset stats after ramp time completes
    640  */
    641 extern void reset_all_stats(struct thread_data *);
    642 
    643 /*
    644  * blktrace support
    645  */
    646 #ifdef FIO_HAVE_BLKTRACE
    647 extern int is_blktrace(const char *, int *);
    648 extern int load_blktrace(struct thread_data *, const char *, int);
    649 #endif
    650 
    651 extern int io_queue_event(struct thread_data *td, struct io_u *io_u, int *ret,
    652 		   enum fio_ddir ddir, uint64_t *bytes_issued, int from_verify,
    653 		   struct timeval *comp_time);
    654 
    655 /*
    656  * Latency target helpers
    657  */
    658 extern void lat_target_check(struct thread_data *);
    659 extern void lat_target_init(struct thread_data *);
    660 extern void lat_target_reset(struct thread_data *);
    661 
    662 /*
    663  * Iterates all threads/processes within all the defined jobs
    664  */
    665 #define for_each_td(td, i)	\
    666 	for ((i) = 0, (td) = &threads[0]; (i) < (int) thread_number; (i)++, (td)++)
    667 #define for_each_file(td, f, i)	\
    668 	if ((td)->files_index)						\
    669 		for ((i) = 0, (f) = (td)->files[0];			\
    670 	    	 (i) < (td)->o.nr_files && ((f) = (td)->files[i]) != NULL; \
    671 		 (i)++)
    672 
    673 #define fio_assert(td, cond)	do {	\
    674 	if (!(cond)) {			\
    675 		int *__foo = NULL;	\
    676 		fprintf(stderr, "file:%s:%d, assert %s failed\n", __FILE__, __LINE__, #cond);	\
    677 		td_set_runstate((td), TD_EXITED);	\
    678 		(td)->error = EFAULT;		\
    679 		*__foo = 0;			\
    680 	}	\
    681 } while (0)
    682 
    683 static inline bool fio_fill_issue_time(struct thread_data *td)
    684 {
    685 	if (td->o.read_iolog_file ||
    686 	    !td->o.disable_clat || !td->o.disable_slat || !td->o.disable_bw)
    687 		return true;
    688 
    689 	return false;
    690 }
    691 
    692 static inline bool __should_check_rate(struct thread_data *td,
    693 				       enum fio_ddir ddir)
    694 {
    695 	struct thread_options *o = &td->o;
    696 
    697 	/*
    698 	 * If some rate setting was given, we need to check it
    699 	 */
    700 	if (o->rate[ddir] || o->ratemin[ddir] || o->rate_iops[ddir] ||
    701 	    o->rate_iops_min[ddir])
    702 		return true;
    703 
    704 	return false;
    705 }
    706 
    707 static inline bool should_check_rate(struct thread_data *td)
    708 {
    709 	if (td->bytes_done[DDIR_READ] && __should_check_rate(td, DDIR_READ))
    710 		return true;
    711 	if (td->bytes_done[DDIR_WRITE] && __should_check_rate(td, DDIR_WRITE))
    712 		return true;
    713 	if (td->bytes_done[DDIR_TRIM] && __should_check_rate(td, DDIR_TRIM))
    714 		return true;
    715 
    716 	return false;
    717 }
    718 
    719 static inline unsigned int td_max_bs(struct thread_data *td)
    720 {
    721 	unsigned int max_bs;
    722 
    723 	max_bs = max(td->o.max_bs[DDIR_READ], td->o.max_bs[DDIR_WRITE]);
    724 	return max(td->o.max_bs[DDIR_TRIM], max_bs);
    725 }
    726 
    727 static inline unsigned int td_min_bs(struct thread_data *td)
    728 {
    729 	unsigned int min_bs;
    730 
    731 	min_bs = min(td->o.min_bs[DDIR_READ], td->o.min_bs[DDIR_WRITE]);
    732 	return min(td->o.min_bs[DDIR_TRIM], min_bs);
    733 }
    734 
    735 static inline bool td_async_processing(struct thread_data *td)
    736 {
    737 	return (td->flags & TD_F_NEED_LOCK) != 0;
    738 }
    739 
    740 /*
    741  * We currently only need to do locking if we have verifier threads
    742  * accessing our internal structures too
    743  */
    744 static inline void td_io_u_lock(struct thread_data *td)
    745 {
    746 	if (td_async_processing(td))
    747 		pthread_mutex_lock(&td->io_u_lock);
    748 }
    749 
    750 static inline void td_io_u_unlock(struct thread_data *td)
    751 {
    752 	if (td_async_processing(td))
    753 		pthread_mutex_unlock(&td->io_u_lock);
    754 }
    755 
    756 static inline void td_io_u_free_notify(struct thread_data *td)
    757 {
    758 	if (td_async_processing(td))
    759 		pthread_cond_signal(&td->free_cond);
    760 }
    761 
    762 static inline void td_flags_clear(struct thread_data *td, unsigned int *flags,
    763 				  unsigned int value)
    764 {
    765 	if (!td_async_processing(td))
    766 		*flags &= ~value;
    767 	else
    768 		__sync_fetch_and_and(flags, ~value);
    769 }
    770 
    771 static inline void td_flags_set(struct thread_data *td, unsigned int *flags,
    772 				unsigned int value)
    773 {
    774 	if (!td_async_processing(td))
    775 		*flags |= value;
    776 	else
    777 		__sync_fetch_and_or(flags, value);
    778 }
    779 
    780 extern const char *fio_get_arch_string(int);
    781 extern const char *fio_get_os_string(int);
    782 
    783 #ifdef FIO_INTERNAL
    784 #define ARRAY_SIZE(x)    (sizeof((x)) / (sizeof((x)[0])))
    785 #define FIELD_SIZE(s, f) (sizeof(((typeof(s))0)->f))
    786 #endif
    787 
    788 enum {
    789 	__FIO_OUTPUT_TERSE	= 0,
    790 	__FIO_OUTPUT_JSON	= 1,
    791 	__FIO_OUTPUT_NORMAL	= 2,
    792         __FIO_OUTPUT_JSON_PLUS  = 3,
    793 	FIO_OUTPUT_NR		= 4,
    794 
    795 	FIO_OUTPUT_TERSE	= 1U << __FIO_OUTPUT_TERSE,
    796 	FIO_OUTPUT_JSON		= 1U << __FIO_OUTPUT_JSON,
    797 	FIO_OUTPUT_NORMAL	= 1U << __FIO_OUTPUT_NORMAL,
    798 	FIO_OUTPUT_JSON_PLUS    = 1U << __FIO_OUTPUT_JSON_PLUS,
    799 };
    800 
    801 enum {
    802 	FIO_RAND_DIST_RANDOM	= 0,
    803 	FIO_RAND_DIST_ZIPF,
    804 	FIO_RAND_DIST_PARETO,
    805 	FIO_RAND_DIST_GAUSS,
    806 	FIO_RAND_DIST_ZONED,
    807 };
    808 
    809 #define FIO_DEF_ZIPF		1.1
    810 #define FIO_DEF_PARETO		0.2
    811 
    812 enum {
    813 	FIO_RAND_GEN_TAUSWORTHE = 0,
    814 	FIO_RAND_GEN_LFSR,
    815 	FIO_RAND_GEN_TAUSWORTHE64,
    816 };
    817 
    818 enum {
    819 	FIO_CPUS_SHARED		= 0,
    820 	FIO_CPUS_SPLIT,
    821 };
    822 
    823 extern void exec_trigger(const char *);
    824 extern void check_trigger_file(void);
    825 
    826 #endif
    827