libaio,io_uring: relax cmdprio_percentage constraints
[fio.git] / engines / libaio.c
index 9fba3b12f85637809f571e05426fe82f74b41729..62c8aed72d0f35f4b4c9586d8e48cc7dc0b8a607 100644 (file)
@@ -211,11 +211,25 @@ static void fio_libaio_prio_prep(struct thread_data *td, struct io_u *io_u)
        struct cmdprio *cmdprio = &o->cmdprio;
        enum fio_ddir ddir = io_u->ddir;
        unsigned int p = fio_cmdprio_percentage(cmdprio, io_u);
+       unsigned int cmdprio_value =
+               ioprio_value(cmdprio->class[ddir], cmdprio->level[ddir]);
 
        if (p && rand_between(&td->prio_state, 0, 99) < p) {
-               io_u->iocb.aio_reqprio =
-                       ioprio_value(cmdprio->class[ddir], cmdprio->level[ddir]);
+               io_u->iocb.aio_reqprio = cmdprio_value;
                io_u->iocb.u.c.flags |= IOCB_FLAG_IOPRIO;
+               if (!td->ioprio || cmdprio_value < td->ioprio) {
+                       /*
+                        * The async IO priority is higher (has a lower value)
+                        * than the default context priority.
+                        */
+                       io_u->flags |= IO_U_F_PRIORITY;
+               }
+       } else if (td->ioprio && td->ioprio < cmdprio_value) {
+               /*
+                * The IO will be executed with the default context priority,
+                * and this priority is higher (has a lower value) than the
+                * async IO priority.
+                */
                io_u->flags |= IO_U_F_PRIORITY;
        }
 }