Add initial support for Linux to allow specifying a hint for any
priority value. With this change, a priority value becomes the
combination of a priority class, a priority level and a hint.
The generic os.h ioprio manipulation macros, as well as the
os-dragonfly.h ioprio manipulation macros are modified to ignore this
hint.
For all other OSes that do not support priority classes, priotity hints
are ignored and always equal to 0.
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-4-dlemoal@kernel.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
/* ioprio_set() has to be done before td_io_init() */
if (fio_option_is_set(o, ioprio) ||
fio_option_is_set(o, ioprio_class)) {
- ret = ioprio_set(IOPRIO_WHO_PROCESS, 0, o->ioprio_class, o->ioprio);
+ ret = ioprio_set(IOPRIO_WHO_PROCESS, 0, o->ioprio_class,
+ o->ioprio, 0);
if (ret == -1) {
td_verror(td, errno, "ioprio_set");
goto err;
}
- td->ioprio = ioprio_value(o->ioprio_class, o->ioprio);
+ td->ioprio = ioprio_value(o->ioprio_class, o->ioprio, 0);
td->ts.ioprio = td->ioprio;
}
prio = &cmdprio->perc_entry[ddir];
prio->perc = options->percentage[ddir];
prio->prio = ioprio_value(options->class[ddir],
- options->level[ddir]);
+ options->level[ddir], 0);
assign_clat_prio_index(prio, &values[ddir]);
ret = init_ts_clat_prio(ts, ddir, &values[ddir]);
goto err;
implicit_cmdprio = ioprio_value(options->class[ddir],
- options->level[ddir]);
+ options->level[ddir], 0);
ret = fio_cmdprio_generate_bsprio_desc(&cmdprio->bsprio_desc[ddir],
&parse_res[ddir],
case 4: /* bs/perc/class/level case */
class = min(class, (unsigned int) IOPRIO_MAX_PRIO_CLASS);
level = min(level, (unsigned int) IOPRIO_MAX_PRIO);
- entry->prio = ioprio_value(class, level);
+ entry->prio = ioprio_value(class, level, 0);
break;
default:
log_err("fio: invalid cmdprio_bssplit format\n");
* 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) \
+#define ioprio_value(ioprio_class, ioprio, ioprio_hint) (ioprio)
+#define ioprio_set(which, who, ioprio_class, ioprio, ioprio_hint) \
ioprio_set(which, who, ioprio)
#define ioprio(ioprio) (ioprio)
#define IOPRIO_BITS 16
#define IOPRIO_CLASS_SHIFT 13
+#define IOPRIO_HINT_BITS 10
+#define IOPRIO_HINT_SHIFT 3
+
#define IOPRIO_MIN_PRIO 0 /* highest priority */
#define IOPRIO_MAX_PRIO 7 /* lowest priority */
#define IOPRIO_MIN_PRIO_CLASS 0
#define IOPRIO_MAX_PRIO_CLASS 3
+#define IOPRIO_MIN_PRIO_HINT 0
+#define IOPRIO_MAX_PRIO_HINT ((1 << IOPRIO_HINT_BITS) - 1)
+
#define ioprio_class(ioprio) ((ioprio) >> IOPRIO_CLASS_SHIFT)
#define ioprio(ioprio) ((ioprio) & IOPRIO_MAX_PRIO)
+#define ioprio_hint(ioprio) \
+ (((ioprio) >> IOPRIO_HINT_SHIFT) & IOPRIO_MAX_PRIO_HINT)
-static inline int ioprio_value(int ioprio_class, int ioprio)
+static inline int ioprio_value(int ioprio_class, int ioprio, int ioprio_hint)
{
/*
* If no class is set, assume BE
if (!ioprio_class)
ioprio_class = IOPRIO_CLASS_BE;
- return (ioprio_class << IOPRIO_CLASS_SHIFT) | ioprio;
+ return (ioprio_class << IOPRIO_CLASS_SHIFT) |
+ (ioprio_hint << IOPRIO_HINT_SHIFT) |
+ ioprio;
}
static inline bool ioprio_value_is_class_rt(unsigned int priority)
return ioprio_class(priority) == IOPRIO_CLASS_RT;
}
-static inline int ioprio_set(int which, int who, int ioprio_class, int ioprio)
+static inline int ioprio_set(int which, int who, int ioprio_class, int ioprio,
+ int ioprio_hint)
{
return syscall(__NR_ioprio_set, which, who,
- ioprio_value(ioprio_class, ioprio));
+ ioprio_value(ioprio_class, ioprio, ioprio_hint));
}
#ifndef CONFIG_HAVE_GETTID
#define ioprio_value_is_class_rt(prio) (false)
#define IOPRIO_MIN_PRIO_CLASS 0
#define IOPRIO_MAX_PRIO_CLASS 0
+#define ioprio_hint(prio) 0
+#define IOPRIO_MIN_PRIO_HINT 0
+#define IOPRIO_MAX_PRIO_HINT 0
#endif
#ifndef FIO_HAVE_IOPRIO
-#define ioprio_value(prioclass, prio) (0)
+#define ioprio_value(prioclass, prio, priohint) (0)
#define ioprio(ioprio) 0
-#define ioprio_set(which, who, prioclass, prio) (0)
+#define ioprio_set(which, who, prioclass, prio, priohint) (0)
#define IOPRIO_MIN_PRIO 0
#define IOPRIO_MAX_PRIO 0
#endif