|
Packit |
8930e1 |
#include <stdio.h>
|
|
Packit |
8930e1 |
#include <inttypes.h>
|
|
Packit |
8930e1 |
#include "optgroup.h"
|
|
Packit |
8930e1 |
#include "compiler/compiler.h"
|
|
Packit |
8930e1 |
|
|
Packit |
8930e1 |
/*
|
|
Packit |
8930e1 |
* Option grouping
|
|
Packit |
8930e1 |
*/
|
|
Packit |
8930e1 |
static const struct opt_group fio_opt_groups[] = {
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "General",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_C_GENERAL,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "I/O",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_C_IO,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "File",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_C_FILE,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "Statistics",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_C_STAT,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "Logging",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_C_LOG,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "Profiles",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_C_PROFILE,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "I/O engines",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_C_ENGINE,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = NULL,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
};
|
|
Packit |
8930e1 |
|
|
Packit |
8930e1 |
static const struct opt_group fio_opt_cat_groups[] = {
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "Rate",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_RATE,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "Zone",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_ZONE,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "Read/write mix",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_RWMIX,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "Verify",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_VERIFY,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "Trim",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_TRIM,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "I/O Logging",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_IOLOG,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "I/O Depth",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_IO_DEPTH,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "I/O Flow",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_IO_FLOW,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "Description",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_DESC,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "Filename",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_FILENAME,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "General I/O",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_IO_BASIC,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "Cgroups",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_CGROUP,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "Runtime",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_RUNTIME,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "Process",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_PROCESS,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "Job credentials / priority",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_CRED,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "Clock settings",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_CLOCK,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "I/O Type",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_IO_TYPE,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "I/O Thinktime",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_THINKTIME,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "Randomizations",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_RANDOM,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "I/O buffers",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_IO_BUF,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "Tiobench profile",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_TIOBENCH,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "Error handling",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_ERR,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "Ext4 defrag I/O engine", /* e4defrag */
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_E4DEFRAG,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "Network I/O engine", /* net */
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_NETIO,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "RDMA I/O engine", /* rdma */
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_RDMA,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "libaio I/O engine", /* libaio */
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_LIBAIO,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "ACT Aerospike like benchmark profile",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_ACT,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "Latency profiling",
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_LATPROF,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "RBD I/O engine", /* rbd */
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_RBD,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "GlusterFS I/O engine", /* gfapi,gfapi_async */
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_GFAPI,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "MTD I/O engine", /* mtd */
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_MTD,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "libhdfs I/O engine", /* libhdfs */
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_HDFS,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = "NBD I/O engine", /* NBD */
|
|
Packit |
8930e1 |
.mask = FIO_OPT_G_NBD,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
.name = NULL,
|
|
Packit |
8930e1 |
},
|
|
Packit |
8930e1 |
};
|
|
Packit |
8930e1 |
|
|
Packit |
8930e1 |
static const struct opt_group *group_from_mask(const struct opt_group *ogs,
|
|
Packit |
8930e1 |
uint64_t *mask,
|
|
Packit |
8930e1 |
uint64_t inv_mask)
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
int i;
|
|
Packit |
8930e1 |
|
|
Packit |
8930e1 |
if (*mask == inv_mask || !*mask)
|
|
Packit |
8930e1 |
return NULL;
|
|
Packit |
8930e1 |
|
|
Packit |
8930e1 |
for (i = 0; ogs[i].name; i++) {
|
|
Packit |
8930e1 |
const struct opt_group *og = &ogs[i];
|
|
Packit |
8930e1 |
|
|
Packit |
8930e1 |
if (*mask & og->mask) {
|
|
Packit |
8930e1 |
*mask &= ~(og->mask);
|
|
Packit |
8930e1 |
return og;
|
|
Packit |
8930e1 |
}
|
|
Packit |
8930e1 |
}
|
|
Packit |
8930e1 |
|
|
Packit |
8930e1 |
return NULL;
|
|
Packit |
8930e1 |
}
|
|
Packit |
8930e1 |
|
|
Packit |
8930e1 |
const struct opt_group *opt_group_from_mask(uint64_t *mask)
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
return group_from_mask(fio_opt_groups, mask, FIO_OPT_C_INVALID);
|
|
Packit |
8930e1 |
}
|
|
Packit |
8930e1 |
|
|
Packit |
8930e1 |
const struct opt_group *opt_group_cat_from_mask(uint64_t *mask)
|
|
Packit |
8930e1 |
{
|
|
Packit |
8930e1 |
compiletime_assert(__FIO_OPT_G_NR <= 8 * sizeof(uint64_t),
|
|
Packit |
8930e1 |
"__FIO_OPT_G_NR");
|
|
Packit |
8930e1 |
|
|
Packit |
8930e1 |
return group_from_mask(fio_opt_cat_groups, mask, FIO_OPT_G_INVALID);
|
|
Packit |
8930e1 |
}
|