179d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe#include "../fio.h"
279d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe#include "../profile.h"
3e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe#include "../parse.h"
4e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe
52363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboestatic unsigned long long size;
62363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboestatic unsigned int loops = 1;
72363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboestatic unsigned int bs = 4096;
82363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboestatic unsigned int nthreads = 1;
9e2de69dac799a1eecac1b52085f908729591ef5aJens Axboestatic char *dir;
1079d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe
1110aa136bddbaa7c845ab4eacb4a9a4a88d6657a3Jens Axboestatic char sz_idx[80], bs_idx[80], loop_idx[80], dir_idx[80], t_idx[80];
122363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe
1379d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboestatic const char *tb_opts[] = {
142363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe	"buffered=0", sz_idx, bs_idx, loop_idx, dir_idx, t_idx,
152363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe	"timeout=600", "group_reporting", "thread", "overwrite=1",
1679d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe	"filename=.fio.tio.1:.fio.tio.2:.fio.tio.3:.fio.tio.4",
17774a99b533369dc8d35c6cd09223255760cde9baJens Axboe	"ioengine=sync",
1879d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe	"name=seqwrite", "rw=write", "end_fsync=1",
1979d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe	"name=randwrite", "stonewall", "rw=randwrite", "end_fsync=1",
2079d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe	"name=seqread", "stonewall", "rw=read",
2179d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe	"name=randread", "stonewall", "rw=randread", NULL,
2279d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe};
2379d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe
247b504eddc4b039f2db3a0626bd08f880c5f4de27Jens Axboestruct tiobench_options {
257b504eddc4b039f2db3a0626bd08f880c5f4de27Jens Axboe	unsigned int pad;
267b504eddc4b039f2db3a0626bd08f880c5f4de27Jens Axboe	unsigned long long size;
277b504eddc4b039f2db3a0626bd08f880c5f4de27Jens Axboe	unsigned int loops;
287b504eddc4b039f2db3a0626bd08f880c5f4de27Jens Axboe	unsigned int bs;
297b504eddc4b039f2db3a0626bd08f880c5f4de27Jens Axboe	unsigned int nthreads;
307b504eddc4b039f2db3a0626bd08f880c5f4de27Jens Axboe	char *dir;
317b504eddc4b039f2db3a0626bd08f880c5f4de27Jens Axboe};
327b504eddc4b039f2db3a0626bd08f880c5f4de27Jens Axboe
337b504eddc4b039f2db3a0626bd08f880c5f4de27Jens Axboestatic struct tiobench_options tiobench_options;
347b504eddc4b039f2db3a0626bd08f880c5f4de27Jens Axboe
35e2de69dac799a1eecac1b52085f908729591ef5aJens Axboestatic struct fio_option options[] = {
36e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe	{
37e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe		.name	= "size",
38e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		.lname	= "Tiobench size",
392363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe		.type	= FIO_OPT_STR_VAL,
407b504eddc4b039f2db3a0626bd08f880c5f4de27Jens Axboe		.off1	= offsetof(struct tiobench_options, size),
41e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe		.help	= "Size in MB",
4213fca827b9c2bb71358fcaa3a7e6e89419d5b1b8Jens Axboe		.category = FIO_OPT_C_PROFILE,
4313fca827b9c2bb71358fcaa3a7e6e89419d5b1b8Jens Axboe		.group	= FIO_OPT_G_TIOBENCH,
44e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe	},
45e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe	{
46e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe		.name	= "block",
47e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		.lname	= "Tiobench block",
48e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe		.type	= FIO_OPT_INT,
497b504eddc4b039f2db3a0626bd08f880c5f4de27Jens Axboe		.off1	= offsetof(struct tiobench_options, bs),
50e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe		.help	= "Block size in bytes",
51e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe		.def	= "4k",
5213fca827b9c2bb71358fcaa3a7e6e89419d5b1b8Jens Axboe		.category = FIO_OPT_C_PROFILE,
5313fca827b9c2bb71358fcaa3a7e6e89419d5b1b8Jens Axboe		.group	= FIO_OPT_G_TIOBENCH,
54e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe	},
55e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe	{
56e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe		.name	= "numruns",
57e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		.lname	= "Tiobench numruns",
58e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe		.type	= FIO_OPT_INT,
597b504eddc4b039f2db3a0626bd08f880c5f4de27Jens Axboe		.off1	= offsetof(struct tiobench_options, loops),
60e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe		.help	= "Number of runs",
6113fca827b9c2bb71358fcaa3a7e6e89419d5b1b8Jens Axboe		.category = FIO_OPT_C_PROFILE,
6213fca827b9c2bb71358fcaa3a7e6e89419d5b1b8Jens Axboe		.group	= FIO_OPT_G_TIOBENCH,
63e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe	},
64e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe	{
65e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe		.name	= "dir",
66e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		.lname	= "Tiobench directory",
67e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe		.type	= FIO_OPT_STR_STORE,
687b504eddc4b039f2db3a0626bd08f880c5f4de27Jens Axboe		.off1	= offsetof(struct tiobench_options, dir),
69e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe		.help	= "Test directory",
7013fca827b9c2bb71358fcaa3a7e6e89419d5b1b8Jens Axboe		.category = FIO_OPT_C_PROFILE,
7113fca827b9c2bb71358fcaa3a7e6e89419d5b1b8Jens Axboe		.group	= FIO_OPT_G_TIOBENCH,
72e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe	},
73e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe	{
742363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe		.name	= "threads",
75e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		.lname	= "Tiobench threads",
762363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe		.type	= FIO_OPT_INT,
777b504eddc4b039f2db3a0626bd08f880c5f4de27Jens Axboe		.off1	= offsetof(struct tiobench_options, nthreads),
782363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe		.help	= "Number of Threads",
7913fca827b9c2bb71358fcaa3a7e6e89419d5b1b8Jens Axboe		.category = FIO_OPT_C_PROFILE,
8013fca827b9c2bb71358fcaa3a7e6e89419d5b1b8Jens Axboe		.group	= FIO_OPT_G_TIOBENCH,
812363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe	},
822363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe	{
83e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe		.name	= NULL,
84e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe	},
85e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe};
86e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe
872363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe/*
882363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe * Fill our private options into the command line
892363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe */
90d4afedfd152cea890ffa7d45bf1664fb70218c45Jens Axboestatic int tb_prep_cmdline(void)
912363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe{
922363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe	/*
932363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe	 * tiobench uses size as MB, so multiply up
942363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe	 */
952363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe	size *= 1024 * 1024ULL;
962363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe	if (size)
972363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe		sprintf(sz_idx, "size=%llu", size);
982363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe	else
992363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe		strcpy(sz_idx, "size=4*1024*$mb_memory");
1002363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe
1012363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe	sprintf(bs_idx, "bs=%u", bs);
1022363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe	sprintf(loop_idx, "loops=%u", loops);
1032363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe
1042363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe	if (dir)
1052363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe		sprintf(dir_idx, "directory=%s", dir);
1062363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe	else
1072363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe		sprintf(dir_idx, "directory=./");
1082363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe
1092363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe	sprintf(t_idx, "numjobs=%u", nthreads);
110d4afedfd152cea890ffa7d45bf1664fb70218c45Jens Axboe	return 0;
1112363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe}
1122363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe
11379d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboestatic struct profile_ops tiobench_profile = {
11479d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe	.name		= "tiobench",
115f5b6bb85364fcb8b2ac8d922ca65afd9dfabc9bbJens Axboe	.desc		= "tiotest/tiobench benchmark",
1162363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe	.prep_cmd	= tb_prep_cmdline,
1172363d8df7c0c6fe0613dc8e7ae2fa6f098cbc0d8Jens Axboe	.cmdline	= tb_opts,
1187b504eddc4b039f2db3a0626bd08f880c5f4de27Jens Axboe	.options	= options,
1197b504eddc4b039f2db3a0626bd08f880c5f4de27Jens Axboe	.opt_data	= &tiobench_options,
12079d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe};
12179d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe
12279d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboestatic void fio_init tiobench_register(void)
12379d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe{
12407b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboe	if (register_profile(&tiobench_profile))
12507b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboe		log_err("fio: failed to register profile 'tiobench'\n");
12679d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe}
12779d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe
12879d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboestatic void fio_exit tiobench_unregister(void)
12979d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe{
13079d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe	unregister_profile(&tiobench_profile);
13179d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe}
132