summaryrefslogtreecommitdiff
path: root/options.h
blob: 36fd35d2f6e72ed67f316b8fe4c317f89b751eff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#ifndef FIO_OPTION_H
#define FIO_OPTION_H

#define FIO_MAX_OPTS		512

#include <string.h>
#include "parse.h"
#include "flist.h"

#define td_var_offset(var)	((size_t) &((struct thread_options *)0)->var)

int add_option(struct fio_option *);
void invalidate_profile_options(const char *);
extern char *exec_profile;

void add_opt_posval(const char *, const char *, const char *);
void del_opt_posval(const char *, const char *);
struct thread_data;
void fio_options_free(struct thread_data *);
char *get_name_idx(char *, int);
int set_name_idx(char *, char *, int);

extern struct fio_option fio_options[FIO_MAX_OPTS];

extern int __fio_option_is_set(struct thread_options *, unsigned int off);

#define fio_option_is_set(__td, name)					\
({									\
	const unsigned int off = td_var_offset(name);			\
	int __r = __fio_option_is_set((__td), off);			\
	if (__r == -1) {						\
		dprint(FD_PARSE, "option %s/%u not found in map\n",	\
				__fio_stringify(name), off);		\
		__r = 0;						\
	}								\
	__r;								\
})

extern void fio_option_mark_set(struct thread_options *, struct fio_option *);

static inline int o_match(struct fio_option *o, const char *opt)
{
	if (!strcmp(o->name, opt))
		return 1;
	else if (o->alias && !strcmp(o->alias, opt))
		return 1;

	return 0;
}

static inline struct fio_option *find_option(struct fio_option *options,
					     const char *opt)
{
	struct fio_option *o;

	for (o = &options[0]; o->name; o++)
		if (o_match(o, opt))
			return o;

	return NULL;
}

struct opt_group {
	const char *name;
	unsigned int mask;
};

enum opt_category {
	__FIO_OPT_C_GENERAL	= 0,
	__FIO_OPT_C_IO,
	__FIO_OPT_C_FILE,
	__FIO_OPT_C_STAT,
	__FIO_OPT_C_LOG,
	__FIO_OPT_C_PROFILE,
	__FIO_OPT_C_ENGINE,
	__FIO_OPT_C_NR,

	FIO_OPT_C_GENERAL	= (1U << __FIO_OPT_C_GENERAL),
	FIO_OPT_C_IO		= (1U << __FIO_OPT_C_IO),
	FIO_OPT_C_FILE		= (1U << __FIO_OPT_C_FILE),
	FIO_OPT_C_STAT		= (1U << __FIO_OPT_C_STAT),
	FIO_OPT_C_LOG		= (1U << __FIO_OPT_C_LOG),
	FIO_OPT_C_PROFILE	= (1U << __FIO_OPT_C_PROFILE),
	FIO_OPT_C_ENGINE	= (1U << __FIO_OPT_C_ENGINE),
	FIO_OPT_C_INVALID	= (1U << __FIO_OPT_C_NR),
};

enum opt_category_group {
	__FIO_OPT_G_RATE	= 0,
	__FIO_OPT_G_ZONE,
	__FIO_OPT_G_RWMIX,
	__FIO_OPT_G_VERIFY,
	__FIO_OPT_G_TRIM,
	__FIO_OPT_G_IOLOG,
	__FIO_OPT_G_IO_DEPTH,
	__FIO_OPT_G_IO_FLOW,
	__FIO_OPT_G_DESC,
	__FIO_OPT_G_FILENAME,
	__FIO_OPT_G_IO_BASIC,
	__FIO_OPT_G_CGROUP,
	__FIO_OPT_G_RUNTIME,
	__FIO_OPT_G_PROCESS,
	__FIO_OPT_G_CRED,
	__FIO_OPT_G_CLOCK,
	__FIO_OPT_G_IO_TYPE,
	__FIO_OPT_G_THINKTIME,
	__FIO_OPT_G_RANDOM,
	__FIO_OPT_G_IO_BUF,
	__FIO_OPT_G_TIOBENCH,
	__FIO_OPT_G_ERR,
	__FIO_OPT_G_E4DEFRAG,
	__FIO_OPT_G_NETIO,
	__FIO_OPT_G_LIBAIO,
	__FIO_OPT_G_ACT,
	__FIO_OPT_G_LATPROF,
        __FIO_OPT_G_RBD,
        __FIO_OPT_G_GFAPI,
	__FIO_OPT_G_NR,

	FIO_OPT_G_RATE		= (1U << __FIO_OPT_G_RATE),
	FIO_OPT_G_ZONE		= (1U << __FIO_OPT_G_ZONE),
	FIO_OPT_G_RWMIX		= (1U << __FIO_OPT_G_RWMIX),
	FIO_OPT_G_VERIFY	= (1U << __FIO_OPT_G_VERIFY),
	FIO_OPT_G_TRIM		= (1U << __FIO_OPT_G_TRIM),
	FIO_OPT_G_IOLOG		= (1U << __FIO_OPT_G_IOLOG),
	FIO_OPT_G_IO_DEPTH	= (1U << __FIO_OPT_G_IO_DEPTH),
	FIO_OPT_G_IO_FLOW	= (1U << __FIO_OPT_G_IO_FLOW),
	FIO_OPT_G_DESC		= (1U << __FIO_OPT_G_DESC),
	FIO_OPT_G_FILENAME	= (1U << __FIO_OPT_G_FILENAME),
	FIO_OPT_G_IO_BASIC	= (1U << __FIO_OPT_G_IO_BASIC),
	FIO_OPT_G_CGROUP	= (1U << __FIO_OPT_G_CGROUP),
	FIO_OPT_G_RUNTIME	= (1U << __FIO_OPT_G_RUNTIME),
	FIO_OPT_G_PROCESS	= (1U << __FIO_OPT_G_PROCESS),
	FIO_OPT_G_CRED		= (1U << __FIO_OPT_G_CRED),
	FIO_OPT_G_CLOCK		= (1U << __FIO_OPT_G_CLOCK),
	FIO_OPT_G_IO_TYPE	= (1U << __FIO_OPT_G_IO_TYPE),
	FIO_OPT_G_THINKTIME	= (1U << __FIO_OPT_G_THINKTIME),
	FIO_OPT_G_RANDOM	= (1U << __FIO_OPT_G_RANDOM),
	FIO_OPT_G_IO_BUF	= (1U << __FIO_OPT_G_IO_BUF),
	FIO_OPT_G_TIOBENCH	= (1U << __FIO_OPT_G_TIOBENCH),
	FIO_OPT_G_ERR		= (1U << __FIO_OPT_G_ERR),
	FIO_OPT_G_E4DEFRAG	= (1U << __FIO_OPT_G_E4DEFRAG),
	FIO_OPT_G_NETIO		= (1U << __FIO_OPT_G_NETIO),
	FIO_OPT_G_LIBAIO	= (1U << __FIO_OPT_G_LIBAIO),
	FIO_OPT_G_ACT		= (1U << __FIO_OPT_G_ACT),
	FIO_OPT_G_LATPROF	= (1U << __FIO_OPT_G_LATPROF),
	FIO_OPT_G_RBD		= (1U << __FIO_OPT_G_RBD),
	FIO_OPT_G_GFAPI		= (1U << __FIO_OPT_G_GFAPI),
	FIO_OPT_G_INVALID	= (1U << __FIO_OPT_G_NR),
};

extern struct opt_group *opt_group_from_mask(unsigned int *mask);
extern struct opt_group *opt_group_cat_from_mask(unsigned int *mask);
extern struct fio_option *fio_option_find(const char *name);
extern unsigned int fio_get_kb_base(void *);

#endif