static int fio_cmdprio_percentage(struct cmdprio *cmdprio, struct io_u *io_u)
{
enum fio_ddir ddir = io_u->ddir;
- unsigned int p = cmdprio->percentage[ddir];
int i;
- /*
- * If cmdprio_percentage option was specified, then use that
- * percentage. Otherwise, use cmdprio_bssplit percentages depending
- * on the IO size.
- */
- if (p)
- return p;
-
- for (i = 0; i < cmdprio->bssplit_nr[ddir]; i++) {
- if (cmdprio->bssplit[ddir][i].bs == io_u->buflen)
- return cmdprio->bssplit[ddir][i].perc;
+ switch (cmdprio->mode) {
+ case CMDPRIO_MODE_PERC:
+ return cmdprio->percentage[ddir];
+ case CMDPRIO_MODE_BSSPLIT:
+ for (i = 0; i < cmdprio->bssplit_nr[ddir]; i++) {
+ if (cmdprio->bssplit[ddir][i].bs == io_u->buflen)
+ return cmdprio->bssplit[ddir][i].perc;
+ }
+ break;
+ default:
+ /*
+ * An I/O engine should never call this function if cmdprio
+ * is not is use.
+ */
+ assert(0);
}
return 0;
struct io_u *io_u)
{
enum fio_ddir ddir = io_u->ddir;
- unsigned int p = fio_cmdprio_percentage(cmdprio, io_u);
+ unsigned int p;
unsigned int cmdprio_value =
ioprio_value(cmdprio->class[ddir], cmdprio->level[ddir]);
+ p = fio_cmdprio_percentage(cmdprio, io_u);
if (p && rand_between(&td->prio_state, 0, 99) < p) {
io_u->ioprio = cmdprio_value;
if (!td->ioprio || cmdprio_value < td->ioprio) {
return false;
}
-int fio_cmdprio_init(struct thread_data *td, struct cmdprio *cmdprio,
- bool *has_cmdprio)
+int fio_cmdprio_init(struct thread_data *td, struct cmdprio *cmdprio)
{
struct thread_options *to = &td->o;
bool has_cmdprio_percentage = false;
return 1;
}
- *has_cmdprio = has_cmdprio_percentage || has_cmdprio_bssplit;
+ if (has_cmdprio_bssplit)
+ cmdprio->mode = CMDPRIO_MODE_BSSPLIT;
+ else if (has_cmdprio_percentage)
+ cmdprio->mode = CMDPRIO_MODE_PERC;
+ else
+ cmdprio->mode = CMDPRIO_MODE_NONE;
return 0;
}
/* read and writes only, no trim */
#define CMDPRIO_RWDIR_CNT 2
+enum {
+ CMDPRIO_MODE_NONE,
+ CMDPRIO_MODE_PERC,
+ CMDPRIO_MODE_BSSPLIT,
+};
+
struct cmdprio {
unsigned int percentage[CMDPRIO_RWDIR_CNT];
unsigned int class[CMDPRIO_RWDIR_CNT];
unsigned int level[CMDPRIO_RWDIR_CNT];
unsigned int bssplit_nr[CMDPRIO_RWDIR_CNT];
struct bssplit *bssplit[CMDPRIO_RWDIR_CNT];
+ unsigned int mode;
};
int fio_cmdprio_bssplit_parse(struct thread_data *td, const char *input,
bool fio_cmdprio_set_ioprio(struct thread_data *td, struct cmdprio *cmdprio,
struct io_u *io_u);
-int fio_cmdprio_init(struct thread_data *td, struct cmdprio *cmdprio,
- bool *has_cmdprio);
+int fio_cmdprio_init(struct thread_data *td, struct cmdprio *cmdprio);
#endif
int prepped;
struct ioring_mmap mmap[3];
-
- bool use_cmdprio;
};
struct ioring_options {
{
struct ioring_data *ld = td->io_ops_data;
struct io_sq_ring *ring = &ld->sq_ring;
+ struct ioring_options *o = td->eo;
unsigned tail, next_tail;
fio_ro_check(td, io_u);
if (next_tail == atomic_load_acquire(ring->head))
return FIO_Q_BUSY;
- if (ld->use_cmdprio)
+ if (o->cmdprio.mode != CMDPRIO_MODE_NONE)
fio_ioring_cmdprio_prep(td, io_u);
ring->array[tail & ld->sq_ring_mask] = io_u->index;
td->io_ops_data = ld;
- ret = fio_cmdprio_init(td, cmdprio, &ld->use_cmdprio);
+ ret = fio_cmdprio_init(td, cmdprio);
if (ret) {
td_verror(td, EINVAL, "fio_ioring_init");
return 1;
unsigned int queued;
unsigned int head;
unsigned int tail;
-
- bool use_cmdprio;
};
struct libaio_options {
struct io_u *io_u)
{
struct libaio_data *ld = td->io_ops_data;
+ struct libaio_options *o = td->eo;
fio_ro_check(td, io_u);
return FIO_Q_COMPLETED;
}
- if (ld->use_cmdprio)
+ if (o->cmdprio.mode != CMDPRIO_MODE_NONE)
fio_libaio_cmdprio_prep(td, io_u);
ld->iocbs[ld->head] = &io_u->iocb;
td->io_ops_data = ld;
- ret = fio_cmdprio_init(td, cmdprio, &ld->use_cmdprio);
+ ret = fio_cmdprio_init(td, cmdprio);
if (ret) {
td_verror(td, EINVAL, "fio_libaio_init");
return 1;