fio: fix aio trim completion latencies
authorVincent Fu <vincent.fu@wdc.com>
Mon, 8 Jul 2019 19:23:54 +0000 (15:23 -0400)
committerJens Axboe <axboe@kernel.dk>
Tue, 9 Jul 2019 14:36:32 +0000 (08:36 -0600)
The io_uring, libaio, and posixaio ioengines actually carry out
synchronous trim operations, but latency timestamps are recorded as if
the trims were issued asynchronously. This patch fixes how timestamps
are recorded for trim operations issued by these ioengines.

Fixes: https://github.com/axboe/fio/issues/764
Signed-off-by: Jens Axboe <axboe@kernel.dk>
engines/io_uring.c
engines/libaio.c
engines/posixaio.c
ioengines.c
ioengines.h

index a5e77d8f52fcfe29e1985824f953b0b594e64f85..9bcfec1726b05402bbc0875b2a53bf3edfc13e52 100644 (file)
@@ -533,6 +533,7 @@ static int fio_ioring_io_u_init(struct thread_data *td, struct io_u *io_u)
 static struct ioengine_ops ioengine = {
        .name                   = "io_uring",
        .version                = FIO_IOOPS_VERSION,
+       .flags                  = FIO_ASYNCIO_SYNC_TRIM,
        .init                   = fio_ioring_init,
        .post_init              = fio_ioring_post_init,
        .io_u_init              = fio_ioring_io_u_init,
index 8844ac8b42d746cd1cc57c9e94ed34e3b29868f8..cc6ca66b49af50c4ef95836010202c061f6f1d54 100644 (file)
@@ -429,6 +429,7 @@ static int fio_libaio_init(struct thread_data *td)
 static struct ioengine_ops ioengine = {
        .name                   = "libaio",
        .version                = FIO_IOOPS_VERSION,
+       .flags                  = FIO_ASYNCIO_SYNC_TRIM,
        .init                   = fio_libaio_init,
        .post_init              = fio_libaio_post_init,
        .prep                   = fio_libaio_prep,
index 4ac019578a7f8114a254ce425e8a4e76b74211cd..82c6aa65b82fbada14192b32b6c8b29a03e03646 100644 (file)
@@ -243,6 +243,7 @@ static int fio_posixaio_init(struct thread_data *td)
 static struct ioengine_ops ioengine = {
        .name           = "posixaio",
        .version        = FIO_IOOPS_VERSION,
+       .flags          = FIO_ASYNCIO_SYNC_TRIM,
        .init           = fio_posixaio_init,
        .prep           = fio_posixaio_prep,
        .queue          = fio_posixaio_queue,
index 7e5a50cc81ba328875b605a55f1fde8c16122cec..aa4ccd2755c96f843d69333448795b0b16061723 100644 (file)
@@ -308,7 +308,9 @@ enum fio_q_status td_io_queue(struct thread_data *td, struct io_u *io_u)
        io_u->error = 0;
        io_u->resid = 0;
 
-       if (td_ioengine_flagged(td, FIO_SYNCIO)) {
+       if (td_ioengine_flagged(td, FIO_SYNCIO) ||
+               (td_ioengine_flagged(td, FIO_ASYNCIO_SYNC_TRIM) && 
+               io_u->ddir == DDIR_TRIM)) {
                if (fio_fill_issue_time(td))
                        fio_gettime(&io_u->issue_time, NULL);
 
@@ -389,7 +391,9 @@ enum fio_q_status td_io_queue(struct thread_data *td, struct io_u *io_u)
                        td_io_commit(td);
        }
 
-       if (!td_ioengine_flagged(td, FIO_SYNCIO)) {
+       if (!td_ioengine_flagged(td, FIO_SYNCIO) &&
+               (!td_ioengine_flagged(td, FIO_ASYNCIO_SYNC_TRIM) ||
+                io_u->ddir != DDIR_TRIM)) {
                if (fio_fill_issue_time(td))
                        fio_gettime(&io_u->issue_time, NULL);
 
index b9cd33d52f5cf4e1252a6f946833c819b5edcdc3..01a9b5860085f13885885edb326bcf8c14d5ccc3 100644 (file)
@@ -63,6 +63,8 @@ enum fio_ioengine_flags {
        FIO_FAKEIO      = 1 << 11,      /* engine pretends to do IO */
        FIO_NOSTATS     = 1 << 12,      /* don't do IO stats */
        FIO_NOFILEHASH  = 1 << 13,      /* doesn't hash the files for lookup later. */
+       FIO_ASYNCIO_SYNC_TRIM
+                       = 1 << 14       /* io engine has async ->queue except for trim */
 };
 
 /*