#include "smalloc.h"
#include "filehash.h"
#include "verify.h"
+#include "profile.h"
static char fio_version_string[] = "fio 1.37";
},
};
-static const char *tiobench_opts[] = {
- "buffered=0", "size=4*1024*$mb_memory", "bs=4k", "timeout=600",
- "numjobs=4", "group_reporting", "thread", "overwrite=1",
- "filename=.fio.tio.1:.fio.tio.2:.fio.tio.3:.fio.tio.4",
- "name=seqwrite", "rw=write", "end_fsync=1",
- "name=randwrite", "stonewall", "rw=randwrite", "end_fsync=1",
- "name=seqread", "stonewall", "rw=read",
- "name=randread", "stonewall", "rw=randread", NULL,
-};
-
-static const char **fio_prof_strings[PROFILE_END] = {
- NULL,
- tiobench_opts,
-};
-
-static const char *profiles[PROFILE_END] = {
- "none",
- "tiobench",
-};
-
FILE *get_f_out()
{
return f_out;
return -1;
}
+/*
+ * Parse as if 'o' was a command line
+ */
+void add_job_opts(const char **o)
+{
+ struct thread_data *td, *td_parent;
+ int i, in_global = 1;
+ char jobname[32];
+
+ i = 0;
+ td_parent = td = NULL;
+ while (o[i]) {
+ if (!strncmp(o[i], "name", 4)) {
+ in_global = 0;
+ if (td)
+ add_job(td, jobname, 0);
+ td = NULL;
+ sprintf(jobname, "%s", o[i] + 5);
+ }
+ if (in_global && !td_parent)
+ td_parent = get_new_job(1, &def_thread);
+ else if (!in_global && !td) {
+ if (!td_parent)
+ td_parent = &def_thread;
+ td = get_new_job(0, td_parent);
+ }
+ if (in_global)
+ fio_options_parse(td_parent, (char **) &o[i], 1);
+ else
+ fio_options_parse(td, (char **) &o[i], 1);
+ i++;
+ }
+
+ if (td)
+ add_job(td, jobname, 0);
+}
+
static int skip_this_section(const char *name)
{
if (!job_section)
{ .name = "diskutil", .shift = FD_DISKUTIL },
{ .name = "job", .shift = FD_JOB },
{ .name = "mutex", .shift = FD_MUTEX },
+ { .name = "profile", .shift = FD_PROFILE },
{ .name = NULL, },
};
}
#endif
-static int load_profile(const char *profile)
-{
- struct thread_data *td, *td_parent;
- const char **o;
- int i, in_global = 1;
- char jobname[32];
-
- dprint(FD_PARSE, "loading profile '%s'\n", profile);
-
- for (i = 0; i < PROFILE_END; i++) {
- if (!strcmp(profile, profiles[i]))
- break;
- }
-
- if (i == PROFILE_END) {
- log_err("fio: unknown profile '%s'\n", profile);
- return 1;
- }
-
- o = fio_prof_strings[i];
- if (!o)
- return 0;
-
- i = 0;
- td_parent = td = NULL;
- while (o[i]) {
- if (!strncmp(o[i], "name", 4)) {
- in_global = 0;
- if (td)
- add_job(td, jobname, 0);
- td = NULL;
- sprintf(jobname, "%s", o[i] + 5);
- }
- if (in_global && !td_parent)
- td_parent = get_new_job(1, &def_thread);
- else if (!in_global && !td) {
- if (!td_parent)
- td_parent = &def_thread;
- td = get_new_job(0, td_parent);
- }
- if (in_global)
- fio_options_parse(td_parent, (char **) &o[i], 1);
- else
- fio_options_parse(td, (char **) &o[i], 1);
- i++;
- }
- if (td)
- add_job(td, jobname, 0);
- return 0;
-}
-
static int parse_cmd_line(int argc, char *argv[])
{
struct thread_data *td = NULL;
--- /dev/null
+#include "fio.h"
+#include "profile.h"
+#include "debug.h"
+#include "flist.h"
+
+static FLIST_HEAD(profile_list);
+
+int load_profile(const char *profile)
+{
+ struct profile_ops *ops;
+ struct flist_head *n;
+
+ dprint(FD_PROFILE, "loading profile '%s'\n", profile);
+
+ flist_for_each(n, &profile_list) {
+ ops = flist_entry(n, struct profile_ops, list);
+ if (!strcmp(profile, ops->name))
+ break;
+
+ ops = NULL;
+ }
+
+ if (ops) {
+ add_job_opts(ops->def_ops);
+ return 0;
+ }
+
+ log_err("fio: profile '%s' not found\n", profile);
+ return 1;
+}
+
+void register_profile(struct profile_ops *ops)
+{
+ dprint(FD_PROFILE, "register profile '%s'\n", ops->name);
+ flist_add_tail(&ops->list, &profile_list);
+}
+
+void unregister_profile(struct profile_ops *ops)
+{
+ dprint(FD_PROFILE, "unregister profile '%s'\n", ops->name);
+ flist_del(&ops->list);
+}
--- /dev/null
+#include "../fio.h"
+#include "../profile.h"
+
+static const char *tb_opts[] = {
+ "buffered=0", "size=4*1024*$mb_memory", "bs=4k", "timeout=600",
+ "numjobs=4", "group_reporting", "thread", "overwrite=1",
+ "filename=.fio.tio.1:.fio.tio.2:.fio.tio.3:.fio.tio.4",
+ "name=seqwrite", "rw=write", "end_fsync=1",
+ "name=randwrite", "stonewall", "rw=randwrite", "end_fsync=1",
+ "name=seqread", "stonewall", "rw=read",
+ "name=randread", "stonewall", "rw=randread", NULL,
+};
+
+static struct profile_ops tiobench_profile = {
+ .name = "tiobench",
+ .version = FIO_PROFILE_VERSION,
+ .def_ops = tb_opts,
+};
+
+static void fio_init tiobench_register(void)
+{
+ register_profile(&tiobench_profile);
+}
+
+static void fio_exit tiobench_unregister(void)
+{
+ unregister_profile(&tiobench_profile);
+}