179d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe#include "fio.h"
279d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe#include "profile.h"
379d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe#include "debug.h"
479d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe#include "flist.h"
5e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe#include "options.h"
679d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe
779d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboestatic FLIST_HEAD(profile_list);
879d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe
915dc1934435dc84d66547c4fc92d936224d7238fJens Axboestruct profile_ops *find_profile(const char *profile)
1079d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe{
1115dc1934435dc84d66547c4fc92d936224d7238fJens Axboe	struct profile_ops *ops = NULL;
1279d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe	struct flist_head *n;
1379d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe
1479d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe	flist_for_each(n, &profile_list) {
1579d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe		ops = flist_entry(n, struct profile_ops, list);
1679d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe		if (!strcmp(profile, ops->name))
1779d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe			break;
1879d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe
1979d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe		ops = NULL;
2079d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe	}
2179d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe
2215dc1934435dc84d66547c4fc92d936224d7238fJens Axboe	return ops;
2315dc1934435dc84d66547c4fc92d936224d7238fJens Axboe}
2415dc1934435dc84d66547c4fc92d936224d7238fJens Axboe
2515dc1934435dc84d66547c4fc92d936224d7238fJens Axboeint load_profile(const char *profile)
2615dc1934435dc84d66547c4fc92d936224d7238fJens Axboe{
2715dc1934435dc84d66547c4fc92d936224d7238fJens Axboe	struct profile_ops *ops;
2815dc1934435dc84d66547c4fc92d936224d7238fJens Axboe
2915dc1934435dc84d66547c4fc92d936224d7238fJens Axboe	dprint(FD_PROFILE, "loading profile '%s'\n", profile);
3015dc1934435dc84d66547c4fc92d936224d7238fJens Axboe
3115dc1934435dc84d66547c4fc92d936224d7238fJens Axboe	ops = find_profile(profile);
3279d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe	if (ops) {
33d4afedfd152cea890ffa7d45bf1664fb70218c45Jens Axboe		if (ops->prep_cmd()) {
3490777558f2b5d38491d6975673ff222c90b092bfJens Axboe			log_err("fio: profile %s prep failed\n", profile);
35d4afedfd152cea890ffa7d45bf1664fb70218c45Jens Axboe			return 1;
36d4afedfd152cea890ffa7d45bf1664fb70218c45Jens Axboe		}
3746bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe		add_job_opts(ops->cmdline, FIO_CLIENT_TYPE_CLI);
3879d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe		return 0;
3979d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe	}
4079d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe
4179d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe	log_err("fio: profile '%s' not found\n", profile);
4279d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe	return 1;
4379d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe}
4479d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe
4507b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboestatic int add_profile_options(struct profile_ops *ops)
46e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe{
4707b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboe	struct fio_option *o;
483c3ed070502bbfec387ded2c43d5e4559ca24a63Jens Axboe
49e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe	if (!ops->options)
5007b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboe		return 0;
51e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe
5207b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboe	o = ops->options;
5307b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboe	while (o->name) {
5407b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboe		o->prof_name = ops->name;
557b504eddc4b039f2db3a0626bd08f880c5f4de27Jens Axboe		o->prof_opts = ops->opt_data;
5607b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboe		if (add_option(o))
5707b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboe			return 1;
5807b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboe		o++;
59e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe	}
6007b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboe
6107b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboe	return 0;
62e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe}
63e2de69dac799a1eecac1b52085f908729591ef5aJens Axboe
6407b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboeint register_profile(struct profile_ops *ops)
6579d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe{
6607b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboe	int ret;
6707b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboe
6879d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe	dprint(FD_PROFILE, "register profile '%s'\n", ops->name);
69f5b6bb85364fcb8b2ac8d922ca65afd9dfabc9bbJens Axboe
7007b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboe	ret = add_profile_options(ops);
71f5b6bb85364fcb8b2ac8d922ca65afd9dfabc9bbJens Axboe	if (!ret) {
72f5b6bb85364fcb8b2ac8d922ca65afd9dfabc9bbJens Axboe		flist_add_tail(&ops->list, &profile_list);
73f5b6bb85364fcb8b2ac8d922ca65afd9dfabc9bbJens Axboe		add_opt_posval("profile", ops->name, ops->desc);
74f5b6bb85364fcb8b2ac8d922ca65afd9dfabc9bbJens Axboe		return 0;
75f5b6bb85364fcb8b2ac8d922ca65afd9dfabc9bbJens Axboe	}
7607b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboe
77f5b6bb85364fcb8b2ac8d922ca65afd9dfabc9bbJens Axboe	invalidate_profile_options(ops->name);
7807b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboe	return ret;
7979d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe}
8079d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe
8179d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboevoid unregister_profile(struct profile_ops *ops)
8279d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe{
8379d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe	dprint(FD_PROFILE, "unregister profile '%s'\n", ops->name);
8479d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe	flist_del(&ops->list);
8507b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboe	invalidate_profile_options(ops->name);
86f5b6bb85364fcb8b2ac8d922ca65afd9dfabc9bbJens Axboe	del_opt_posval("profile", ops->name);
8779d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe}
8815dc1934435dc84d66547c4fc92d936224d7238fJens Axboe
8915dc1934435dc84d66547c4fc92d936224d7238fJens Axboevoid profile_add_hooks(struct thread_data *td)
9015dc1934435dc84d66547c4fc92d936224d7238fJens Axboe{
9115dc1934435dc84d66547c4fc92d936224d7238fJens Axboe	struct profile_ops *ops;
9215dc1934435dc84d66547c4fc92d936224d7238fJens Axboe
9315dc1934435dc84d66547c4fc92d936224d7238fJens Axboe	if (!exec_profile)
9415dc1934435dc84d66547c4fc92d936224d7238fJens Axboe		return;
9515dc1934435dc84d66547c4fc92d936224d7238fJens Axboe
9615dc1934435dc84d66547c4fc92d936224d7238fJens Axboe	ops = find_profile(exec_profile);
9715dc1934435dc84d66547c4fc92d936224d7238fJens Axboe	if (!ops)
9815dc1934435dc84d66547c4fc92d936224d7238fJens Axboe		return;
9915dc1934435dc84d66547c4fc92d936224d7238fJens Axboe
100d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe	if (ops->io_ops) {
1017eb36574da703ebdfac414d7428712320f552a96Jens Axboe		td->prof_io_ops = *ops->io_ops;
102d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe		td->flags |= TD_F_PROFILE_OPS;
103d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe	}
10415dc1934435dc84d66547c4fc92d936224d7238fJens Axboe}
10558c55ba02aca24ed30beb343fcb1dc3df4667389Jens Axboe
10658c55ba02aca24ed30beb343fcb1dc3df4667389Jens Axboeint profile_td_init(struct thread_data *td)
10758c55ba02aca24ed30beb343fcb1dc3df4667389Jens Axboe{
10858c55ba02aca24ed30beb343fcb1dc3df4667389Jens Axboe	struct prof_io_ops *ops = &td->prof_io_ops;
10958c55ba02aca24ed30beb343fcb1dc3df4667389Jens Axboe
11058c55ba02aca24ed30beb343fcb1dc3df4667389Jens Axboe	if (ops->td_init)
11158c55ba02aca24ed30beb343fcb1dc3df4667389Jens Axboe		return ops->td_init(td);
11258c55ba02aca24ed30beb343fcb1dc3df4667389Jens Axboe
11358c55ba02aca24ed30beb343fcb1dc3df4667389Jens Axboe	return 0;
11458c55ba02aca24ed30beb343fcb1dc3df4667389Jens Axboe}
11558c55ba02aca24ed30beb343fcb1dc3df4667389Jens Axboe
11658c55ba02aca24ed30beb343fcb1dc3df4667389Jens Axboevoid profile_td_exit(struct thread_data *td)
11758c55ba02aca24ed30beb343fcb1dc3df4667389Jens Axboe{
11858c55ba02aca24ed30beb343fcb1dc3df4667389Jens Axboe	struct prof_io_ops *ops = &td->prof_io_ops;
11958c55ba02aca24ed30beb343fcb1dc3df4667389Jens Axboe
12058c55ba02aca24ed30beb343fcb1dc3df4667389Jens Axboe	if (ops->td_exit)
12158c55ba02aca24ed30beb343fcb1dc3df4667389Jens Axboe		ops->td_exit(td);
12258c55ba02aca24ed30beb343fcb1dc3df4667389Jens Axboe}
123