Disable io_submit_mode=offload with async engines
authorJens Axboe <axboe@kernel.dk>
Fri, 11 Sep 2020 15:18:09 +0000 (09:18 -0600)
committerJens Axboe <axboe@kernel.dk>
Fri, 11 Sep 2020 15:18:09 +0000 (09:18 -0600)
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 <axboe@kernel.dk>
HOWTO
fio.1
ioengines.c

diff --git a/HOWTO b/HOWTO
index d8586723a281ae8418687fd2561a3f4b6ecaee26..2d8c7a0238fd20d77c1a1ee35e061ed16ab47cf8 100644 (file)
--- 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 74509bbd2ea434278a6970c14e71e965cc083cd0..a881277c80279873f16414ce7a257fa5ab881bbd 100644 (file)
--- 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
index 476df58da7c1239c6cf8a60546f77a7dcdc56aad..32583d5a802f1d41a3d4dfa109d44dfbaea3f1b9 100644 (file)
@@ -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;