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