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