From: Niklas Cassel <niklas.cassel@xxxxxxx> Move cmdprio function definitions from the cmdprio.h header file to a new cmdprio.c file, such that we can add new static functions to cmdprio.c. A follow up patch will add new cmdprio functions which do not need to be directly accessible by ioengines. Signed-off-by: Niklas Cassel <niklas.cassel@xxxxxxx> Reviewed-by: Damien Le Moal <damien.lemoal@xxxxxxxxxxxxxxxxxx> --- Makefile | 6 +++ engines/cmdprio.c | 130 ++++++++++++++++++++++++++++++++++++++++++++++ engines/cmdprio.h | 127 ++------------------------------------------ 3 files changed, 141 insertions(+), 122 deletions(-) create mode 100644 engines/cmdprio.c diff --git a/Makefile b/Makefile index 4ae5a371..e9028dce 100644 --- a/Makefile +++ b/Makefile @@ -98,6 +98,7 @@ else ifdef CONFIG_32BIT endif ifdef CONFIG_LIBAIO libaio_SRCS = engines/libaio.c + cmdprio_SRCS = engines/cmdprio.c libaio_LIBS = -laio ENGINES += libaio endif @@ -225,6 +226,7 @@ endif ifeq ($(CONFIG_TARGET_OS), Linux) SOURCE += diskutil.c fifo.c blktrace.c cgroup.c trim.c engines/sg.c \ oslib/linux-dev-lookup.c engines/io_uring.c + cmdprio_SRCS = engines/cmdprio.c ifdef CONFIG_HAS_BLKZONED SOURCE += oslib/linux-blkzoned.c endif @@ -281,6 +283,10 @@ ifneq (,$(findstring CYGWIN,$(CONFIG_TARGET_OS))) FIO_CFLAGS += -DPSAPI_VERSION=1 -Ios/windows/posix/include -Wno-format endif +ifdef cmdprio_SRCS + SOURCE += $(cmdprio_SRCS) +endif + ifdef CONFIG_DYNAMIC_ENGINES DYNAMIC_ENGS := $(ENGINES) define engine_template = diff --git a/engines/cmdprio.c b/engines/cmdprio.c new file mode 100644 index 00000000..f5b7342f --- /dev/null +++ b/engines/cmdprio.c @@ -0,0 +1,130 @@ +/* + * IO priority handling helper functions common to the libaio and io_uring + * engines. + */ + +#include "cmdprio.h" + +static int fio_cmdprio_bssplit_ddir(struct thread_options *to, void *cb_arg, + enum fio_ddir ddir, char *str, bool data) +{ + struct cmdprio *cmdprio = cb_arg; + struct split split; + unsigned int i; + + if (ddir == DDIR_TRIM) + return 0; + + memset(&split, 0, sizeof(split)); + + if (split_parse_ddir(to, &split, str, data, BSSPLIT_MAX)) + return 1; + if (!split.nr) + return 0; + + cmdprio->bssplit_nr[ddir] = split.nr; + cmdprio->bssplit[ddir] = malloc(split.nr * sizeof(struct bssplit)); + if (!cmdprio->bssplit[ddir]) + return 1; + + for (i = 0; i < split.nr; i++) { + cmdprio->bssplit[ddir][i].bs = split.val1[i]; + if (split.val2[i] == -1U) { + cmdprio->bssplit[ddir][i].perc = 0; + } else { + if (split.val2[i] > 100) + cmdprio->bssplit[ddir][i].perc = 100; + else + cmdprio->bssplit[ddir][i].perc = split.val2[i]; + } + } + + return 0; +} + +int fio_cmdprio_bssplit_parse(struct thread_data *td, const char *input, + struct cmdprio *cmdprio) +{ + char *str, *p; + int i, ret = 0; + + p = str = strdup(input); + + strip_blank_front(&str); + strip_blank_end(str); + + ret = str_split_parse(td, str, fio_cmdprio_bssplit_ddir, cmdprio, false); + + if (parse_dryrun()) { + for (i = 0; i < DDIR_RWDIR_CNT; i++) { + free(cmdprio->bssplit[i]); + cmdprio->bssplit[i] = NULL; + cmdprio->bssplit_nr[i] = 0; + } + } + + free(p); + return ret; +} + +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; + } + + return 0; +} + +int fio_cmdprio_init(struct thread_data *td, struct cmdprio *cmdprio, + bool *has_cmdprio) +{ + struct thread_options *to = &td->o; + bool has_cmdprio_percentage = false; + bool has_cmdprio_bssplit = false; + int i; + + /* + * If cmdprio_percentage/cmdprio_bssplit is set and cmdprio_class + * is not set, default to RT priority class. + */ + for (i = 0; i < DDIR_RWDIR_CNT; i++) { + if (cmdprio->percentage[i]) { + if (!cmdprio->class[i]) + cmdprio->class[i] = IOPRIO_CLASS_RT; + has_cmdprio_percentage = true; + } + if (cmdprio->bssplit_nr[i]) { + if (!cmdprio->class[i]) + cmdprio->class[i] = IOPRIO_CLASS_RT; + has_cmdprio_bssplit = true; + } + } + + /* + * Check for option conflicts + */ + if (has_cmdprio_percentage && has_cmdprio_bssplit) { + log_err("%s: cmdprio_percentage and cmdprio_bssplit options " + "are mutually exclusive\n", + to->name); + return 1; + } + + *has_cmdprio = has_cmdprio_percentage || has_cmdprio_bssplit; + + return 0; +} diff --git a/engines/cmdprio.h b/engines/cmdprio.h index 0edc4365..33a8f5b9 100644 --- a/engines/cmdprio.h +++ b/engines/cmdprio.h @@ -16,129 +16,12 @@ struct cmdprio { struct bssplit *bssplit[DDIR_RWDIR_CNT]; }; -static int fio_cmdprio_bssplit_ddir(struct thread_options *to, void *cb_arg, - enum fio_ddir ddir, char *str, bool data) -{ - struct cmdprio *cmdprio = cb_arg; - struct split split; - unsigned int i; +int fio_cmdprio_bssplit_parse(struct thread_data *td, const char *input, + struct cmdprio *cmdprio); - if (ddir == DDIR_TRIM) - return 0; +int fio_cmdprio_percentage(struct cmdprio *cmdprio, struct io_u *io_u); - memset(&split, 0, sizeof(split)); - - if (split_parse_ddir(to, &split, str, data, BSSPLIT_MAX)) - return 1; - if (!split.nr) - return 0; - - cmdprio->bssplit_nr[ddir] = split.nr; - cmdprio->bssplit[ddir] = malloc(split.nr * sizeof(struct bssplit)); - if (!cmdprio->bssplit[ddir]) - return 1; - - for (i = 0; i < split.nr; i++) { - cmdprio->bssplit[ddir][i].bs = split.val1[i]; - if (split.val2[i] == -1U) { - cmdprio->bssplit[ddir][i].perc = 0; - } else { - if (split.val2[i] > 100) - cmdprio->bssplit[ddir][i].perc = 100; - else - cmdprio->bssplit[ddir][i].perc = split.val2[i]; - } - } - - return 0; -} - -static int fio_cmdprio_bssplit_parse(struct thread_data *td, const char *input, - struct cmdprio *cmdprio) -{ - char *str, *p; - int i, ret = 0; - - p = str = strdup(input); - - strip_blank_front(&str); - strip_blank_end(str); - - ret = str_split_parse(td, str, fio_cmdprio_bssplit_ddir, cmdprio, false); - - if (parse_dryrun()) { - for (i = 0; i < DDIR_RWDIR_CNT; i++) { - free(cmdprio->bssplit[i]); - cmdprio->bssplit[i] = NULL; - cmdprio->bssplit_nr[i] = 0; - } - } - - free(p); - return ret; -} - -static inline 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; - } - - return 0; -} - -static int fio_cmdprio_init(struct thread_data *td, struct cmdprio *cmdprio, - bool *has_cmdprio) -{ - struct thread_options *to = &td->o; - bool has_cmdprio_percentage = false; - bool has_cmdprio_bssplit = false; - int i; - - /* - * If cmdprio_percentage/cmdprio_bssplit is set and cmdprio_class - * is not set, default to RT priority class. - */ - for (i = 0; i < DDIR_RWDIR_CNT; i++) { - if (cmdprio->percentage[i]) { - if (!cmdprio->class[i]) - cmdprio->class[i] = IOPRIO_CLASS_RT; - has_cmdprio_percentage = true; - } - if (cmdprio->bssplit_nr[i]) { - if (!cmdprio->class[i]) - cmdprio->class[i] = IOPRIO_CLASS_RT; - has_cmdprio_bssplit = true; - } - } - - /* - * Check for option conflicts - */ - if (has_cmdprio_percentage && has_cmdprio_bssplit) { - log_err("%s: cmdprio_percentage and cmdprio_bssplit options " - "are mutually exclusive\n", - to->name); - return 1; - } - - *has_cmdprio = has_cmdprio_percentage || has_cmdprio_bssplit; - - return 0; -} +int fio_cmdprio_init(struct thread_data *td, struct cmdprio *cmdprio, + bool *has_cmdprio); #endif -- 2.33.1