engines/libblkio: Add option libblkio_force_enable_completion_eventfd
authorAlberto Faria <afaria@redhat.com>
Thu, 1 Dec 2022 22:08:01 +0000 (22:08 +0000)
committerVincent Fu <vincent.fu@samsung.com>
Fri, 2 Dec 2022 21:24:03 +0000 (16:24 -0500)
When set, the queue's completion fd is enabled even when it isn't used,
i.e., even if option libblkio_wait_mode is _not_ set to "eventfd".

Depending on the libblkio driver, this can have an impact on
performance. This option allows evaluating that overhead.

Signed-off-by: Alberto Faria <afaria@redhat.com>
Signed-off-by: Vincent Fu <vincent.fu@samsung.com>
HOWTO.rst
engines/libblkio.c
fio.1

index e9602f59f648a3f095b1ee47c4f0f2d6822dff14..1cea16c4be5de8fafc4102f936bdeca4cd412d19 100644 (file)
--- a/HOWTO.rst
+++ b/HOWTO.rst
@@ -2338,7 +2338,8 @@ with the caveat that when used on the command line, they must come after the
    [libblkio]
 
        Use poll queues. This is incompatible with
    [libblkio]
 
        Use poll queues. This is incompatible with
-       :option:`libblkio_wait_mode=eventfd <libblkio_wait_mode>`.
+       :option:`libblkio_wait_mode=eventfd <libblkio_wait_mode>` and
+       :option:`libblkio_force_enable_completion_eventfd`.
 
    [pvsync2]
 
 
    [pvsync2]
 
@@ -2907,6 +2908,12 @@ with the caveat that when used on the command line, they must come after the
        **loop**
                Use a busy loop with a non-blocking call to ``blkioq_do_io()``.
 
        **loop**
                Use a busy loop with a non-blocking call to ``blkioq_do_io()``.
 
+.. option:: libblkio_force_enable_completion_eventfd : [libblkio]
+
+       Enable the queue's completion eventfd even when unused. This may impact
+       performance. The default is to enable it only if
+       :option:`libblkio_wait_mode=eventfd <libblkio_wait_mode>`.
+
 I/O depth
 ~~~~~~~~~
 
 I/O depth
 ~~~~~~~~~
 
index 8a4828c394800873e47bbed2235caea0c139b93e..7f5dcf36bbc0a7145c6e9a00a14806eb9353d8d9 100644 (file)
@@ -24,7 +24,7 @@
 struct fio_blkio_data {
        struct blkio *b;
        struct blkioq *q;
 struct fio_blkio_data {
        struct blkio *b;
        struct blkioq *q;
-       int completion_fd; /* -1 if not FIO_BLKIO_WAIT_MODE_EVENTFD */
+       int completion_fd; /* may be -1 if not FIO_BLKIO_WAIT_MODE_EVENTFD */
 
        bool has_mem_region; /* whether mem_region is valid */
        struct blkio_mem_region mem_region; /* only if allocated by libblkio */
 
        bool has_mem_region; /* whether mem_region is valid */
        struct blkio_mem_region mem_region; /* only if allocated by libblkio */
@@ -50,6 +50,7 @@ struct fio_blkio_options {
        unsigned int vectored;
        unsigned int write_zeroes_on_trim;
        enum fio_blkio_wait_mode wait_mode;
        unsigned int vectored;
        unsigned int write_zeroes_on_trim;
        enum fio_blkio_wait_mode wait_mode;
+       unsigned int force_enable_completion_eventfd;
 };
 
 static struct fio_option options[] = {
 };
 
 static struct fio_option options[] = {
@@ -132,6 +133,16 @@ static struct fio_option options[] = {
                .category = FIO_OPT_C_ENGINE,
                .group  = FIO_OPT_G_LIBBLKIO,
        },
                .category = FIO_OPT_C_ENGINE,
                .group  = FIO_OPT_G_LIBBLKIO,
        },
+       {
+               .name   = "libblkio_force_enable_completion_eventfd",
+               .lname  = "Force enable the completion eventfd, even if unused",
+               .type   = FIO_OPT_STR_SET,
+               .off1   = offsetof(struct fio_blkio_options,
+                                  force_enable_completion_eventfd),
+               .help   = "This can impact performance",
+               .category = FIO_OPT_C_ENGINE,
+               .group  = FIO_OPT_G_LIBBLKIO,
+       },
        {
                .name = NULL,
        },
        {
                .name = NULL,
        },
@@ -276,6 +287,11 @@ static int fio_blkio_setup(struct thread_data *td)
                return 1;
        }
 
                return 1;
        }
 
+       if (options->hipri && options->force_enable_completion_eventfd) {
+               log_err("fio: option hipri is incompatible with option libblkio_force_enable_completion_eventfd\n");
+               return 1;
+       }
+
        if (fio_blkio_create_and_connect(td, &b) != 0)
                return 1;
 
        if (fio_blkio_create_and_connect(td, &b) != 0)
                return 1;
 
@@ -342,7 +358,8 @@ static int fio_blkio_init(struct thread_data *td)
        else
                data->q = blkio_get_queue(data->b, 0);
 
        else
                data->q = blkio_get_queue(data->b, 0);
 
-       if (options->wait_mode == FIO_BLKIO_WAIT_MODE_EVENTFD) {
+       if (options->wait_mode == FIO_BLKIO_WAIT_MODE_EVENTFD ||
+               options->force_enable_completion_eventfd) {
                /* enable completion fd and make it blocking */
                blkioq_set_completion_fd_enabled(data->q, true);
                data->completion_fd = blkioq_get_completion_fd(data->q);
                /* enable completion fd and make it blocking */
                blkioq_set_completion_fd_enabled(data->q, true);
                data->completion_fd = blkioq_get_completion_fd(data->q);
diff --git a/fio.1 b/fio.1
index 1a810214288d8cf5bc777455ca008270eddebdbb..da5483037bad06c224c99dc8b095b7709540d2fd 100644 (file)
--- a/fio.1
+++ b/fio.1
@@ -2633,7 +2633,8 @@ properties depend on the libblkio version in use and are listed at
 \fIhttps://libblkio.gitlab.io/libblkio/blkio.html#properties\fR
 .TP
 .BI (libblkio)hipri
 \fIhttps://libblkio.gitlab.io/libblkio/blkio.html#properties\fR
 .TP
 .BI (libblkio)hipri
-Use poll queues. This is incompatible with \fBlibblkio_wait_mode=eventfd\fR.
+Use poll queues. This is incompatible with \fBlibblkio_wait_mode=eventfd\fR and
+\fBlibblkio_force_enable_completion_eventfd\fR.
 .TP
 .BI (libblkio)libblkio_vectored
 Submit vectored read and write requests.
 .TP
 .BI (libblkio)libblkio_vectored
 Submit vectored read and write requests.
@@ -2654,6 +2655,13 @@ Use a blocking call to \fBread()\fR on the completion eventfd.
 .TP
 .B loop
 Use a busy loop with a non-blocking call to \fBblkioq_do_io()\fR.
 .TP
 .B loop
 Use a busy loop with a non-blocking call to \fBblkioq_do_io()\fR.
+.RE
+.RE
+.TP
+.BI (libblkio)libblkio_force_enable_completion_eventfd
+Enable the queue's completion eventfd even when unused. This may impact
+performance. The default is to enable it only if
+\fBlibblkio_wait_mode=eventfd\fR.
 .SS "I/O depth"
 .TP
 .BI iodepth \fR=\fPint
 .SS "I/O depth"
 .TP
 .BI iodepth \fR=\fPint