Blame optgroup.c

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
}