X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=profiles%2Fact.c;h=5d3bd2544ed9b714b5b769c2bbe7cf6bcb7c4a09;hb=8ca8a05d92fa799fe93a6edc27b058802211fddc;hp=59e50052110aec465ceac205759246bd03ff8a17;hpb=22bcb265833f263facd58bcef3d8a159c554460e;p=fio.git diff --git a/profiles/act.c b/profiles/act.c index 59e50052..5d3bd254 100644 --- a/profiles/act.c +++ b/profiles/act.c @@ -38,7 +38,7 @@ struct act_slice { }; struct act_run_data { - struct fio_mutex *mutex; + struct fio_sem *sem; unsigned int pending; struct act_slice *slices; @@ -53,14 +53,6 @@ struct act_prof_data { unsigned int nr_slices; }; -static char *device_names; -static unsigned int load; -static unsigned int prep; -static unsigned int threads_per_queue; -static unsigned int num_read_blocks; -static unsigned int write_size; -static unsigned long long test_duration; - #define ACT_MAX_OPTS 128 static const char *act_opts[ACT_MAX_OPTS] = { "direct=1", @@ -97,6 +89,7 @@ static struct fio_option options[] = { .help = "Devices to use", .category = FIO_OPT_C_PROFILE, .group = FIO_OPT_G_ACT, + .no_free = true, }, { .name = "load", @@ -185,6 +178,8 @@ static int act_add_opt(const char *str, ...) static int act_add_rw(const char *dev, int reads) { + struct act_options *ao = &act_options; + if (act_add_opt("name=act-%s-%s", reads ? "read" : "write", dev)) return 1; if (act_add_opt("filename=%s", dev)) @@ -192,21 +187,21 @@ static int act_add_rw(const char *dev, int reads) if (act_add_opt("rw=%s", reads ? "randread" : "randwrite")) return 1; if (reads) { - int rload = load * R_LOAD / threads_per_queue; + int rload = ao->load * R_LOAD / ao->threads_per_queue; - if (act_add_opt("numjobs=%u", threads_per_queue)) + if (act_add_opt("numjobs=%u", ao->threads_per_queue)) return 1; if (act_add_opt("rate_iops=%u", rload)) return 1; - if (act_add_opt("bs=%u", num_read_blocks * 512)) + if (act_add_opt("bs=%u", ao->num_read_blocks * 512)) return 1; } else { - const int rsize = write_size / (num_read_blocks * 512); - int wload = (load * W_LOAD + rsize - 1) / rsize; + const int rsize = ao->write_size / (ao->num_read_blocks * 512); + int wload = (ao->load * W_LOAD + rsize - 1) / rsize; if (act_add_opt("rate_iops=%u", wload)) return 1; - if (act_add_opt("bs=%u", write_size)) + if (act_add_opt("bs=%u", ao->write_size)) return 1; } @@ -248,10 +243,10 @@ static int act_add_dev_prep(const char *dev) static int act_add_dev(const char *dev) { - if (prep) + if (act_options.prep) return act_add_dev_prep(dev); - if (act_add_opt("runtime=%llus", test_duration)) + if (act_add_opt("runtime=%llus", act_options.test_duration)) return 1; if (act_add_opt("time_based=1")) return 1; @@ -269,7 +264,7 @@ static int act_add_dev(const char *dev) */ static int act_prep_cmdline(void) { - if (!device_names) { + if (!act_options.device_names) { log_err("act: you need to set IO target(s) with the " "device-names option.\n"); return 1; @@ -280,7 +275,7 @@ static int act_prep_cmdline(void) do { char *dev; - dev = strsep(&device_names, ","); + dev = strsep(&act_options.device_names, ","); if (!dev) break; @@ -293,14 +288,15 @@ static int act_prep_cmdline(void) return 0; } -static int act_io_u_lat(struct thread_data *td, uint64_t usec) +static int act_io_u_lat(struct thread_data *td, uint64_t nsec) { struct act_prof_data *apd = td->prof_data; struct act_slice *slice; + uint64_t usec = nsec / 1000ULL; int i, ret = 0; double perm; - if (prep) + if (act_options.prep) return 0; /* @@ -341,9 +337,9 @@ static int act_io_u_lat(struct thread_data *td, uint64_t usec) static void get_act_ref(void) { - fio_mutex_down(act_run_data->mutex); + fio_sem_down(act_run_data->sem); act_run_data->pending++; - fio_mutex_up(act_run_data->mutex); + fio_sem_up(act_run_data->sem); } static int show_slice(struct act_slice *slice, unsigned int slice_num) @@ -400,7 +396,7 @@ static void put_act_ref(struct thread_data *td) struct act_prof_data *apd = td->prof_data; unsigned int i, slice; - fio_mutex_down(act_run_data->mutex); + fio_sem_down(act_run_data->sem); if (!act_run_data->slices) { act_run_data->slices = calloc(apd->nr_slices, sizeof(struct act_slice)); @@ -420,7 +416,7 @@ static void put_act_ref(struct thread_data *td) if (!--act_run_data->pending) act_show_all_stats(); - fio_mutex_up(act_run_data->mutex); + fio_sem_up(act_run_data->sem); } static int act_td_init(struct thread_data *td) @@ -431,7 +427,7 @@ static int act_td_init(struct thread_data *td) get_act_ref(); apd = calloc(1, sizeof(*apd)); - nr_slices = (test_duration + SAMPLE_SEC - 1) / SAMPLE_SEC; + nr_slices = (act_options.test_duration + SAMPLE_SEC - 1) / SAMPLE_SEC; apd->slices = calloc(nr_slices, sizeof(struct act_slice)); apd->nr_slices = nr_slices; fio_gettime(&apd->sample_tv, NULL); @@ -468,7 +464,7 @@ static struct profile_ops act_profile = { static void fio_init act_register(void) { act_run_data = calloc(1, sizeof(*act_run_data)); - act_run_data->mutex = fio_mutex_init(FIO_MUTEX_UNLOCKED); + act_run_data->sem = fio_sem_init(FIO_SEM_UNLOCKED); if (register_profile(&act_profile)) log_err("fio: failed to register profile 'act'\n"); @@ -480,7 +476,7 @@ static void fio_exit act_unregister(void) free((void *) act_opts[++org_idx]); unregister_profile(&act_profile); - fio_mutex_remove(act_run_data->mutex); + fio_sem_remove(act_run_data->sem); free(act_run_data->slices); free(act_run_data); act_run_data = NULL;