cmdprio: Introduce generic option definitions
authorDamien Le Moal <dlemoal@kernel.org>
Fri, 21 Jul 2023 11:05:06 +0000 (20:05 +0900)
committerJens Axboe <axboe@kernel.dk>
Fri, 21 Jul 2023 20:07:28 +0000 (14:07 -0600)
The definition of the per-I/O priority options for the io_uring and
libaio I/O engines are almost identical, differing only by the option
group and option data structure used.

Introduce the CMDPRIO_OPTIONS macro in engines/cmdprio.h to generically
define these options in the io_uring and libaio engines to simplify the
code.

Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Niklas Cassel <niklas.cassel@wdc.com>
Link: https://lore.kernel.org/r/20230721110510.44772-3-dlemoal@kernel.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
engines/cmdprio.h
engines/io_uring.c
engines/libaio.c

index 755da8d0f8fff654bc81c5f0ca04ba02aa79ec1c..2c9d87bc2f923bd74e225b2f4f897f1c68753a2a 100644 (file)
@@ -7,6 +7,7 @@
 #define FIO_CMDPRIO_H
 
 #include "../fio.h"
+#include "../optgroup.h"
 
 /* read and writes only, no trim */
 #define CMDPRIO_RWDIR_CNT 2
@@ -42,6 +43,89 @@ struct cmdprio_options {
        char *bssplit_str;
 };
 
+#ifdef FIO_HAVE_IOPRIO_CLASS
+#define CMDPRIO_OPTIONS(opt_struct, opt_group)                                 \
+       {                                                                       \
+               .name   = "cmdprio_percentage",                                 \
+               .lname  = "high priority percentage",                           \
+               .type   = FIO_OPT_INT,                                          \
+               .off1   = offsetof(opt_struct,                                  \
+                                  cmdprio_options.percentage[DDIR_READ]),      \
+               .off2   = offsetof(opt_struct,                                  \
+                                  cmdprio_options.percentage[DDIR_WRITE]),     \
+               .minval = 0,                                                    \
+               .maxval = 100,                                                  \
+               .help   = "Send high priority I/O this percentage of the time", \
+               .category = FIO_OPT_C_ENGINE,                                   \
+               .group  = opt_group,                                            \
+       },                                                                      \
+       {                                                                       \
+               .name   = "cmdprio_class",                                      \
+               .lname  = "Asynchronous I/O priority class",                    \
+               .type   = FIO_OPT_INT,                                          \
+               .off1   = offsetof(opt_struct,                                  \
+                                  cmdprio_options.class[DDIR_READ]),           \
+               .off2   = offsetof(opt_struct,                                  \
+                                  cmdprio_options.class[DDIR_WRITE]),          \
+               .help   = "Set asynchronous IO priority class",                 \
+               .minval = IOPRIO_MIN_PRIO_CLASS + 1,                            \
+               .maxval = IOPRIO_MAX_PRIO_CLASS,                                \
+               .interval = 1,                                                  \
+               .category = FIO_OPT_C_ENGINE,                                   \
+               .group  = opt_group,                                            \
+       },                                                                      \
+       {                                                                       \
+               .name   = "cmdprio",                                            \
+               .lname  = "Asynchronous I/O priority level",                    \
+               .type   = FIO_OPT_INT,                                          \
+               .off1   = offsetof(opt_struct,                                  \
+                                  cmdprio_options.level[DDIR_READ]),           \
+               .off2   = offsetof(opt_struct,                                  \
+                                  cmdprio_options.level[DDIR_WRITE]),          \
+               .help   = "Set asynchronous IO priority level",                 \
+               .minval = IOPRIO_MIN_PRIO,                                      \
+               .maxval = IOPRIO_MAX_PRIO,                                      \
+               .interval = 1,                                                  \
+               .category = FIO_OPT_C_ENGINE,                                   \
+               .group  = opt_group,                                            \
+       },                                                                      \
+       {                                                                       \
+               .name   = "cmdprio_bssplit",                                    \
+               .lname  = "Priority percentage block size split",               \
+               .type   = FIO_OPT_STR_STORE,                                    \
+               .off1   = offsetof(opt_struct, cmdprio_options.bssplit_str),    \
+               .help   = "Set priority percentages for different block sizes", \
+               .category = FIO_OPT_C_ENGINE,                                   \
+               .group  = opt_group,                                            \
+       }
+#else
+#define CMDPRIO_OPTIONS(opt_struct, opt_group)                                 \
+       {                                                                       \
+               .name   = "cmdprio_percentage",                                 \
+               .lname  = "high priority percentage",                           \
+               .type   = FIO_OPT_UNSUPPORTED,                                  \
+               .help   = "Platform does not support I/O priority classes",     \
+       },                                                                      \
+       {                                                                       \
+               .name   = "cmdprio_class",                                      \
+               .lname  = "Asynchronous I/O priority class",                    \
+               .type   = FIO_OPT_UNSUPPORTED,                                  \
+               .help   = "Platform does not support I/O priority classes",     \
+       },                                                                      \
+       {                                                                       \
+               .name   = "cmdprio",                                            \
+               .lname  = "Asynchronous I/O priority level",                    \
+               .type   = FIO_OPT_UNSUPPORTED,                                  \
+               .help   = "Platform does not support I/O priority classes",     \
+       },                                                                      \
+       {                                                                       \
+               .name   = "cmdprio_bssplit",                                    \
+               .lname  = "Priority percentage block size split",               \
+               .type   = FIO_OPT_UNSUPPORTED,                                  \
+               .help   = "Platform does not support I/O priority classes",     \
+       }
+#endif
+
 struct cmdprio {
        struct cmdprio_options *options;
        struct cmdprio_prio perc_entry[CMDPRIO_RWDIR_CNT];
index f30a3c00cea943948676227a01bf71d610cd5051..5613c4c69155c328127b80a5f13dc04efb7587c1 100644 (file)
@@ -127,87 +127,6 @@ static struct fio_option options[] = {
                .category = FIO_OPT_C_ENGINE,
                .group  = FIO_OPT_G_IOURING,
        },
-#ifdef FIO_HAVE_IOPRIO_CLASS
-       {
-               .name   = "cmdprio_percentage",
-               .lname  = "high priority percentage",
-               .type   = FIO_OPT_INT,
-               .off1   = offsetof(struct ioring_options,
-                                  cmdprio_options.percentage[DDIR_READ]),
-               .off2   = offsetof(struct ioring_options,
-                                  cmdprio_options.percentage[DDIR_WRITE]),
-               .minval = 0,
-               .maxval = 100,
-               .help   = "Send high priority I/O this percentage of the time",
-               .category = FIO_OPT_C_ENGINE,
-               .group  = FIO_OPT_G_IOURING,
-       },
-       {
-               .name   = "cmdprio_class",
-               .lname  = "Asynchronous I/O priority class",
-               .type   = FIO_OPT_INT,
-               .off1   = offsetof(struct ioring_options,
-                                  cmdprio_options.class[DDIR_READ]),
-               .off2   = offsetof(struct ioring_options,
-                                  cmdprio_options.class[DDIR_WRITE]),
-               .help   = "Set asynchronous IO priority class",
-               .minval = IOPRIO_MIN_PRIO_CLASS + 1,
-               .maxval = IOPRIO_MAX_PRIO_CLASS,
-               .interval = 1,
-               .category = FIO_OPT_C_ENGINE,
-               .group  = FIO_OPT_G_IOURING,
-       },
-       {
-               .name   = "cmdprio",
-               .lname  = "Asynchronous I/O priority level",
-               .type   = FIO_OPT_INT,
-               .off1   = offsetof(struct ioring_options,
-                                  cmdprio_options.level[DDIR_READ]),
-               .off2   = offsetof(struct ioring_options,
-                                  cmdprio_options.level[DDIR_WRITE]),
-               .help   = "Set asynchronous IO priority level",
-               .minval = IOPRIO_MIN_PRIO,
-               .maxval = IOPRIO_MAX_PRIO,
-               .interval = 1,
-               .category = FIO_OPT_C_ENGINE,
-               .group  = FIO_OPT_G_IOURING,
-       },
-       {
-               .name   = "cmdprio_bssplit",
-               .lname  = "Priority percentage block size split",
-               .type   = FIO_OPT_STR_STORE,
-               .off1   = offsetof(struct ioring_options,
-                                  cmdprio_options.bssplit_str),
-               .help   = "Set priority percentages for different block sizes",
-               .category = FIO_OPT_C_ENGINE,
-               .group  = FIO_OPT_G_IOURING,
-       },
-#else
-       {
-               .name   = "cmdprio_percentage",
-               .lname  = "high priority percentage",
-               .type   = FIO_OPT_UNSUPPORTED,
-               .help   = "Your platform does not support I/O priority classes",
-       },
-       {
-               .name   = "cmdprio_class",
-               .lname  = "Asynchronous I/O priority class",
-               .type   = FIO_OPT_UNSUPPORTED,
-               .help   = "Your platform does not support I/O priority classes",
-       },
-       {
-               .name   = "cmdprio",
-               .lname  = "Asynchronous I/O priority level",
-               .type   = FIO_OPT_UNSUPPORTED,
-               .help   = "Your platform does not support I/O priority classes",
-       },
-       {
-               .name   = "cmdprio_bssplit",
-               .lname  = "Priority percentage block size split",
-               .type   = FIO_OPT_UNSUPPORTED,
-               .help   = "Your platform does not support I/O priority classes",
-       },
-#endif
        {
                .name   = "fixedbufs",
                .lname  = "Fixed (pre-mapped) IO buffers",
@@ -297,6 +216,7 @@ static struct fio_option options[] = {
                .category = FIO_OPT_C_ENGINE,
                .group  = FIO_OPT_G_IOURING,
        },
+       CMDPRIO_OPTIONS(struct ioring_options, FIO_OPT_G_IOURING),
        {
                .name   = NULL,
        },
index 6a0745aad6e34d6c364985d039e2b0cd17f4f113..aaccc7ce097fc6db724fdcea9f4e8b60cc42fa4a 100644 (file)
@@ -72,87 +72,6 @@ static struct fio_option options[] = {
                .category = FIO_OPT_C_ENGINE,
                .group  = FIO_OPT_G_LIBAIO,
        },
-#ifdef FIO_HAVE_IOPRIO_CLASS
-       {
-               .name   = "cmdprio_percentage",
-               .lname  = "high priority percentage",
-               .type   = FIO_OPT_INT,
-               .off1   = offsetof(struct libaio_options,
-                                  cmdprio_options.percentage[DDIR_READ]),
-               .off2   = offsetof(struct libaio_options,
-                                  cmdprio_options.percentage[DDIR_WRITE]),
-               .minval = 0,
-               .maxval = 100,
-               .help   = "Send high priority I/O this percentage of the time",
-               .category = FIO_OPT_C_ENGINE,
-               .group  = FIO_OPT_G_LIBAIO,
-       },
-       {
-               .name   = "cmdprio_class",
-               .lname  = "Asynchronous I/O priority class",
-               .type   = FIO_OPT_INT,
-               .off1   = offsetof(struct libaio_options,
-                                  cmdprio_options.class[DDIR_READ]),
-               .off2   = offsetof(struct libaio_options,
-                                  cmdprio_options.class[DDIR_WRITE]),
-               .help   = "Set asynchronous IO priority class",
-               .minval = IOPRIO_MIN_PRIO_CLASS + 1,
-               .maxval = IOPRIO_MAX_PRIO_CLASS,
-               .interval = 1,
-               .category = FIO_OPT_C_ENGINE,
-               .group  = FIO_OPT_G_LIBAIO,
-       },
-       {
-               .name   = "cmdprio",
-               .lname  = "Asynchronous I/O priority level",
-               .type   = FIO_OPT_INT,
-               .off1   = offsetof(struct libaio_options,
-                                  cmdprio_options.level[DDIR_READ]),
-               .off2   = offsetof(struct libaio_options,
-                                  cmdprio_options.level[DDIR_WRITE]),
-               .help   = "Set asynchronous IO priority level",
-               .minval = IOPRIO_MIN_PRIO,
-               .maxval = IOPRIO_MAX_PRIO,
-               .interval = 1,
-               .category = FIO_OPT_C_ENGINE,
-               .group  = FIO_OPT_G_LIBAIO,
-       },
-       {
-               .name   = "cmdprio_bssplit",
-               .lname  = "Priority percentage block size split",
-               .type   = FIO_OPT_STR_STORE,
-               .off1   = offsetof(struct libaio_options,
-                                  cmdprio_options.bssplit_str),
-               .help   = "Set priority percentages for different block sizes",
-               .category = FIO_OPT_C_ENGINE,
-               .group  = FIO_OPT_G_LIBAIO,
-       },
-#else
-       {
-               .name   = "cmdprio_percentage",
-               .lname  = "high priority percentage",
-               .type   = FIO_OPT_UNSUPPORTED,
-               .help   = "Your platform does not support I/O priority classes",
-       },
-       {
-               .name   = "cmdprio_class",
-               .lname  = "Asynchronous I/O priority class",
-               .type   = FIO_OPT_UNSUPPORTED,
-               .help   = "Your platform does not support I/O priority classes",
-       },
-       {
-               .name   = "cmdprio",
-               .lname  = "Asynchronous I/O priority level",
-               .type   = FIO_OPT_UNSUPPORTED,
-               .help   = "Your platform does not support I/O priority classes",
-       },
-       {
-               .name   = "cmdprio_bssplit",
-               .lname  = "Priority percentage block size split",
-               .type   = FIO_OPT_UNSUPPORTED,
-               .help   = "Your platform does not support I/O priority classes",
-       },
-#endif
        {
                .name   = "nowait",
                .lname  = "RWF_NOWAIT",
@@ -162,6 +81,7 @@ static struct fio_option options[] = {
                .category = FIO_OPT_C_ENGINE,
                .group  = FIO_OPT_G_LIBAIO,
        },
+       CMDPRIO_OPTIONS(struct libaio_options, FIO_OPT_G_LIBAIO),
        {
                .name   = NULL,
        },