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>
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) {
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;
io_u->flags |= IO_U_F_PRIORITY;
} else {
ld->sqes[io_u->index].ioprio = 0;
{
struct libaio_options *o = td->eo;
if (rand_between(&td->prio_state, 0, 99) < o->cmdprio_percentage) {
{
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;
}
io_u->iocb.u.c.flags |= IOCB_FLAG_IOPRIO;
io_u->flags |= IO_U_F_PRIORITY;
}
#define IOPRIO_MIN_PRIO_CLASS 0
#define IOPRIO_MAX_PRIO_CLASS 3
#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 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));
* 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.
*/
* 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)
#define ioprio_set(which, who, ioprio_class, ioprio) \
ioprio_set(which, who, ioprio)
#define IOPRIO_MIN_PRIO_CLASS 0
#define IOPRIO_MAX_PRIO_CLASS 3
#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 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
}
#ifndef CONFIG_HAVE_GETTID
#endif
#ifndef FIO_HAVE_IOPRIO
#endif
#ifndef FIO_HAVE_IOPRIO
+#define ioprio_value(prioclass, prio) (0)
#define ioprio_set(which, who, prioclass, prio) (0)
#endif
#define ioprio_set(which, who, prioclass, prio) (0)
#endif