X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=rate-submit.c;h=fdbece64d877ee0edd1e0f5359e2222db611483d;hp=a1d55916c0dd7b4fe716826865d7681197834aeb;hb=40c494710bb1e9b5da1a4fc0d1452c31c7cc9da1;hpb=155f2f027b34321f6f5abe79c09ece8ecca25046 diff --git a/rate-submit.c b/rate-submit.c index a1d55916..fdbece64 100644 --- a/rate-submit.c +++ b/rate-submit.c @@ -1,18 +1,25 @@ +/* + * Rated submission helpers + * + * Copyright (C) 2015 Jens Axboe + * + */ #include "fio.h" -#include "ioengine.h" +#include "ioengines.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()); - io_u_set(io_u, IO_U_F_NO_FILE_PUT); + io_u_set(td, io_u, IO_U_F_NO_FILE_PUT); td->cur_depth++; @@ -23,7 +30,7 @@ static int io_workqueue_fn(struct submit_worker *sw, ret = io_u_queued_complete(td, 1); if (ret > 0) td->cur_depth -= ret; - io_u_clear(io_u, IO_U_F_FLIGHT); + io_u_clear(td, io_u, IO_U_F_FLIGHT); } while (1); dprint(FD_RATE, "io_u %p ret %d by %u\n", io_u, ret, 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,21 +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; - int fio_unused ret; + struct thread_data *td = sw->priv; memcpy(&td->o, &parent->o, sizeof(td->o)); memcpy(&td->ts, &parent->ts, sizeof(td->ts)); @@ -103,9 +109,6 @@ static int io_workqueue_init_worker_fn(struct submit_worker *sw) if (ioengine_load(td)) goto err; - if (td->o.odirect) - td->io_ops->flags |= FIO_RAWIO; - td->pid = gettid(); INIT_FLIST_HEAD(&td->io_log_list); @@ -119,7 +122,7 @@ static int io_workqueue_init_worker_fn(struct submit_worker *sw) if (td_io_init(td)) goto err_io_init; - fio_gettime(&td->epoch, NULL); + set_epoch_time(td, td->o.log_unix_epoch); fio_getrusage(&td->ru_start); clear_io_state(td, 1); @@ -138,7 +141,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 +209,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 +221,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 +231,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); +}