X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=rate-submit.c;h=0c31f29f5aaafcc27c7dce14d66072f5c5567b08;hp=a1d55916c0dd7b4fe716826865d7681197834aeb;hb=1e613c9c23932006263dd8334007865f32891a0c;hpb=155f2f027b34321f6f5abe79c09ece8ecca25046 diff --git a/rate-submit.c b/rate-submit.c index a1d55916..0c31f29f 100644 --- a/rate-submit.c +++ b/rate-submit.c @@ -1,13 +1,20 @@ +/* + * Rated submission helpers + * + * Copyright (C) 2015 Jens Axboe + * + */ #include "fio.h" #include "ioengine.h" #include "lib/getrusage.h" +#include "rate-submit.h" static int io_workqueue_fn(struct submit_worker *sw, struct workqueue_work *work) { struct io_u *io_u = container_of(work, struct io_u, work); const enum fio_ddir ddir = io_u->ddir; - struct thread_data *td = sw->private; + struct thread_data *td = sw->priv; int ret; dprint(FD_RATE, "io_u %p queued by %u\n", io_u, gettid()); @@ -54,7 +61,7 @@ static int io_workqueue_fn(struct submit_worker *sw, static bool io_workqueue_pre_sleep_flush_fn(struct submit_worker *sw) { - struct thread_data *td = sw->private; + struct thread_data *td = sw->priv; if (td->io_u_queued || td->cur_depth || td->io_u_in_flight) return true; @@ -64,7 +71,7 @@ static bool io_workqueue_pre_sleep_flush_fn(struct submit_worker *sw) static void io_workqueue_pre_sleep_fn(struct submit_worker *sw) { - struct thread_data *td = sw->private; + struct thread_data *td = sw->priv; int ret; ret = io_u_quiesce(td); @@ -77,20 +84,20 @@ static int io_workqueue_alloc_fn(struct submit_worker *sw) struct thread_data *td; td = calloc(1, sizeof(*td)); - sw->private = td; + sw->priv = td; return 0; } static void io_workqueue_free_fn(struct submit_worker *sw) { - free(sw->private); - sw->private = NULL; + free(sw->priv); + sw->priv = NULL; } static int io_workqueue_init_worker_fn(struct submit_worker *sw) { struct thread_data *parent = sw->wq->td; - struct thread_data *td = sw->private; + struct thread_data *td = sw->priv; int fio_unused ret; memcpy(&td->o, &parent->o, sizeof(td->o)); @@ -138,7 +145,7 @@ err: static void io_workqueue_exit_worker_fn(struct submit_worker *sw, unsigned int *sum_cnt) { - struct thread_data *td = sw->private; + struct thread_data *td = sw->priv; (*sum_cnt)++; sum_thread_stats(&sw->wq->td->ts, &td->ts, *sum_cnt == 1); @@ -206,7 +213,7 @@ static void sum_ddir(struct thread_data *dst, struct thread_data *src, static void io_workqueue_update_acct_fn(struct submit_worker *sw) { - struct thread_data *src = sw->private; + struct thread_data *src = sw->priv; struct thread_data *dst = sw->wq->td; if (td_read(src)) @@ -218,7 +225,7 @@ static void io_workqueue_update_acct_fn(struct submit_worker *sw) } -struct workqueue_ops rated_wq_ops = { +static struct workqueue_ops rated_wq_ops = { .fn = io_workqueue_fn, .pre_sleep_flush_fn = io_workqueue_pre_sleep_flush_fn, .pre_sleep_fn = io_workqueue_pre_sleep_fn, @@ -228,3 +235,19 @@ struct workqueue_ops rated_wq_ops = { .init_worker_fn = io_workqueue_init_worker_fn, .exit_worker_fn = io_workqueue_exit_worker_fn, }; + +int rate_submit_init(struct thread_data *td, struct sk_out *sk_out) +{ + if (td->o.io_submit_mode != IO_MODE_OFFLOAD) + return 0; + + return workqueue_init(td, &td->io_wq, &rated_wq_ops, td->o.iodepth, sk_out); +} + +void rate_submit_exit(struct thread_data *td) +{ + if (td->o.io_submit_mode != IO_MODE_OFFLOAD) + return; + + workqueue_exit(&td->io_wq); +}