options: add priohint option
authorDamien Le Moal <dlemoal@kernel.org>
Fri, 21 Jul 2023 11:05:08 +0000 (20:05 +0900)
committerJens Axboe <axboe@kernel.dk>
Fri, 21 Jul 2023 20:07:28 +0000 (14:07 -0600)
Introduce the new option priohint to allow users to specify an I/O
priority hint applying to all IOs issued by a job. This increases fio
server version (FIO_SERVER_VER) to 101.

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-5-dlemoal@kernel.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
HOWTO.rst
backend.c
cconv.c
fio.1
options.c
server.h
thread_options.h

index 7fe70fbdd0ba8425fe759fa2e116ff7e6bb47024..d1a476e4941ddf726ea7655438450bd5aa0298cc 100644 (file)
--- a/HOWTO.rst
+++ b/HOWTO.rst
@@ -3436,6 +3436,15 @@ Threads, processes and job synchronization
        priority setting, see I/O engine specific :option:`cmdprio_percentage`
        and :option:`cmdprio_class` options.
 
+.. option:: priohint=int
+
+       Set the I/O priority hint. This is only applicable to platforms that
+       support I/O priority classes and to devices with features controlled
+       through priority hints, e.g. block devices supporting command duration
+       limits, or CDL. CDL is a way to indicate the desired maximum latency
+       of I/Os so that the device can optimize its internal command scheduling
+       according to the latency limits indicated by the user.
+
 .. option:: cpus_allowed=str
 
        Controls the same options as :option:`cpumask`, but accepts a textual
index 7e1c37733a862e1f54b1b814b9f14455e2f9a332..5f0740395bad36cd9d13c30bf6bb9d871805c785 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -1799,14 +1799,16 @@ static void *thread_main(void *data)
 
        /* ioprio_set() has to be done before td_io_init() */
        if (fio_option_is_set(o, ioprio) ||
-           fio_option_is_set(o, ioprio_class)) {
+           fio_option_is_set(o, ioprio_class) ||
+           fio_option_is_set(o, ioprio_hint)) {
                ret = ioprio_set(IOPRIO_WHO_PROCESS, 0, o->ioprio_class,
-                                o->ioprio, 0);
+                                o->ioprio, o->ioprio_hint);
                if (ret == -1) {
                        td_verror(td, errno, "ioprio_set");
                        goto err;
                }
-               td->ioprio = ioprio_value(o->ioprio_class, o->ioprio, 0);
+               td->ioprio = ioprio_value(o->ioprio_class, o->ioprio,
+                                         o->ioprio_hint);
                td->ts.ioprio = td->ioprio;
        }
 
diff --git a/cconv.c b/cconv.c
index 1bfa770f618f71d086171307af736bbd1119e444..ce6acbe6abd0d829966c49f016571ee3057ccd1d 100644 (file)
--- a/cconv.c
+++ b/cconv.c
@@ -281,6 +281,7 @@ int convert_thread_options_to_cpu(struct thread_options *o,
        o->nice = le32_to_cpu(top->nice);
        o->ioprio = le32_to_cpu(top->ioprio);
        o->ioprio_class = le32_to_cpu(top->ioprio_class);
+       o->ioprio_hint = le32_to_cpu(top->ioprio_hint);
        o->file_service_type = le32_to_cpu(top->file_service_type);
        o->group_reporting = le32_to_cpu(top->group_reporting);
        o->stats = le32_to_cpu(top->stats);
@@ -496,6 +497,7 @@ void convert_thread_options_to_net(struct thread_options_pack *top,
        top->nice = cpu_to_le32(o->nice);
        top->ioprio = cpu_to_le32(o->ioprio);
        top->ioprio_class = cpu_to_le32(o->ioprio_class);
+       top->ioprio_hint = cpu_to_le32(o->ioprio_hint);
        top->file_service_type = cpu_to_le32(o->file_service_type);
        top->group_reporting = cpu_to_le32(o->group_reporting);
        top->stats = cpu_to_le32(o->stats);
diff --git a/fio.1 b/fio.1
index 20acd081c39ec89d7c2e180c62e56534477cfbc8..e2a363272c7d3786f3d76be607ae029b580374fa 100644 (file)
--- a/fio.1
+++ b/fio.1
@@ -3144,6 +3144,14 @@ Set the I/O priority class. See man \fBionice\fR\|(1). For per-command
 priority setting, see the I/O engine specific `cmdprio_percentage` and
 `cmdprio_class` options.
 .TP
+.BI priohint \fR=\fPint
+Set the I/O priority hint. This is only applicable to platforms that support
+I/O priority classes and to devices with features controlled through priority
+hints, e.g. block devices supporting command duration limits, or CDL. CDL is a
+way to indicate the desired maximum latency of I/Os so that the device can
+optimize its internal command scheduling according to the latency limits
+indicated by the user.
+.TP
 .BI cpus_allowed \fR=\fPstr
 Controls the same options as \fBcpumask\fR, but accepts a textual
 specification of the permitted CPUs instead and CPUs are indexed from 0. So
index 143d358384f8e827b56e1b9fddf4f83daf647be5..56672960a7256628d0c0e9a2e486f7f446d16220 100644 (file)
--- a/options.c
+++ b/options.c
@@ -3806,6 +3806,18 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .category = FIO_OPT_C_GENERAL,
                .group  = FIO_OPT_G_CRED,
        },
+       {
+               .name   = "priohint",
+               .lname  = "I/O nice priority hint",
+               .type   = FIO_OPT_INT,
+               .off1   = offsetof(struct thread_options, ioprio_hint),
+               .help   = "Set job IO priority hint",
+               .minval = IOPRIO_MIN_PRIO_HINT,
+               .maxval = IOPRIO_MAX_PRIO_HINT,
+               .interval = 1,
+               .category = FIO_OPT_C_GENERAL,
+               .group  = FIO_OPT_G_CRED,
+       },
 #else
        {
                .name   = "prioclass",
@@ -3813,6 +3825,12 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .type   = FIO_OPT_UNSUPPORTED,
                .help   = "Your platform does not support IO priority classes",
        },
+       {
+               .name   = "priohint",
+               .lname  = "I/O nice priority hint",
+               .type   = FIO_OPT_UNSUPPORTED,
+               .help   = "Your platform does not support IO priority hints",
+       },
 #endif
        {
                .name   = "thinktime",
index 601d3340435167aa99428b6b922d7a89104c83ce..ad7061184b6c113f5871fdc8815061d82aaaebe5 100644 (file)
--- a/server.h
+++ b/server.h
@@ -51,7 +51,7 @@ struct fio_net_cmd_reply {
 };
 
 enum {
-       FIO_SERVER_VER                  = 100,
+       FIO_SERVER_VER                  = 101,
 
        FIO_SERVER_MAX_FRAGMENT_PDU     = 1024,
        FIO_SERVER_MAX_CMD_MB           = 2048,
index 1715b36c672b31d48b2a5dbb8700a96e9ed1ab01..38a9993d23a3eef4395d450ed73253a1d1ee5e2a 100644 (file)
@@ -248,6 +248,7 @@ struct thread_options {
        unsigned int nice;
        unsigned int ioprio;
        unsigned int ioprio_class;
+       unsigned int ioprio_hint;
        unsigned int file_service_type;
        unsigned int group_reporting;
        unsigned int stats;
@@ -568,6 +569,7 @@ struct thread_options_pack {
        uint32_t nice;
        uint32_t ioprio;
        uint32_t ioprio_class;
+       uint32_t ioprio_hint;
        uint32_t file_service_type;
        uint32_t group_reporting;
        uint32_t stats;
@@ -601,7 +603,6 @@ struct thread_options_pack {
        uint32_t lat_percentiles;
        uint32_t slat_percentiles;
        uint32_t percentile_precision;
-       uint32_t pad5;
        fio_fp64_t percentile_list[FIO_IO_U_LIST_MAX_LEN];
 
        uint8_t read_iolog_file[FIO_TOP_STR_MAX];