• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <stdio.h>
2 #include <inttypes.h>
3 #include "optgroup.h"
4 
5 /*
6  * Option grouping
7  */
8 static const struct opt_group fio_opt_groups[] = {
9 	{
10 		.name	= "General",
11 		.mask	= FIO_OPT_C_GENERAL,
12 	},
13 	{
14 		.name	= "I/O",
15 		.mask	= FIO_OPT_C_IO,
16 	},
17 	{
18 		.name	= "File",
19 		.mask	= FIO_OPT_C_FILE,
20 	},
21 	{
22 		.name	= "Statistics",
23 		.mask	= FIO_OPT_C_STAT,
24 	},
25 	{
26 		.name	= "Logging",
27 		.mask	= FIO_OPT_C_LOG,
28 	},
29 	{
30 		.name	= "Profiles",
31 		.mask	= FIO_OPT_C_PROFILE,
32 	},
33 	{
34 		.name	= "I/O engines",
35 		.mask	= FIO_OPT_C_ENGINE,
36 	},
37 	{
38 		.name	= NULL,
39 	},
40 };
41 
42 static const struct opt_group fio_opt_cat_groups[] = {
43 	{
44 		.name	= "Rate",
45 		.mask	= FIO_OPT_G_RATE,
46 	},
47 	{
48 		.name	= "Zone",
49 		.mask	= FIO_OPT_G_ZONE,
50 	},
51 	{
52 		.name	= "Read/write mix",
53 		.mask	= FIO_OPT_G_RWMIX,
54 	},
55 	{
56 		.name	= "Verify",
57 		.mask	= FIO_OPT_G_VERIFY,
58 	},
59 	{
60 		.name	= "Trim",
61 		.mask	= FIO_OPT_G_TRIM,
62 	},
63 	{
64 		.name	= "I/O Logging",
65 		.mask	= FIO_OPT_G_IOLOG,
66 	},
67 	{
68 		.name	= "I/O Depth",
69 		.mask	= FIO_OPT_G_IO_DEPTH,
70 	},
71 	{
72 		.name	= "I/O Flow",
73 		.mask	= FIO_OPT_G_IO_FLOW,
74 	},
75 	{
76 		.name	= "Description",
77 		.mask	= FIO_OPT_G_DESC,
78 	},
79 	{
80 		.name	= "Filename",
81 		.mask	= FIO_OPT_G_FILENAME,
82 	},
83 	{
84 		.name	= "General I/O",
85 		.mask	= FIO_OPT_G_IO_BASIC,
86 	},
87 	{
88 		.name	= "Cgroups",
89 		.mask	= FIO_OPT_G_CGROUP,
90 	},
91 	{
92 		.name	= "Runtime",
93 		.mask	= FIO_OPT_G_RUNTIME,
94 	},
95 	{
96 		.name	= "Process",
97 		.mask	= FIO_OPT_G_PROCESS,
98 	},
99 	{
100 		.name	= "Job credentials / priority",
101 		.mask	= FIO_OPT_G_CRED,
102 	},
103 	{
104 		.name	= "Clock settings",
105 		.mask	= FIO_OPT_G_CLOCK,
106 	},
107 	{
108 		.name	= "I/O Type",
109 		.mask	= FIO_OPT_G_IO_TYPE,
110 	},
111 	{
112 		.name	= "I/O Thinktime",
113 		.mask	= FIO_OPT_G_THINKTIME,
114 	},
115 	{
116 		.name	= "Randomizations",
117 		.mask	= FIO_OPT_G_RANDOM,
118 	},
119 	{
120 		.name	= "I/O buffers",
121 		.mask	= FIO_OPT_G_IO_BUF,
122 	},
123 	{
124 		.name	= "Tiobench profile",
125 		.mask	= FIO_OPT_G_TIOBENCH,
126 	},
127 	{
128 		.name	= "Error handling",
129 		.mask	= FIO_OPT_G_ERR,
130 	},
131 	{
132 		.name	= "Ext4 defrag I/O engine", /* e4defrag */
133 		.mask	= FIO_OPT_G_E4DEFRAG,
134 	},
135 	{
136 		.name	= "Network I/O engine", /* net */
137 		.mask	= FIO_OPT_G_NETIO,
138 	},
139 	{
140 		.name	= "RDMA I/O engine", /* rdma */
141 		.mask	= FIO_OPT_G_RDMA,
142 	},
143 	{
144 		.name	= "libaio I/O engine", /* libaio */
145 		.mask	= FIO_OPT_G_LIBAIO,
146 	},
147 	{
148 		.name	= "ACT Aerospike like benchmark profile",
149 		.mask	= FIO_OPT_G_ACT,
150 	},
151 	{
152 		.name	= "Latency profiling",
153 		.mask	= FIO_OPT_G_LATPROF,
154 	},
155 	{
156 		.name	= "RBD I/O engine", /* rbd */
157 		.mask	= FIO_OPT_G_RBD,
158 	},
159 	{
160 		.name	= "GlusterFS I/O engine", /* gfapi,gfapi_async */
161 		.mask	= FIO_OPT_G_GFAPI,
162 	},
163 	{
164 		.name	= "MTD I/O engine", /* mtd */
165 		.mask	= FIO_OPT_G_MTD,
166 	},
167 	{
168 		.name	= "libhdfs I/O engine", /* libhdfs */
169 		.mask	= FIO_OPT_G_HDFS,
170 	},
171 	{
172 		.name	= NULL,
173 	},
174 };
175 
group_from_mask(const struct opt_group * ogs,uint64_t * mask,uint64_t inv_mask)176 static const struct opt_group *group_from_mask(const struct opt_group *ogs,
177 					       uint64_t *mask,
178 					       uint64_t inv_mask)
179 {
180 	int i;
181 
182 	if (*mask == inv_mask || !*mask)
183 		return NULL;
184 
185 	for (i = 0; ogs[i].name; i++) {
186 		const struct opt_group *og = &ogs[i];
187 
188 		if (*mask & og->mask) {
189 			*mask &= ~(og->mask);
190 			return og;
191 		}
192 	}
193 
194 	return NULL;
195 }
196 
opt_group_from_mask(uint64_t * mask)197 const struct opt_group *opt_group_from_mask(uint64_t *mask)
198 {
199 	return group_from_mask(fio_opt_groups, mask, FIO_OPT_C_INVALID);
200 }
201 
opt_group_cat_from_mask(uint64_t * mask)202 const struct opt_group *opt_group_cat_from_mask(uint64_t *mask)
203 {
204 	return group_from_mask(fio_opt_cat_groups, mask, FIO_OPT_G_INVALID);
205 }
206