os: introduce ioprio_value() helper
authorDamien Le Moal <damien.lemoal@wdc.com>
Fri, 3 Sep 2021 15:20:23 +0000 (15:20 +0000)
committerJens Axboe <axboe@kernel.dk>
Fri, 3 Sep 2021 16:12:13 +0000 (10:12 -0600)
Introduce the ioprio_value() helper function to calculate a priority
value based on a priority class and priority level. For Linux and
Android, this is defined as an integer equal to the priority class
shifted left by 13 bits and or-ed with the priority level. For
Dragonfly, ioprio_value() simply returns the priority level as there
is no concept of priority class.

Use this new helper in the io_uring and libaio engines to set IO
priority when the cmdprio_percentage option is used.

Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
Signed-off-by: Niklas Cassel <niklas.cassel@wdc.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
engines/io_uring.c
engines/libaio.c
os/os-android.h
os/os-dragonfly.h
os/os-linux.h
os/os.h

index b8d4cf91287b78c3f31b9c2da367c17c55e2262c..4f8b558281d46ff78ad51f2f20d30af8b577c82a 100644 (file)
@@ -382,7 +382,7 @@ static void fio_ioring_prio_prep(struct thread_data *td, struct io_u *io_u)
        struct ioring_options *o = td->eo;
        struct ioring_data *ld = td->io_ops_data;
        if (rand_between(&td->prio_state, 0, 99) < o->cmdprio_percentage) {
-               ld->sqes[io_u->index].ioprio = IOPRIO_CLASS_RT << IOPRIO_CLASS_SHIFT;
+               ld->sqes[io_u->index].ioprio = ioprio_value(IOPRIO_CLASS_RT, 0);
                io_u->flags |= IO_U_F_PRIORITY;
        } else {
                ld->sqes[io_u->index].ioprio = 0;
index b909b79e9c7169f7898e2aa32be37f895cafe4a0..b12b6ffcefbbf364dd227a9d86592f26130156ca 100644 (file)
@@ -136,7 +136,7 @@ static void fio_libaio_prio_prep(struct thread_data *td, struct io_u *io_u)
 {
        struct libaio_options *o = td->eo;
        if (rand_between(&td->prio_state, 0, 99) < o->cmdprio_percentage) {
-               io_u->iocb.aio_reqprio = IOPRIO_CLASS_RT << IOPRIO_CLASS_SHIFT;
+               io_u->iocb.aio_reqprio = ioprio_value(IOPRIO_CLASS_RT, 0);
                io_u->iocb.u.c.flags |= IOCB_FLAG_IOPRIO;
                io_u->flags |= IO_U_F_PRIORITY;
        }
index a81cd815e1a7df5b0328fbda515edbfa10f40042..f013172fd8aa690a6d289e7b2bda13094c8e459d 100644 (file)
@@ -173,16 +173,21 @@ enum {
 #define IOPRIO_MIN_PRIO_CLASS  0
 #define IOPRIO_MAX_PRIO_CLASS  3
 
-static inline int ioprio_set(int which, int who, int ioprio_class, int ioprio)
+static inline int ioprio_value(int ioprio_class, int ioprio)
 {
        /*
         * If no class is set, assume BE
         */
-       if (!ioprio_class)
-               ioprio_class = IOPRIO_CLASS_BE;
+        if (!ioprio_class)
+                ioprio_class = IOPRIO_CLASS_BE;
+
+       return (ioprio_class << IOPRIO_CLASS_SHIFT) | ioprio;
+}
 
-       ioprio |= ioprio_class << IOPRIO_CLASS_SHIFT;
-       return syscall(__NR_ioprio_set, which, who, ioprio);
+static inline int ioprio_set(int which, int who, int ioprio_class, int ioprio)
+{
+       return syscall(__NR_ioprio_set, which, who,
+                      ioprio_value(ioprio_class, ioprio));
 }
 
 #ifndef BLKGETSIZE64
index 6e46589450eaaf6b318724d61a157813e92f144d..5b37a37e19fde5f1b328612968cee9975dd79065 100644 (file)
@@ -171,6 +171,7 @@ static inline int fio_getaffinity(int pid, os_cpu_mask_t *mask)
  * ioprio_set() with 4 arguments, so define fio's ioprio_set() as a macro.
  * Note that there is no idea of class within ioprio_set(2) unlike Linux.
  */
+#define ioprio_value(ioprio_class, ioprio)     (ioprio)
 #define ioprio_set(which, who, ioprio_class, ioprio)   \
        ioprio_set(which, who, ioprio)
 
index 16ed525881144cd190eb6457f5b313c6cf5d9188..12886037dd40ddf5dc3dafbd99be943253e4b78d 100644 (file)
@@ -118,16 +118,21 @@ enum {
 #define IOPRIO_MIN_PRIO_CLASS  0
 #define IOPRIO_MAX_PRIO_CLASS  3
 
-static inline int ioprio_set(int which, int who, int ioprio_class, int ioprio)
+static inline int ioprio_value(int ioprio_class, int ioprio)
 {
        /*
         * If no class is set, assume BE
         */
-       if (!ioprio_class)
-               ioprio_class = IOPRIO_CLASS_BE;
+        if (!ioprio_class)
+                ioprio_class = IOPRIO_CLASS_BE;
+
+       return (ioprio_class << IOPRIO_CLASS_SHIFT) | ioprio;
+}
 
-       ioprio |= ioprio_class << IOPRIO_CLASS_SHIFT;
-       return syscall(__NR_ioprio_set, which, who, ioprio);
+static inline int ioprio_set(int which, int who, int ioprio_class, int ioprio)
+{
+       return syscall(__NR_ioprio_set, which, who,
+                      ioprio_value(ioprio_class, ioprio));
 }
 
 #ifndef CONFIG_HAVE_GETTID
diff --git a/os/os.h b/os/os.h
index 17daf91d6f39ed16cb01f1637f5ce68db2ff5134..f2257a7c615f517cd89759cd44eeb1d53fdec35e 100644 (file)
--- a/os/os.h
+++ b/os/os.h
@@ -118,6 +118,7 @@ extern int fio_cpus_split(os_cpu_mask_t *mask, unsigned int cpu);
 #endif
 
 #ifndef FIO_HAVE_IOPRIO
+#define ioprio_value(prioclass, prio)  (0)
 #define ioprio_set(which, who, prioclass, prio)        (0)
 #endif