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