From: Jens Axboe Date: Fri, 11 Sep 2020 15:18:09 +0000 (-0600) Subject: Disable io_submit_mode=offload with async engines X-Git-Tag: fio-3.24~29 X-Git-Url: https://git.kernel.dk/?a=commitdiff_plain;h=abfd235a05330eae8444f0e4c0039bbdf9f160a3;p=fio.git 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 --- 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;