init.c revision 13f8e2d2e3e5ec7d8c18b70fb2a2e2a026190020
1906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe/*
2906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe * This file contains the ini and command liner parser. It will create
3906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe * and initialize the specified jobs.
4906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe */
5ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#include <stdio.h>
6ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#include <stdlib.h>
7ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#include <unistd.h>
8ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#include <fcntl.h>
9ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#include <ctype.h>
10ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#include <string.h>
11ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#include <errno.h>
12ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#include <sys/ipc.h>
13ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#include <sys/shm.h>
14ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#include <sys/types.h>
15ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#include <sys/stat.h>
16ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
17ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#include "fio.h"
18ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
19906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe/*
20906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe * The default options
21906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe */
2220dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe#define DEF_BS			(4096)
2320dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe#define DEF_TIMEOUT		(0)
2420dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe#define DEF_RATE_CYCLE		(1000)
2520dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe#define DEF_ODIRECT		(1)
2620dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe#define DEF_IO_ENGINE		(FIO_SYNCIO)
27ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define DEF_IO_ENGINE_NAME	"sync"
2820dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe#define DEF_SEQUENTIAL		(1)
2920dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe#define DEF_RAND_REPEAT		(1)
3020dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe#define DEF_OVERWRITE		(1)
3120dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe#define DEF_INVALIDATE		(1)
3220dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe#define DEF_SYNCIO		(0)
3320dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe#define DEF_RANDSEED		(0xb1899bedUL)
3420dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe#define DEF_BWAVGTIME		(500)
3520dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe#define DEF_CREATE_SER		(1)
36ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define DEF_CREATE_FSYNC	(1)
3720dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe#define DEF_LOOPS		(1)
3820dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe#define DEF_VERIFY		(0)
3920dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe#define DEF_STONEWALL		(0)
4020dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe#define DEF_NUMJOBS		(1)
4120dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe#define DEF_USE_THREAD		(0)
4220dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe#define DEF_FILE_SIZE		(1024 * 1024 * 1024UL)
4320dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe#define DEF_ZONE_SIZE		(0)
4420dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe#define DEF_ZONE_SKIP		(0)
45a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe#define DEF_RWMIX_CYCLE		(500)
46a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe#define DEF_RWMIX_READ		(50)
47b6f4d8804ad499adf10b4cad0657284a8a4a6287Jens Axboe#define DEF_NICE		(0)
4853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#define DEF_NR_FILES		(1)
49f6cbb269c54ff40f3922818d42117f5a8026df36Jens Axboe#define DEF_UNLINK		(0)
50ec94ec567cae47f91fa31a18250c2a7a0029d2adJens Axboe#define DEF_WRITE_BW_LOG	(0)
51ec94ec567cae47f91fa31a18250c2a7a0029d2adJens Axboe#define DEF_WRITE_LAT_LOG	(0)
52ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
53972cfd2546081c0397447ca9243ea419b1ff579aJens Axboestatic int def_timeout = DEF_TIMEOUT;
54972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe
55f4866ec5515d8ee329bd904764212489efc8cba2Jens Axboestatic char fio_version_string[] = "fio 1.5";
56ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
57972cfd2546081c0397447ca9243ea419b1ff579aJens Axboestatic char **ini_file;
58ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboestatic int max_jobs = MAX_JOBS;
59ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
60ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboestruct thread_data def_thread;
61ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboestruct thread_data *threads = NULL;
62ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
63ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboeint rate_quit = 0;
64ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboeint exitall_on_terminate = 0;
65c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboeint terse_output = 0;
66c04f7ec3ecb8ce780bde6ad3515f003e6015c62aJens Axboeunsigned long long mlock_size = 0;
67eb8bbf48e79a8c6afd3c84e3d64263d10ee45daaJens AxboeFILE *f_out = NULL;
68eb8bbf48e79a8c6afd3c84e3d64263d10ee45daaJens AxboeFILE *f_err = NULL;
69ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
70ec94ec567cae47f91fa31a18250c2a7a0029d2adJens Axboestatic int write_lat_log = DEF_WRITE_LAT_LOG;
71ec94ec567cae47f91fa31a18250c2a7a0029d2adJens Axboestatic int write_bw_log = DEF_WRITE_BW_LOG;
72ec94ec567cae47f91fa31a18250c2a7a0029d2adJens Axboe
73906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe/*
74906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe * Return a free job structure.
75906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe */
76ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboestatic struct thread_data *get_new_job(int global, struct thread_data *parent)
77ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
78ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	struct thread_data *td;
79ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
80ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (global)
81ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return &def_thread;
82ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (thread_number >= max_jobs)
83ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return NULL;
84ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
85ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	td = &threads[thread_number++];
86ddaeaa5ab1e3f1cb6f35a9f4a18ee932151a0ab8Jens Axboe	*td = *parent;
87ddaeaa5ab1e3f1cb6f35a9f4a18ee932151a0ab8Jens Axboe	td->name[0] = '\0';
88ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
89ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	td->thread_number = thread_number;
90ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return td;
91ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
92ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
93ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboestatic void put_job(struct thread_data *td)
94ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
95ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	memset(&threads[td->thread_number - 1], 0, sizeof(*td));
96ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	thread_number--;
97ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
98ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
99906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe/*
100906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe * Adds a job to the list of things todo. Sanitizes the various options
101906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe * to make sure we don't have conflicts, and initializes various
102906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe * members of td.
103906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe */
104751548451d969148529b642c05e7544726ec3b64Jens Axboestatic int add_job(struct thread_data *td, const char *jobname, int job_add_num)
105ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
1063d60d1ed78b663659967e04cc92e1359bd50fb3aJens Axboe	char *ddir_str[] = { "read", "write", "randread", "randwrite",
1073d60d1ed78b663659967e04cc92e1359bd50fb3aJens Axboe			     "rw", NULL, "randrw" };
108ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	struct stat sb;
10953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int numjobs, ddir, i;
11053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct fio_file *f;
111ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
112ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#ifndef FIO_HAVE_LIBAIO
113ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (td->io_engine == FIO_LIBAIO) {
1143b70d7e51e0b672a8b337c57c8faf865c0b7f415Jens Axboe		log_err("Linux libaio not available\n");
115ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 1;
116ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	}
117ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#endif
118ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#ifndef FIO_HAVE_POSIXAIO
119ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (td->io_engine == FIO_POSIXAIO) {
1203b70d7e51e0b672a8b337c57c8faf865c0b7f415Jens Axboe		log_err("posix aio not available\n");
121ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 1;
122ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	}
123ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#endif
124ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
125ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	/*
126ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	 * the def_thread is just for options, it's not a real job
127ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	 */
128ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (td == &def_thread)
129ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 0;
130ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
131df64119de537aba99c85d1dc80190b354589f8b9Jens Axboe	/*
132df64119de537aba99c85d1dc80190b354589f8b9Jens Axboe	 * Set default io engine, if none set
133df64119de537aba99c85d1dc80190b354589f8b9Jens Axboe	 */
134df64119de537aba99c85d1dc80190b354589f8b9Jens Axboe	if (!td->io_ops) {
135df64119de537aba99c85d1dc80190b354589f8b9Jens Axboe		td->io_ops = load_ioengine(td, DEF_IO_ENGINE_NAME);
136df64119de537aba99c85d1dc80190b354589f8b9Jens Axboe		if (!td->io_ops) {
137df64119de537aba99c85d1dc80190b354589f8b9Jens Axboe			log_err("default engine %s not there?\n", DEF_IO_ENGINE_NAME);
138df64119de537aba99c85d1dc80190b354589f8b9Jens Axboe			return 1;
139df64119de537aba99c85d1dc80190b354589f8b9Jens Axboe		}
140df64119de537aba99c85d1dc80190b354589f8b9Jens Axboe	}
141df64119de537aba99c85d1dc80190b354589f8b9Jens Axboe
1422866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe	if (td->io_ops->flags & FIO_SYNCIO)
143ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		td->iodepth = 1;
144ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	else {
145ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		if (!td->iodepth)
146841ddd1322abbb48b2afe25712b4303dbf8cc5deJens Axboe			td->iodepth = td->nr_files;
147ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	}
148ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
14920dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe	/*
15053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 * only really works for sequential io for now, and with 1 file
15120dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe	 */
15253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->zone_size && !td->sequential && td->nr_files == 1)
15320dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe		td->zone_size = 0;
15420dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe
1559cc935a15e2ca54e6bdff4c18bd432dff3fbfaeeJens Axboe	/*
1569cc935a15e2ca54e6bdff4c18bd432dff3fbfaeeJens Axboe	 * Reads can do overwrites, we always need to pre-create the file
1579cc935a15e2ca54e6bdff4c18bd432dff3fbfaeeJens Axboe	 */
1589cc935a15e2ca54e6bdff4c18bd432dff3fbfaeeJens Axboe	if (td_read(td) || td_rw(td))
1599cc935a15e2ca54e6bdff4c18bd432dff3fbfaeeJens Axboe		td->overwrite = 1;
1609cc935a15e2ca54e6bdff4c18bd432dff3fbfaeeJens Axboe
161ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	td->filetype = FIO_TYPE_FILE;
1620af7b542b69af5ab2400a9960a5bcde82c05723fJens Axboe	if (!stat(jobname, &sb)) {
1630af7b542b69af5ab2400a9960a5bcde82c05723fJens Axboe		if (S_ISBLK(sb.st_mode))
1640af7b542b69af5ab2400a9960a5bcde82c05723fJens Axboe			td->filetype = FIO_TYPE_BD;
1650af7b542b69af5ab2400a9960a5bcde82c05723fJens Axboe		else if (S_ISCHR(sb.st_mode))
1660af7b542b69af5ab2400a9960a5bcde82c05723fJens Axboe			td->filetype = FIO_TYPE_CHAR;
1670af7b542b69af5ab2400a9960a5bcde82c05723fJens Axboe	}
168ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
169b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe	if (td->odirect)
170b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe		td->io_ops->flags |= FIO_RAWIO;
171b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe
17213f8e2d2e3e5ec7d8c18b70fb2a2e2a026190020Jens Axboe	if (td->filename)
17313f8e2d2e3e5ec7d8c18b70fb2a2e2a026190020Jens Axboe		td->nr_uniq_files = 1;
17413f8e2d2e3e5ec7d8c18b70fb2a2e2a026190020Jens Axboe	else
17513f8e2d2e3e5ec7d8c18b70fb2a2e2a026190020Jens Axboe		td->nr_uniq_files = td->nr_files;
17613f8e2d2e3e5ec7d8c18b70fb2a2e2a026190020Jens Axboe
17713f8e2d2e3e5ec7d8c18b70fb2a2e2a026190020Jens Axboe	if (td->filetype == FIO_TYPE_FILE || td->filename) {
178e9c047a0d8dfc32634b896e1600c6f1aa4174378Jens Axboe		char tmp[PATH_MAX];
17953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		int len = 0;
18053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		int i;
181e9c047a0d8dfc32634b896e1600c6f1aa4174378Jens Axboe
182ef899b6393c43abd655ad2cbc22de18b88a101f8Jens Axboe		if (td->directory && td->directory[0] != '\0')
18353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			sprintf(tmp, "%s/", td->directory);
184ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
18553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		td->files = malloc(sizeof(struct fio_file) * td->nr_files);
18653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
18753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		for_each_file(td, f, i) {
18853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			memset(f, 0, sizeof(*f));
18953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			f->fd = -1;
190b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe			f->fileno = i;
19153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
19213f8e2d2e3e5ec7d8c18b70fb2a2e2a026190020Jens Axboe			if (td->filename)
19313f8e2d2e3e5ec7d8c18b70fb2a2e2a026190020Jens Axboe				sprintf(tmp + len, "%s", td->filename);
19413f8e2d2e3e5ec7d8c18b70fb2a2e2a026190020Jens Axboe			else
19513f8e2d2e3e5ec7d8c18b70fb2a2e2a026190020Jens Axboe				sprintf(tmp + len, "%s.%d.%d", jobname, td->thread_number, i);
19653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			f->file_name = strdup(tmp);
19753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		}
19853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	} else {
19953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		td->nr_files = 1;
20053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		td->files = malloc(sizeof(struct fio_file));
20153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		f = &td->files[0];
20253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
20353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		memset(f, 0, sizeof(*f));
20453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		f->fd = -1;
20553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		f->file_name = strdup(jobname);
20653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
20753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
20853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	for_each_file(td, f, i) {
20953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		f->file_size = td->total_file_size / td->nr_files;
21053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		f->file_offset = td->start_offset;
21153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
21253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
213bbfd6b00dea4daee05133c8cb991b78d091df9aeJens Axboe	fio_sem_init(&td->mutex, 0);
214ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
215ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	td->clat_stat[0].min_val = td->clat_stat[1].min_val = ULONG_MAX;
216ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	td->slat_stat[0].min_val = td->slat_stat[1].min_val = ULONG_MAX;
217ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	td->bw_stat[0].min_val = td->bw_stat[1].min_val = ULONG_MAX;
218ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
219ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (td->min_bs == -1U)
220ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		td->min_bs = td->bs;
221ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (td->max_bs == -1U)
222ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		td->max_bs = td->bs;
2233d60d1ed78b663659967e04cc92e1359bd50fb3aJens Axboe	if (td_read(td) && !td_rw(td))
224ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		td->verify = 0;
225ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
226ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (td->stonewall && td->thread_number > 1)
227ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		groupid++;
228ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
229ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	td->groupid = groupid;
230ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
231ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (setup_rate(td))
232ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		goto err;
233ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
234ec94ec567cae47f91fa31a18250c2a7a0029d2adJens Axboe	if (td->write_lat_log) {
235ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		setup_log(&td->slat_log);
236ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		setup_log(&td->clat_log);
237ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	}
238ec94ec567cae47f91fa31a18250c2a7a0029d2adJens Axboe	if (td->write_bw_log)
239ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		setup_log(&td->bw_log);
240ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
24101452055af61d6f5de543575dba3ebb0c9e55fabJens Axboe	if (td->name[0] == '\0')
24201452055af61d6f5de543575dba3ebb0c9e55fabJens Axboe		snprintf(td->name, sizeof(td->name)-1, "client%d", td->thread_number);
24301452055af61d6f5de543575dba3ebb0c9e55fabJens Axboe
2443d60d1ed78b663659967e04cc92e1359bd50fb3aJens Axboe	ddir = td->ddir + (!td->sequential << 1) + (td->iomix << 2);
245751548451d969148529b642c05e7544726ec3b64Jens Axboe
246c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe	if (!terse_output) {
247b990b5c06801d6d25e3fcc5415efbbe7bb23341eJens Axboe		if (!job_add_num) {
2482866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe			if (td->io_ops->flags & FIO_CPUIO)
249b990b5c06801d6d25e3fcc5415efbbe7bb23341eJens Axboe				fprintf(f_out, "%s: ioengine=cpu, cpuload=%u, cpucycle=%u\n", td->name, td->cpuload, td->cpucycle);
250b990b5c06801d6d25e3fcc5415efbbe7bb23341eJens Axboe			else
2512866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe				fprintf(f_out, "%s: (g=%d): rw=%s, odir=%d, bs=%d-%d, rate=%d, ioengine=%s, iodepth=%d\n", td->name, td->groupid, ddir_str[ddir], td->odirect, td->min_bs, td->max_bs, td->rate, td->io_ops->name, td->iodepth);
252b990b5c06801d6d25e3fcc5415efbbe7bb23341eJens Axboe		} else if (job_add_num == 1)
253c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe			fprintf(f_out, "...\n");
254c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe	}
255ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
256ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	/*
257ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	 * recurse add identical jobs, clear numjobs and stonewall options
258ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	 * as they don't apply to sub-jobs
259ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	 */
260ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	numjobs = td->numjobs;
261ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	while (--numjobs) {
262ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		struct thread_data *td_new = get_new_job(0, td);
263ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
264ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		if (!td_new)
265ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			goto err;
266ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
267ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		td_new->numjobs = 1;
268ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		td_new->stonewall = 0;
269751548451d969148529b642c05e7544726ec3b64Jens Axboe		job_add_num = numjobs - 1;
270ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
271751548451d969148529b642c05e7544726ec3b64Jens Axboe		if (add_job(td_new, jobname, job_add_num))
272ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			goto err;
273ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	}
274ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return 0;
275ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboeerr:
276ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	put_job(td);
277ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return -1;
278ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
279ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
280906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe/*
281906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe * Initialize the various random states we need (random io, block size ranges,
282906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe * read/write mix, etc).
283906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe */
284ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboeint init_random_state(struct thread_data *td)
285ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
286a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe	unsigned long seeds[4];
28753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int fd, num_maps, blocks, i;
2880ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	struct fio_file *f;
289ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
2901ac267bb7dd678fa12bb3573c29cff5238ef9ccfJens Axboe	fd = open("/dev/urandom", O_RDONLY);
291ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (fd == -1) {
292ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		td_verror(td, errno);
293ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 1;
294ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	}
295ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
296a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe	if (read(fd, seeds, sizeof(seeds)) < (int) sizeof(seeds)) {
297ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		td_verror(td, EIO);
298ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		close(fd);
299ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 1;
300ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	}
301ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
302ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	close(fd);
303ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
3046dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe	os_random_seed(seeds[0], &td->bsrange_state);
3056dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe	os_random_seed(seeds[1], &td->verify_state);
3066dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe	os_random_seed(seeds[2], &td->rwmix_state);
307ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
308ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (td->sequential)
309ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 0;
310ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
3119ebc27e1352b905fe3396ce2350a7765fe9c57b8Jens Axboe	if (td->rand_repeatable)
312a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe		seeds[3] = DEF_RANDSEED;
313ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
3140ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	for_each_file(td, f, i) {
31553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		blocks = (f->file_size + td->min_bs - 1) / td->min_bs;
31653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		num_maps = blocks / BLOCKS_PER_MAP;
31753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		f->file_map = malloc(num_maps * sizeof(long));
31853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		f->num_maps = num_maps;
31953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		memset(f->file_map, 0, num_maps * sizeof(long));
32053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
321ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
3226dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe	os_random_seed(seeds[3], &td->random_state);
323ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return 0;
324ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
325ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
326ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboestatic void fill_cpu_mask(os_cpu_mask_t cpumask, int cpu)
327ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
328ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#ifdef FIO_HAVE_CPU_AFFINITY
329ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	unsigned int i;
330ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
331ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	CPU_ZERO(&cpumask);
332ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
333ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	for (i = 0; i < sizeof(int) * 8; i++) {
334ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		if ((1 << i) & cpu)
335ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			CPU_SET(i, &cpumask);
336ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	}
337ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#endif
338ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
339ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
340906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboestatic unsigned long get_mult_time(char c)
341906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe{
342906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe	switch (c) {
343906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe		case 'm':
344906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe		case 'M':
345906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe			return 60;
346906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe		case 'h':
347906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe		case 'H':
348906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe			return 60 * 60;
349906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe		case 'd':
350906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe		case 'D':
351906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe			return 24 * 60 * 60;
352906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe		default:
353906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe			return 1;
354906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe	}
355906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe}
356906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe
357906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboestatic unsigned long get_mult_bytes(char c)
358ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
359ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	switch (c) {
360ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		case 'k':
361ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		case 'K':
362ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			return 1024;
363ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		case 'm':
364ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		case 'M':
365ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			return 1024 * 1024;
366ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		case 'g':
367ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		case 'G':
368ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			return 1024 * 1024 * 1024;
369ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		default:
370ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			return 1;
371ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	}
372ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
373ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
374ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe/*
375ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * convert string after '=' into decimal value, noting any size suffix
376ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe */
377906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboestatic int str_to_decimal(char *p, unsigned long long *val, int kilo)
378ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
379ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	char *str;
380ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	int len;
381ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
382f5d3e5ec43653859e744225cc585757e77e4dbdcJens Axboe	str = strchr(p, '=');
383ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (!str)
384ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 1;
385ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
386ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	str++;
387ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	len = strlen(str);
388ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
389ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	*val = strtoul(str, NULL, 10);
390ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (*val == ULONG_MAX && errno == ERANGE)
391ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 1;
392ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
393906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe	if (kilo)
394906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe		*val *= get_mult_bytes(str[len - 1]);
395906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe	else
396906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe		*val *= get_mult_time(str[len - 1]);
397ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return 0;
398ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
399ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
400906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboestatic int check_str_bytes(char *p, char *name, unsigned long long *val)
401ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
40220dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe	if (strncmp(p, name, strlen(name) - 1))
403ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 1;
404ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
405906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe	return str_to_decimal(p, val, 1);
406906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe}
407906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe
408906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboestatic int check_str_time(char *p, char *name, unsigned long long *val)
409906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe{
410906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe	if (strncmp(p, name, strlen(name) - 1))
411906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe		return 1;
412906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe
413906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe	return str_to_decimal(p, val, 0);
414ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
415ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
416ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboestatic void strip_blank_front(char **p)
417ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
418ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	char *s = *p;
419ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
4204ae3f76333bf2382e516db0b5c202b8982b1170fJens Axboe	while (isspace(*s))
421ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		s++;
422ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
423ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
424ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboestatic void strip_blank_end(char *p)
425ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
4264ae3f76333bf2382e516db0b5c202b8982b1170fJens Axboe	char *s = p + strlen(p) - 1;
427ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
4284ae3f76333bf2382e516db0b5c202b8982b1170fJens Axboe	while (isspace(*s) || iscntrl(*s))
4294ae3f76333bf2382e516db0b5c202b8982b1170fJens Axboe		s--;
430aea47d444b02bd7c622f82bb73151fd7136a499fJens Axboe
4314ae3f76333bf2382e516db0b5c202b8982b1170fJens Axboe	*(s + 1) = '\0';
432aea47d444b02bd7c622f82bb73151fd7136a499fJens Axboe}
433aea47d444b02bd7c622f82bb73151fd7136a499fJens Axboe
434ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboetypedef int (str_cb_fn)(struct thread_data *, char *);
435ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
436ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboestatic int check_str(char *p, char *name, str_cb_fn *cb, struct thread_data *td)
437ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
438843a741389226f5f2d0ce8636cd57532be9b7e4dJens Axboe	char *s;
439ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
440843a741389226f5f2d0ce8636cd57532be9b7e4dJens Axboe	if (strncmp(p, name, strlen(name)))
441843a741389226f5f2d0ce8636cd57532be9b7e4dJens Axboe		return 1;
442843a741389226f5f2d0ce8636cd57532be9b7e4dJens Axboe
443843a741389226f5f2d0ce8636cd57532be9b7e4dJens Axboe	s = strstr(p, name);
444ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (!s)
445ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 1;
446ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
447f5d3e5ec43653859e744225cc585757e77e4dbdcJens Axboe	s = strchr(s, '=');
448ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (!s)
449ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 1;
450ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
451ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	s++;
452ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	strip_blank_front(&s);
453ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return cb(td, s);
454ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
455ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
456ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboestatic int check_strstore(char *p, char *name, char *dest)
457ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
458843a741389226f5f2d0ce8636cd57532be9b7e4dJens Axboe	char *s;
459ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
460843a741389226f5f2d0ce8636cd57532be9b7e4dJens Axboe	if (strncmp(p, name, strlen(name)))
461843a741389226f5f2d0ce8636cd57532be9b7e4dJens Axboe		return 1;
462843a741389226f5f2d0ce8636cd57532be9b7e4dJens Axboe
463843a741389226f5f2d0ce8636cd57532be9b7e4dJens Axboe	s = strstr(p, name);
464ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (!s)
465ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 1;
466ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
467f5d3e5ec43653859e744225cc585757e77e4dbdcJens Axboe	s = strchr(p, '=');
468ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (!s)
469ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 1;
470ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
471ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	s++;
472ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	strip_blank_front(&s);
473ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
474ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	strcpy(dest, s);
475ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return 0;
476ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
477ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
478906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboestatic int __check_range_bytes(char *str, unsigned long *val)
479ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
48001617be6d951cf10dd92783e61b4393404544e47Jens Axboe	char suffix;
481ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
48201617be6d951cf10dd92783e61b4393404544e47Jens Axboe	if (sscanf(str, "%lu%c", val, &suffix) == 2) {
483906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe		*val *= get_mult_bytes(suffix);
484ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 0;
485ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	}
486ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
48701617be6d951cf10dd92783e61b4393404544e47Jens Axboe	if (sscanf(str, "%lu", val) == 1)
488ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 0;
489ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
49001617be6d951cf10dd92783e61b4393404544e47Jens Axboe	return 1;
49101617be6d951cf10dd92783e61b4393404544e47Jens Axboe}
49201617be6d951cf10dd92783e61b4393404544e47Jens Axboe
493906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboestatic int check_range_bytes(char *p, char *name, unsigned long *s,
494906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe			     unsigned long *e)
49501617be6d951cf10dd92783e61b4393404544e47Jens Axboe{
49601617be6d951cf10dd92783e61b4393404544e47Jens Axboe	char option[128];
49701617be6d951cf10dd92783e61b4393404544e47Jens Axboe	char *str, *p1, *p2;
49801617be6d951cf10dd92783e61b4393404544e47Jens Axboe
499843a741389226f5f2d0ce8636cd57532be9b7e4dJens Axboe	if (strncmp(p, name, strlen(name)))
500843a741389226f5f2d0ce8636cd57532be9b7e4dJens Axboe		return 1;
501843a741389226f5f2d0ce8636cd57532be9b7e4dJens Axboe
50201617be6d951cf10dd92783e61b4393404544e47Jens Axboe	strcpy(option, p);
50301617be6d951cf10dd92783e61b4393404544e47Jens Axboe	p = option;
50401617be6d951cf10dd92783e61b4393404544e47Jens Axboe
50501617be6d951cf10dd92783e61b4393404544e47Jens Axboe	str = strstr(p, name);
50601617be6d951cf10dd92783e61b4393404544e47Jens Axboe	if (!str)
50701617be6d951cf10dd92783e61b4393404544e47Jens Axboe		return 1;
508ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
50901617be6d951cf10dd92783e61b4393404544e47Jens Axboe	p += strlen(name);
51001617be6d951cf10dd92783e61b4393404544e47Jens Axboe
51101617be6d951cf10dd92783e61b4393404544e47Jens Axboe	str = strchr(p, '=');
51201617be6d951cf10dd92783e61b4393404544e47Jens Axboe	if (!str)
51301617be6d951cf10dd92783e61b4393404544e47Jens Axboe		return 1;
51401617be6d951cf10dd92783e61b4393404544e47Jens Axboe
51501617be6d951cf10dd92783e61b4393404544e47Jens Axboe	/*
51601617be6d951cf10dd92783e61b4393404544e47Jens Axboe	 * 'p' now holds whatever is after the '=' sign
51701617be6d951cf10dd92783e61b4393404544e47Jens Axboe	 */
51801617be6d951cf10dd92783e61b4393404544e47Jens Axboe	p1 = str + 1;
51901617be6d951cf10dd92783e61b4393404544e47Jens Axboe
52001617be6d951cf10dd92783e61b4393404544e47Jens Axboe	/*
52101617be6d951cf10dd92783e61b4393404544e47Jens Axboe	 * terminate p1 at the '-' sign
52201617be6d951cf10dd92783e61b4393404544e47Jens Axboe	 */
52301617be6d951cf10dd92783e61b4393404544e47Jens Axboe	p = strchr(p1, '-');
52401617be6d951cf10dd92783e61b4393404544e47Jens Axboe	if (!p)
52501617be6d951cf10dd92783e61b4393404544e47Jens Axboe		return 1;
52601617be6d951cf10dd92783e61b4393404544e47Jens Axboe
52701617be6d951cf10dd92783e61b4393404544e47Jens Axboe	p2 = p + 1;
52801617be6d951cf10dd92783e61b4393404544e47Jens Axboe	*p = '\0';
52901617be6d951cf10dd92783e61b4393404544e47Jens Axboe
530906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe	if (!__check_range_bytes(p1, s) && !__check_range_bytes(p2, e))
531ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 0;
532ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
533ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return 1;
534ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
535ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
536ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboestatic int check_int(char *p, char *name, unsigned int *val)
537ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
538f5d3e5ec43653859e744225cc585757e77e4dbdcJens Axboe	char *str;
539ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
540b6754f9d3f719627d8aae4c3e8f39212d9405f99Jens Axboe	if (strncmp(p, name, strlen(name)))
541b6754f9d3f719627d8aae4c3e8f39212d9405f99Jens Axboe		return 1;
542b6754f9d3f719627d8aae4c3e8f39212d9405f99Jens Axboe
543f5d3e5ec43653859e744225cc585757e77e4dbdcJens Axboe	str = strstr(p, name);
544f5d3e5ec43653859e744225cc585757e77e4dbdcJens Axboe	if (!str)
545f5d3e5ec43653859e744225cc585757e77e4dbdcJens Axboe		return 1;
546f5d3e5ec43653859e744225cc585757e77e4dbdcJens Axboe
547f5d3e5ec43653859e744225cc585757e77e4dbdcJens Axboe	str = strchr(p, '=');
548f5d3e5ec43653859e744225cc585757e77e4dbdcJens Axboe	if (!str)
549f5d3e5ec43653859e744225cc585757e77e4dbdcJens Axboe		return 1;
550f5d3e5ec43653859e744225cc585757e77e4dbdcJens Axboe
551f5d3e5ec43653859e744225cc585757e77e4dbdcJens Axboe	str++;
552ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
553f5d3e5ec43653859e744225cc585757e77e4dbdcJens Axboe	if (sscanf(str, "%u", val) == 1)
554ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 0;
555ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
556ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return 1;
557ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
558ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
559ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboestatic int check_strset(char *p, char *name)
560ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
561ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return strncmp(p, name, strlen(name));
562ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
563ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
564ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboestatic int is_empty_or_comment(char *line)
565ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
566ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	unsigned int i;
567ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
568ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	for (i = 0; i < strlen(line); i++) {
569ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		if (line[i] == ';')
570ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			return 1;
571ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		if (!isspace(line[i]) && !iscntrl(line[i]))
572ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			return 0;
573ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	}
574ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
575ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return 1;
576ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
577ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
578ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboestatic int str_rw_cb(struct thread_data *td, char *mem)
579ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
580ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (!strncmp(mem, "read", 4) || !strncmp(mem, "0", 1)) {
581ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		td->ddir = DDIR_READ;
582ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		td->sequential = 1;
583ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 0;
584ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	} else if (!strncmp(mem, "randread", 8)) {
585ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		td->ddir = DDIR_READ;
586ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		td->sequential = 0;
587ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 0;
588ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	} else if (!strncmp(mem, "write", 5) || !strncmp(mem, "1", 1)) {
589ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		td->ddir = DDIR_WRITE;
590ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		td->sequential = 1;
591ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 0;
592ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	} else if (!strncmp(mem, "randwrite", 9)) {
593ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		td->ddir = DDIR_WRITE;
594ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		td->sequential = 0;
595ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 0;
5963d60d1ed78b663659967e04cc92e1359bd50fb3aJens Axboe	} else if (!strncmp(mem, "rw", 2)) {
5973d60d1ed78b663659967e04cc92e1359bd50fb3aJens Axboe		td->ddir = 0;
5983d60d1ed78b663659967e04cc92e1359bd50fb3aJens Axboe		td->iomix = 1;
5993d60d1ed78b663659967e04cc92e1359bd50fb3aJens Axboe		td->sequential = 1;
6003d60d1ed78b663659967e04cc92e1359bd50fb3aJens Axboe		return 0;
6013d60d1ed78b663659967e04cc92e1359bd50fb3aJens Axboe	} else if (!strncmp(mem, "randrw", 6)) {
6023d60d1ed78b663659967e04cc92e1359bd50fb3aJens Axboe		td->ddir = 0;
6033d60d1ed78b663659967e04cc92e1359bd50fb3aJens Axboe		td->iomix = 1;
6043d60d1ed78b663659967e04cc92e1359bd50fb3aJens Axboe		td->sequential = 0;
6053d60d1ed78b663659967e04cc92e1359bd50fb3aJens Axboe		return 0;
606ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	}
607ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
6083b70d7e51e0b672a8b337c57c8faf865c0b7f415Jens Axboe	log_err("fio: data direction: read, write, randread, randwrite, rw, randrw\n");
609ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return 1;
610ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
611ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
612ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboestatic int str_verify_cb(struct thread_data *td, char *mem)
613ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
614ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (!strncmp(mem, "0", 1)) {
615ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		td->verify = VERIFY_NONE;
616ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 0;
617ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	} else if (!strncmp(mem, "md5", 3) || !strncmp(mem, "1", 1)) {
618ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		td->verify = VERIFY_MD5;
619ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 0;
620ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	} else if (!strncmp(mem, "crc32", 5)) {
621ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		td->verify = VERIFY_CRC32;
622ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 0;
623ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	}
624ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
6253b70d7e51e0b672a8b337c57c8faf865c0b7f415Jens Axboe	log_err("fio: verify types: md5, crc32\n");
626ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return 1;
627ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
628ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
629ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboestatic int str_mem_cb(struct thread_data *td, char *mem)
630ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
631ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (!strncmp(mem, "malloc", 6)) {
632ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		td->mem_type = MEM_MALLOC;
633ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 0;
634ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	} else if (!strncmp(mem, "shm", 3)) {
635ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		td->mem_type = MEM_SHM;
636ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 0;
637ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	} else if (!strncmp(mem, "mmap", 4)) {
638ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		td->mem_type = MEM_MMAP;
639ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 0;
640ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	}
641ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
6423b70d7e51e0b672a8b337c57c8faf865c0b7f415Jens Axboe	log_err("fio: mem type: malloc, shm, mmap\n");
643ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return 1;
644ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
645ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
646ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboestatic int str_ioengine_cb(struct thread_data *td, char *str)
647ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
6482866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe	td->io_ops = load_ioengine(td, str);
6492866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe	if (td->io_ops)
650b990b5c06801d6d25e3fcc5415efbbe7bb23341eJens Axboe		return 0;
651ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
652b990b5c06801d6d25e3fcc5415efbbe7bb23341eJens Axboe	log_err("fio: ioengine: { linuxaio, aio, libaio }, posixaio, sync, mmap, sgio, splice, cpu\n");
653ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return 1;
654ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
655ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
656072619835aa805f3335dca9d72f4d4eb1009aecdJens Axboe/*
657072619835aa805f3335dca9d72f4d4eb1009aecdJens Axboe * This is our [ini] type file parser.
658072619835aa805f3335dca9d72f4d4eb1009aecdJens Axboe */
6590c7e37a04aa04ba22e812f8de7971fcef46b8191Jens Axboeint parse_jobs_ini(char *file, int stonewall_flag)
660ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
661a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe	unsigned int prioclass, prio, cpu, global, il;
662ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	unsigned long long ull;
663ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	unsigned long ul1, ul2;
664ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	struct thread_data *td;
665ef899b6393c43abd655ad2cbc22de18b88a101f8Jens Axboe	char *string, *name, *tmpbuf;
666ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	fpos_t off;
667ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	FILE *f;
668ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	char *p;
6690c7e37a04aa04ba22e812f8de7971fcef46b8191Jens Axboe	int ret = 0, stonewall;
670ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
671ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	f = fopen(file, "r");
672ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (!f) {
673aea47d444b02bd7c622f82bb73151fd7136a499fJens Axboe		perror("fopen job file");
674ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 1;
675ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	}
676ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
677ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	string = malloc(4096);
678ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	name = malloc(256);
679ef899b6393c43abd655ad2cbc22de18b88a101f8Jens Axboe	tmpbuf = malloc(4096);
680ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
6810c7e37a04aa04ba22e812f8de7971fcef46b8191Jens Axboe	stonewall = stonewall_flag;
682ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	while ((p = fgets(string, 4096, f)) != NULL) {
68345410acb636e526575d62a037f81ade7916b738cJens Axboe		if (ret)
68445410acb636e526575d62a037f81ade7916b738cJens Axboe			break;
685ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		if (is_empty_or_comment(p))
686ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			continue;
687ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		if (sscanf(p, "[%s]", name) != 1)
688ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			continue;
689ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
690ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		global = !strncmp(name, "global", 6);
691ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
692ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		name[strlen(name) - 1] = '\0';
693ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
694ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		td = get_new_job(global, &def_thread);
69545410acb636e526575d62a037f81ade7916b738cJens Axboe		if (!td) {
69645410acb636e526575d62a037f81ade7916b738cJens Axboe			ret = 1;
69745410acb636e526575d62a037f81ade7916b738cJens Axboe			break;
69845410acb636e526575d62a037f81ade7916b738cJens Axboe		}
699ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
700972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe		/*
701972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe		 * Seperate multiple job files by a stonewall
702972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe		 */
703f94819192600fe35d03ebed26a803abdc2b9864cJens Axboe		if (!global && stonewall) {
704972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe			td->stonewall = stonewall;
705972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe			stonewall = 0;
706972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe		}
707972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe
708ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		fgetpos(f, &off);
709ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		while ((p = fgets(string, 4096, f)) != NULL) {
710ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			if (is_empty_or_comment(p))
711ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
712ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			if (strstr(p, "["))
713ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				break;
714b6754f9d3f719627d8aae4c3e8f39212d9405f99Jens Axboe			strip_blank_front(&p);
7154ae3f76333bf2382e516db0b5c202b8982b1170fJens Axboe			strip_blank_end(p);
716aea47d444b02bd7c622f82bb73151fd7136a499fJens Axboe
717ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			if (!check_int(p, "prio", &prio)) {
718ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#ifndef FIO_HAVE_IOPRIO
7193b70d7e51e0b672a8b337c57c8faf865c0b7f415Jens Axboe				log_err("io priorities not available\n");
72045410acb636e526575d62a037f81ade7916b738cJens Axboe				ret = 1;
72145410acb636e526575d62a037f81ade7916b738cJens Axboe				break;
722ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#endif
7238756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe				td->ioprio |= prio;
724ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
725ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
726ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
727ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			if (!check_int(p, "prioclass", &prioclass)) {
728ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#ifndef FIO_HAVE_IOPRIO
7293b70d7e51e0b672a8b337c57c8faf865c0b7f415Jens Axboe				log_err("io priorities not available\n");
73045410acb636e526575d62a037f81ade7916b738cJens Axboe				ret = 1;
73145410acb636e526575d62a037f81ade7916b738cJens Axboe				break;
7325c4e1dbc4ec6ee963220c5f4e64a04cd6130dc81Jens Axboe#else
7338756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe				td->ioprio |= prioclass << IOPRIO_CLASS_SHIFT;
734ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
735ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
7365c4e1dbc4ec6ee963220c5f4e64a04cd6130dc81Jens Axboe#endif
737ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
738e9c047a0d8dfc32634b896e1600c6f1aa4174378Jens Axboe			if (!check_int(p, "direct", &il)) {
739e9c047a0d8dfc32634b896e1600c6f1aa4174378Jens Axboe				td->odirect = il;
740ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
741ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
742ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
7439ebc27e1352b905fe3396ce2350a7765fe9c57b8Jens Axboe			if (!check_int(p, "rand_repeatable", &il)) {
7449ebc27e1352b905fe3396ce2350a7765fe9c57b8Jens Axboe				td->rand_repeatable = il;
7459ebc27e1352b905fe3396ce2350a7765fe9c57b8Jens Axboe				fgetpos(f, &off);
7469ebc27e1352b905fe3396ce2350a7765fe9c57b8Jens Axboe				continue;
7479ebc27e1352b905fe3396ce2350a7765fe9c57b8Jens Axboe			}
748ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			if (!check_int(p, "rate", &td->rate)) {
749ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
750ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
751ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
752ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			if (!check_int(p, "ratemin", &td->ratemin)) {
753ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
754ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
755ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
756ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			if (!check_int(p, "ratecycle", &td->ratecycle)) {
757ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
758ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
759ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
760b990b5c06801d6d25e3fcc5415efbbe7bb23341eJens Axboe			if (!check_int(p, "cpuload", &td->cpuload)) {
761b990b5c06801d6d25e3fcc5415efbbe7bb23341eJens Axboe				fgetpos(f, &off);
762b990b5c06801d6d25e3fcc5415efbbe7bb23341eJens Axboe				continue;
763b990b5c06801d6d25e3fcc5415efbbe7bb23341eJens Axboe			}
764b990b5c06801d6d25e3fcc5415efbbe7bb23341eJens Axboe			if (!check_int(p, "cpuchunks", &td->cpucycle)) {
765b990b5c06801d6d25e3fcc5415efbbe7bb23341eJens Axboe				fgetpos(f, &off);
766b990b5c06801d6d25e3fcc5415efbbe7bb23341eJens Axboe				continue;
767b990b5c06801d6d25e3fcc5415efbbe7bb23341eJens Axboe			}
768ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			if (!check_int(p, "thinktime", &td->thinktime)) {
769ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
770ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
771ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
772ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			if (!check_int(p, "cpumask", &cpu)) {
773ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#ifndef FIO_HAVE_CPU_AFFINITY
7743b70d7e51e0b672a8b337c57c8faf865c0b7f415Jens Axboe				log_err("cpu affinity not available\n");
77545410acb636e526575d62a037f81ade7916b738cJens Axboe				ret = 1;
77645410acb636e526575d62a037f81ade7916b738cJens Axboe				break;
777ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#endif
778ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fill_cpu_mask(td->cpumask, cpu);
779ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
780ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
781ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
782ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			if (!check_int(p, "fsync", &td->fsync_blocks)) {
783ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
784fc1a471326fb5248a74ed3a206d37884b812c853Jens Axboe				td->end_fsync = 1;
785ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
786ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
787ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			if (!check_int(p, "startdelay", &td->start_delay)) {
788ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
789ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
790ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
791906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe			if (!check_str_time(p, "timeout", &ull)) {
792af959a78acda575cc7d3ffea0a8421e0574d0955Jens Axboe				td->timeout = ull;
793ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
794ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
795ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
796e9c047a0d8dfc32634b896e1600c6f1aa4174378Jens Axboe			if (!check_int(p, "invalidate", &il)) {
797e9c047a0d8dfc32634b896e1600c6f1aa4174378Jens Axboe				td->invalidate_cache = il;
798ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
799ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
800ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
801ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			if (!check_int(p, "iodepth", &td->iodepth)) {
802ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
803ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
804ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
805e9c047a0d8dfc32634b896e1600c6f1aa4174378Jens Axboe			if (!check_int(p, "sync", &il)) {
806e9c047a0d8dfc32634b896e1600c6f1aa4174378Jens Axboe				td->sync_io = il;
807ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
808ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
809ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
810ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			if (!check_int(p, "bwavgtime", &td->bw_avg_time)) {
811ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
812ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
813ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
814e9c047a0d8dfc32634b896e1600c6f1aa4174378Jens Axboe			if (!check_int(p, "create_serialize", &il)) {
815e9c047a0d8dfc32634b896e1600c6f1aa4174378Jens Axboe				td->create_serialize = il;
816ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
817ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
818ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
819e9c047a0d8dfc32634b896e1600c6f1aa4174378Jens Axboe			if (!check_int(p, "create_fsync", &il)) {
820e9c047a0d8dfc32634b896e1600c6f1aa4174378Jens Axboe				td->create_fsync = il;
821ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
822ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
823ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
824e9c047a0d8dfc32634b896e1600c6f1aa4174378Jens Axboe			if (!check_int(p, "end_fsync", &il)) {
825e9c047a0d8dfc32634b896e1600c6f1aa4174378Jens Axboe				td->end_fsync = il;
826fc1a471326fb5248a74ed3a206d37884b812c853Jens Axboe				fgetpos(f, &off);
827fc1a471326fb5248a74ed3a206d37884b812c853Jens Axboe				continue;
828fc1a471326fb5248a74ed3a206d37884b812c853Jens Axboe			}
829ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			if (!check_int(p, "loops", &td->loops)) {
830ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
831ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
832ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
833ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			if (!check_int(p, "numjobs", &td->numjobs)) {
834ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
835ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
836ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
837e9c047a0d8dfc32634b896e1600c6f1aa4174378Jens Axboe			if (!check_int(p, "overwrite", &il)) {
838e9c047a0d8dfc32634b896e1600c6f1aa4174378Jens Axboe				td->overwrite = il;
839ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
840ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
841ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
842a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe			if (!check_int(p, "rwmixcycle", &td->rwmixcycle)) {
843a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe				fgetpos(f, &off);
844a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe				continue;
845a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe			}
846a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe			if (!check_int(p, "rwmixread", &il)) {
847a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe				if (il > 100)
848a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe					il = 100;
849a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe				td->rwmixread = il;
850a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe				fgetpos(f, &off);
851a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe				continue;
852a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe			}
853a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe			if (!check_int(p, "rwmixwrite", &il)) {
854a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe				if (il > 100)
855a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe					il = 100;
856a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe				td->rwmixread = 100 - il;
857a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe				fgetpos(f, &off);
858a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe				continue;
859a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe			}
860b6f4d8804ad499adf10b4cad0657284a8a4a6287Jens Axboe			if (!check_int(p, "nice", &td->nice)) {
861b6f4d8804ad499adf10b4cad0657284a8a4a6287Jens Axboe				fgetpos(f, &off);
862b6f4d8804ad499adf10b4cad0657284a8a4a6287Jens Axboe				continue;
863b6f4d8804ad499adf10b4cad0657284a8a4a6287Jens Axboe			}
86453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			if (!check_int(p, "nrfiles", &td->nr_files)) {
86553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe				fgetpos(f, &off);
86653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe				continue;
86753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			}
868906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe			if (!check_range_bytes(p, "bsrange", &ul1, &ul2)) {
869ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				if (ul1 > ul2) {
870ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe					td->max_bs = ul1;
871ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe					td->min_bs = ul2;
872ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				} else {
873ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe					td->max_bs = ul2;
874ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe					td->min_bs = ul1;
875ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				}
876ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
877ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
878ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
879906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe			if (!check_str_bytes(p, "bs", &ull)) {
880ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				td->bs = ull;
881ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
882ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
883ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
88453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			if (!check_str_bytes(p, "size", &td->total_file_size)) {
885ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
886ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
887ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
88853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			if (!check_str_bytes(p, "offset", &td->start_offset)) {
889ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
89020dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe				continue;
89120dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe			}
892906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe			if (!check_str_bytes(p, "zonesize", &td->zone_size)) {
89320dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe				fgetpos(f, &off);
89420dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe				continue;
89520dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe			}
896906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe			if (!check_str_bytes(p, "zoneskip", &td->zone_skip)) {
89720dc95c47087d486b5d4608fc15b1c2021761923Jens Axboe				fgetpos(f, &off);
898ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
899ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
900906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe			if (!check_str_bytes(p, "lockmem", &mlock_size)) {
901c04f7ec3ecb8ce780bde6ad3515f003e6015c62aJens Axboe				fgetpos(f, &off);
902c04f7ec3ecb8ce780bde6ad3515f003e6015c62aJens Axboe				continue;
903c04f7ec3ecb8ce780bde6ad3515f003e6015c62aJens Axboe			}
904ef899b6393c43abd655ad2cbc22de18b88a101f8Jens Axboe			if (!check_strstore(p, "directory", tmpbuf)) {
905ef899b6393c43abd655ad2cbc22de18b88a101f8Jens Axboe				td->directory = strdup(tmpbuf);
906ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
907ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
908ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
90913f8e2d2e3e5ec7d8c18b70fb2a2e2a026190020Jens Axboe			if (!check_strstore(p, "filename", tmpbuf)) {
91013f8e2d2e3e5ec7d8c18b70fb2a2e2a026190020Jens Axboe				td->filename = strdup(tmpbuf);
91113f8e2d2e3e5ec7d8c18b70fb2a2e2a026190020Jens Axboe				fgetpos(f, &off);
91213f8e2d2e3e5ec7d8c18b70fb2a2e2a026190020Jens Axboe				continue;
91313f8e2d2e3e5ec7d8c18b70fb2a2e2a026190020Jens Axboe			}
91401452055af61d6f5de543575dba3ebb0c9e55fabJens Axboe			if (!check_strstore(p, "name", tmpbuf)) {
91501452055af61d6f5de543575dba3ebb0c9e55fabJens Axboe				snprintf(td->name, sizeof(td->name)-1, "%s%d", tmpbuf, td->thread_number);
91601452055af61d6f5de543575dba3ebb0c9e55fabJens Axboe				fgetpos(f, &off);
91701452055af61d6f5de543575dba3ebb0c9e55fabJens Axboe				continue;
91801452055af61d6f5de543575dba3ebb0c9e55fabJens Axboe			}
919ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			if (!check_str(p, "mem", str_mem_cb, td)) {
920ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
921ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
922ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
923ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			if (!check_str(p, "verify", str_verify_cb, td)) {
924ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
925ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
926ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
927ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			if (!check_str(p, "rw", str_rw_cb, td)) {
928ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
929ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
930ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
931ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			if (!check_str(p, "ioengine", str_ioengine_cb, td)) {
932ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
933ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
934ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
935ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			if (!check_strset(p, "exitall")) {
936ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				exitall_on_terminate = 1;
937ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
938ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
939ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
940ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			if (!check_strset(p, "stonewall")) {
941ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				td->stonewall = 1;
942ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
943ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
944ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
945ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			if (!check_strset(p, "thread")) {
946ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				td->use_thread = 1;
947ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				fgetpos(f, &off);
948ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				continue;
949ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			}
950f6cbb269c54ff40f3922818d42117f5a8026df36Jens Axboe			if (!check_strset(p, "unlink")) {
951f6cbb269c54ff40f3922818d42117f5a8026df36Jens Axboe				td->unlink = 1;
952f6cbb269c54ff40f3922818d42117f5a8026df36Jens Axboe				fgetpos(f, &off);
953f6cbb269c54ff40f3922818d42117f5a8026df36Jens Axboe				continue;
954f6cbb269c54ff40f3922818d42117f5a8026df36Jens Axboe			}
955ec94ec567cae47f91fa31a18250c2a7a0029d2adJens Axboe			if (!check_strset(p, "write_bw_log")) {
956ec94ec567cae47f91fa31a18250c2a7a0029d2adJens Axboe				td->write_bw_log = 1;
957ec94ec567cae47f91fa31a18250c2a7a0029d2adJens Axboe				fgetpos(f, &off);
958ec94ec567cae47f91fa31a18250c2a7a0029d2adJens Axboe				continue;
959ec94ec567cae47f91fa31a18250c2a7a0029d2adJens Axboe			}
960ec94ec567cae47f91fa31a18250c2a7a0029d2adJens Axboe			if (!check_strset(p, "write_lat_log")) {
961ec94ec567cae47f91fa31a18250c2a7a0029d2adJens Axboe				td->write_lat_log = 1;
962ec94ec567cae47f91fa31a18250c2a7a0029d2adJens Axboe				fgetpos(f, &off);
963ec94ec567cae47f91fa31a18250c2a7a0029d2adJens Axboe				continue;
964ec94ec567cae47f91fa31a18250c2a7a0029d2adJens Axboe			}
96580b9feb08908e0493825043f807fcbea4591e09bJens Axboe			if (!check_strstore(p, "iolog", tmpbuf)) {
9664f693b9de45f8fe4a893bd4c3de7c3dc17979386Jens Axboe				if (td->write_iolog) {
9673b70d7e51e0b672a8b337c57c8faf865c0b7f415Jens Axboe					log_err("fio: read iolog overrides given write_iolog\n");
968af8c0b4f06fa2ebb4eaeb4601b16e2ed08f2b845Jens Axboe					free(td->iolog_file);
9694f693b9de45f8fe4a893bd4c3de7c3dc17979386Jens Axboe					td->write_iolog = 0;
9704f693b9de45f8fe4a893bd4c3de7c3dc17979386Jens Axboe				}
97180b9feb08908e0493825043f807fcbea4591e09bJens Axboe				td->iolog_file = strdup(tmpbuf);
972843a741389226f5f2d0ce8636cd57532be9b7e4dJens Axboe				td->read_iolog = 1;
973843a741389226f5f2d0ce8636cd57532be9b7e4dJens Axboe				fgetpos(f, &off);
974843a741389226f5f2d0ce8636cd57532be9b7e4dJens Axboe				continue;
975843a741389226f5f2d0ce8636cd57532be9b7e4dJens Axboe			}
976af8c0b4f06fa2ebb4eaeb4601b16e2ed08f2b845Jens Axboe			if (!check_strstore(p, "write_iolog", tmpbuf)) {
977af8c0b4f06fa2ebb4eaeb4601b16e2ed08f2b845Jens Axboe				if (!td->read_iolog) {
978af8c0b4f06fa2ebb4eaeb4601b16e2ed08f2b845Jens Axboe					td->iolog_file = strdup(tmpbuf);
979af8c0b4f06fa2ebb4eaeb4601b16e2ed08f2b845Jens Axboe					td->write_iolog = 1;
9804f693b9de45f8fe4a893bd4c3de7c3dc17979386Jens Axboe				} else
9813b70d7e51e0b672a8b337c57c8faf865c0b7f415Jens Axboe					log_err("fio: read iolog overrides given write_iolog\n");
982aea47d444b02bd7c622f82bb73151fd7136a499fJens Axboe				fgetpos(f, &off);
983aea47d444b02bd7c622f82bb73151fd7136a499fJens Axboe				continue;
984aea47d444b02bd7c622f82bb73151fd7136a499fJens Axboe			}
98580b9feb08908e0493825043f807fcbea4591e09bJens Axboe			if (!check_strstore(p, "exec_prerun", tmpbuf)) {
98680b9feb08908e0493825043f807fcbea4591e09bJens Axboe				td->exec_prerun = strdup(tmpbuf);
9874e0ba8af8f0bfe0f194122661c8a659c2ac748e6Jens Axboe				fgetpos(f, &off);
9884e0ba8af8f0bfe0f194122661c8a659c2ac748e6Jens Axboe				continue;
9894e0ba8af8f0bfe0f194122661c8a659c2ac748e6Jens Axboe			}
99080b9feb08908e0493825043f807fcbea4591e09bJens Axboe			if (!check_strstore(p, "exec_postrun", tmpbuf)) {
99180b9feb08908e0493825043f807fcbea4591e09bJens Axboe				td->exec_postrun = strdup(tmpbuf);
9924e0ba8af8f0bfe0f194122661c8a659c2ac748e6Jens Axboe				fgetpos(f, &off);
9934e0ba8af8f0bfe0f194122661c8a659c2ac748e6Jens Axboe				continue;
9944e0ba8af8f0bfe0f194122661c8a659c2ac748e6Jens Axboe			}
99580b9feb08908e0493825043f807fcbea4591e09bJens Axboe			if (!check_strstore(p, "ioscheduler", tmpbuf)) {
99622f78b320a8d2ffa32b5736fe754c108a8d21525Jens Axboe#ifndef FIO_HAVE_IOSCHED_SWITCH
9973b70d7e51e0b672a8b337c57c8faf865c0b7f415Jens Axboe				log_err("io scheduler switching not available\n");
99822f78b320a8d2ffa32b5736fe754c108a8d21525Jens Axboe				ret = 1;
99922f78b320a8d2ffa32b5736fe754c108a8d21525Jens Axboe				break;
100022f78b320a8d2ffa32b5736fe754c108a8d21525Jens Axboe#else
100180b9feb08908e0493825043f807fcbea4591e09bJens Axboe				td->ioscheduler = strdup(tmpbuf);
1002da86774e5a002acf2c8d779b805305bc193fc0a5Jens Axboe				fgetpos(f, &off);
1003da86774e5a002acf2c8d779b805305bc193fc0a5Jens Axboe				continue;
100422f78b320a8d2ffa32b5736fe754c108a8d21525Jens Axboe#endif
1005da86774e5a002acf2c8d779b805305bc193fc0a5Jens Axboe			}
1006ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
100745410acb636e526575d62a037f81ade7916b738cJens Axboe			/*
100845410acb636e526575d62a037f81ade7916b738cJens Axboe			 * Don't break here, continue parsing options so we
100945410acb636e526575d62a037f81ade7916b738cJens Axboe			 * dump all the bad ones. Makes trial/error fixups
101045410acb636e526575d62a037f81ade7916b738cJens Axboe			 * easier on the user.
101145410acb636e526575d62a037f81ade7916b738cJens Axboe			 */
1012ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			printf("Client%d: bad option %s\n",td->thread_number,p);
101345410acb636e526575d62a037f81ade7916b738cJens Axboe			ret = 1;
1014ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		}
1015ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
101645410acb636e526575d62a037f81ade7916b738cJens Axboe		if (!ret) {
101745410acb636e526575d62a037f81ade7916b738cJens Axboe			fsetpos(f, &off);
101845410acb636e526575d62a037f81ade7916b738cJens Axboe			ret = add_job(td, name, 0);
101945410acb636e526575d62a037f81ade7916b738cJens Axboe		}
102045410acb636e526575d62a037f81ade7916b738cJens Axboe		if (ret)
102145410acb636e526575d62a037f81ade7916b738cJens Axboe			break;
1022ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	}
1023ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1024ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	free(string);
1025ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	free(name);
1026ef899b6393c43abd655ad2cbc22de18b88a101f8Jens Axboe	free(tmpbuf);
1027ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	fclose(f);
102845410acb636e526575d62a037f81ade7916b738cJens Axboe	return ret;
1029ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
1030ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1031ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboestatic int fill_def_thread(void)
1032ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
1033ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	memset(&def_thread, 0, sizeof(def_thread));
1034ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1035ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (fio_getaffinity(getpid(), &def_thread.cpumask) == -1) {
1036ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		perror("sched_getaffinity");
1037ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 1;
1038ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	}
1039ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1040ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	/*
1041ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	 * fill globals
1042ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	 */
1043ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	def_thread.ddir = DDIR_READ;
10443d60d1ed78b663659967e04cc92e1359bd50fb3aJens Axboe	def_thread.iomix = 0;
10459ebc27e1352b905fe3396ce2350a7765fe9c57b8Jens Axboe	def_thread.bs = DEF_BS;
1046ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	def_thread.min_bs = -1;
1047ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	def_thread.max_bs = -1;
10489ebc27e1352b905fe3396ce2350a7765fe9c57b8Jens Axboe	def_thread.odirect = DEF_ODIRECT;
1049ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	def_thread.ratecycle = DEF_RATE_CYCLE;
10509ebc27e1352b905fe3396ce2350a7765fe9c57b8Jens Axboe	def_thread.sequential = DEF_SEQUENTIAL;
1051972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe	def_thread.timeout = def_timeout;
1052ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	def_thread.overwrite = DEF_OVERWRITE;
1053ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	def_thread.invalidate_cache = DEF_INVALIDATE;
1054ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	def_thread.sync_io = DEF_SYNCIO;
1055ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	def_thread.mem_type = MEM_MALLOC;
1056ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	def_thread.bw_avg_time = DEF_BWAVGTIME;
1057ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	def_thread.create_serialize = DEF_CREATE_SER;
1058ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	def_thread.create_fsync = DEF_CREATE_FSYNC;
1059ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	def_thread.loops = DEF_LOOPS;
1060ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	def_thread.verify = DEF_VERIFY;
1061ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	def_thread.stonewall = DEF_STONEWALL;
1062ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	def_thread.numjobs = DEF_NUMJOBS;
1063ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	def_thread.use_thread = DEF_USE_THREAD;
1064a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe	def_thread.rwmixcycle = DEF_RWMIX_CYCLE;
1065a6ccc7be771650f903ea77ace2a1af593622c0f4Jens Axboe	def_thread.rwmixread = DEF_RWMIX_READ;
1066b6f4d8804ad499adf10b4cad0657284a8a4a6287Jens Axboe	def_thread.nice = DEF_NICE;
10679ebc27e1352b905fe3396ce2350a7765fe9c57b8Jens Axboe	def_thread.rand_repeatable = DEF_RAND_REPEAT;
106853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	def_thread.nr_files = DEF_NR_FILES;
1069f6cbb269c54ff40f3922818d42117f5a8026df36Jens Axboe	def_thread.unlink = DEF_UNLINK;
1070ec94ec567cae47f91fa31a18250c2a7a0029d2adJens Axboe	def_thread.write_bw_log = write_bw_log;
1071ec94ec567cae47f91fa31a18250c2a7a0029d2adJens Axboe	def_thread.write_lat_log = write_lat_log;
1072ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#ifdef FIO_HAVE_DISK_UTIL
1073ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	def_thread.do_disk_util = 1;
1074ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#endif
1075ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1076ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return 0;
1077ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
1078ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
10790ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboestatic void usage(void)
10804785f99523f5c69635eb4bd826f25cd2e264cda7Jens Axboe{
10814785f99523f5c69635eb4bd826f25cd2e264cda7Jens Axboe	printf("%s\n", fio_version_string);
108247623c728080867966cc692ee85308f1b6afc38dJens Axboe	printf("\t-o Write output to file\n");
10834785f99523f5c69635eb4bd826f25cd2e264cda7Jens Axboe	printf("\t-t Runtime in seconds\n");
10844785f99523f5c69635eb4bd826f25cd2e264cda7Jens Axboe	printf("\t-l Generate per-job latency logs\n");
10854785f99523f5c69635eb4bd826f25cd2e264cda7Jens Axboe	printf("\t-w Generate per-job bandwidth logs\n");
1086c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe	printf("\t-m Minimal (terse) output\n");
10874785f99523f5c69635eb4bd826f25cd2e264cda7Jens Axboe	printf("\t-v Print version info and exit\n");
10884785f99523f5c69635eb4bd826f25cd2e264cda7Jens Axboe}
10894785f99523f5c69635eb4bd826f25cd2e264cda7Jens Axboe
1090972cfd2546081c0397447ca9243ea419b1ff579aJens Axboestatic int parse_cmd_line(int argc, char *argv[])
1091ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
1092972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe	int c, idx = 1, ini_idx = 0;
1093ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
10942e77841b9bc7f99ffd1caa2c2c84af2a66731658Jens Axboe	while ((c = getopt(argc, argv, "t:o:lwvhm")) != EOF) {
1095ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		switch (c) {
1096ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			case 't':
1097972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe				def_timeout = atoi(optarg);
1098774a617767830b5023f6cad4a45609a92ec82d41Jens Axboe				idx = optind;
1099ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				break;
1100ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			case 'l':
1101ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				write_lat_log = 1;
1102774a617767830b5023f6cad4a45609a92ec82d41Jens Axboe				idx = optind;
1103ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				break;
1104ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			case 'w':
1105ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				write_bw_log = 1;
1106774a617767830b5023f6cad4a45609a92ec82d41Jens Axboe				idx = optind;
1107ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				break;
11089ebc27e1352b905fe3396ce2350a7765fe9c57b8Jens Axboe			case 'o':
1109eb8bbf48e79a8c6afd3c84e3d64263d10ee45daaJens Axboe				f_out = fopen(optarg, "w+");
1110eb8bbf48e79a8c6afd3c84e3d64263d10ee45daaJens Axboe				if (!f_out) {
1111eb8bbf48e79a8c6afd3c84e3d64263d10ee45daaJens Axboe					perror("fopen output");
1112eb8bbf48e79a8c6afd3c84e3d64263d10ee45daaJens Axboe					exit(1);
1113eb8bbf48e79a8c6afd3c84e3d64263d10ee45daaJens Axboe				}
1114eb8bbf48e79a8c6afd3c84e3d64263d10ee45daaJens Axboe				f_err = f_out;
1115774a617767830b5023f6cad4a45609a92ec82d41Jens Axboe				idx = optind;
1116eb8bbf48e79a8c6afd3c84e3d64263d10ee45daaJens Axboe				break;
1117c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe			case 'm':
1118c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe				terse_output = 1;
1119774a617767830b5023f6cad4a45609a92ec82d41Jens Axboe				idx = optind;
1120c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe				break;
11214785f99523f5c69635eb4bd826f25cd2e264cda7Jens Axboe			case 'h':
11220ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe				usage();
11234785f99523f5c69635eb4bd826f25cd2e264cda7Jens Axboe				exit(0);
1124ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			case 'v':
1125ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				printf("%s\n", fio_version_string);
1126ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe				exit(0);
1127ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		}
1128ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	}
1129c9fad893e8333682d6ab67a269b0dd74f303c5bcJens Axboe
1130972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe	while (idx < argc) {
1131972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe		ini_idx++;
1132972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe		ini_file = realloc(ini_file, ini_idx * sizeof(char *));
1133972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe		ini_file[ini_idx - 1] = strdup(argv[idx]);
1134972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe		idx++;
1135972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe	}
1136774a617767830b5023f6cad4a45609a92ec82d41Jens Axboe
1137eb8bbf48e79a8c6afd3c84e3d64263d10ee45daaJens Axboe	if (!f_out) {
1138eb8bbf48e79a8c6afd3c84e3d64263d10ee45daaJens Axboe		f_out = stdout;
1139eb8bbf48e79a8c6afd3c84e3d64263d10ee45daaJens Axboe		f_err = stderr;
1140eb8bbf48e79a8c6afd3c84e3d64263d10ee45daaJens Axboe	}
1141972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe
1142972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe	return ini_idx;
1143ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
1144ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1145ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboestatic void free_shm(void)
1146ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
1147ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	struct shmid_ds sbuf;
1148ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1149ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (threads) {
11502c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe		shmdt((void *) threads);
1151ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		threads = NULL;
1152ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		shmctl(shm_id, IPC_RMID, &sbuf);
1153ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	}
1154ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
1155ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1156906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe/*
1157906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe * The thread area is shared between the main process and the job
1158906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe * threads/processes. So setup a shared memory segment that will hold
1159906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe * all the job info.
1160906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe */
1161ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboestatic int setup_thread_area(void)
1162ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
1163ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	/*
1164ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	 * 1024 is too much on some machines, scale max_jobs if
1165ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	 * we get a failure that looks like too large a shm segment
1166ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	 */
1167ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	do {
1168906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe		size_t size = max_jobs * sizeof(struct thread_data);
1169ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1170906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe		shm_id = shmget(0, size, IPC_CREAT | 0600);
1171ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		if (shm_id != -1)
1172ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			break;
1173ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		if (errno != EINVAL) {
1174ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			perror("shmget");
1175ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe			break;
1176ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		}
1177ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1178ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		max_jobs >>= 1;
1179ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	} while (max_jobs);
1180ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1181ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (shm_id == -1)
1182ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 1;
1183ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1184ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	threads = shmat(shm_id, NULL, 0);
1185ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (threads == (void *) -1) {
1186ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		perror("shmat");
1187ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 1;
1188ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	}
1189ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1190ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	atexit(free_shm);
1191ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return 0;
1192ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
1193ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1194ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboeint parse_options(int argc, char *argv[])
1195ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
1196972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe	int job_files, i;
1197972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe
1198ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (setup_thread_area())
1199ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 1;
1200ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (fill_def_thread())
1201ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 1;
1202ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1203972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe	job_files = parse_cmd_line(argc, argv);
1204972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe	if (!job_files) {
1205972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe		log_err("Need job file(s)\n");
12060ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe		usage();
1207ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 1;
1208ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	}
1209ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1210972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe	for (i = 0; i < job_files; i++) {
1211972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe		if (fill_def_thread())
1212972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe			return 1;
12130c7e37a04aa04ba22e812f8de7971fcef46b8191Jens Axboe		if (parse_jobs_ini(ini_file[i], i))
1214972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe			return 1;
121588c6ed8085efd1403fd34072311991cb666a5b9eJens Axboe		free(ini_file[i]);
1216972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe	}
1217ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
121888c6ed8085efd1403fd34072311991cb666a5b9eJens Axboe	free(ini_file);
1219ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return 0;
1220ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
1221