X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=rate-submit.c;h=2efbdcba610902dd2c344c45f8a980dbd15c819e;hp=a68a3dd3a7b26bf1e4a03c03e3583c28ebfc6faa;hb=6da94b076ca08f884dc83c9978bc995848dea0e8;hpb=405113013b076aeb89634a333af96f948044b110 diff --git a/rate-submit.c b/rate-submit.c index a68a3dd3..2efbdcba 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 "lib/getrusage.h" +#include "rate-submit.h" -static void io_workqueue_fn(struct submit_worker *sw, - struct workqueue_work *work) +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 void 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()); @@ -48,11 +55,13 @@ static void io_workqueue_fn(struct submit_worker *sw, if (ret > 0) td->cur_depth -= ret; } + + return 0; } 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; @@ -62,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); @@ -75,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)); @@ -101,9 +110,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); @@ -136,7 +142,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); @@ -204,7 +210,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)) @@ -216,7 +222,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, @@ -226,3 +232,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); +}