From abfd235a05330eae8444f0e4c0039bbdf9f160a3 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Fri, 11 Sep 2020 09:18:09 -0600 Subject: [PATCH] Disable io_submit_mode=offload with async engines We have various cases that aren't handled correctly with async engines, or cannot work with async engines. Disable it. Signed-off-by: Jens Axboe --- HOWTO | 3 ++- fio.1 | 2 +- ioengines.c | 13 +++++++++++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/HOWTO b/HOWTO index d8586723..2d8c7a02 100644 --- a/HOWTO +++ b/HOWTO @@ -2474,7 +2474,8 @@ I/O depth can increase latencies. The benefit is that fio can manage submission rates independently of the device completion rates. This avoids skewed latency reporting if I/O gets backed up on the device side (the coordinated omission - problem). + problem). Note that this option cannot reliably be used with async IO + engines. I/O rate diff --git a/fio.1 b/fio.1 index 74509bbd..a881277c 100644 --- a/fio.1 +++ b/fio.1 @@ -2215,7 +2215,7 @@ has a bit of extra overhead, especially for lower queue depth I/O where it can increase latencies. The benefit is that fio can manage submission rates independently of the device completion rates. This avoids skewed latency reporting if I/O gets backed up on the device side (the coordinated omission -problem). +problem). Note that this option cannot reliably be used with async IO engines. .SS "I/O rate" .TP .BI thinktime \fR=\fPtime diff --git a/ioengines.c b/ioengines.c index 476df58d..32583d5a 100644 --- a/ioengines.c +++ b/ioengines.c @@ -22,7 +22,7 @@ static FLIST_HEAD(engine_list); -static bool check_engine_ops(struct ioengine_ops *ops) +static bool check_engine_ops(struct thread_data *td, struct ioengine_ops *ops) { if (ops->version != FIO_IOOPS_VERSION) { log_err("bad ioops version %d (want %d)\n", ops->version, @@ -41,6 +41,15 @@ static bool check_engine_ops(struct ioengine_ops *ops) if (ops->flags & FIO_SYNCIO) return false; + /* + * async engines aren't reliable with offload + */ + if (td->o.io_submit_mode == IO_MODE_OFFLOAD) { + log_err("%s: can't be used with offloaded submit. Use a sync " + "engine\n", ops->name); + return true; + } + if (!ops->event || !ops->getevents) { log_err("%s: no event/getevents handler\n", ops->name); return true; @@ -193,7 +202,7 @@ struct ioengine_ops *load_ioengine(struct thread_data *td) /* * Check that the required methods are there. */ - if (check_engine_ops(ops)) + if (check_engine_ops(td, ops)) return NULL; return ops; -- 2.25.1