Home | History | Annotate | Download | only in fio
      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 
    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 
    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 
    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