Re: [PATCH 2/8] cmdprio: move cmdprio function definitions to a new cmdprio.c file

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2021/11/09 9:28, Niklas Cassel wrote:
> 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>

Looks good.

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
> 


-- 
Damien Le Moal
Western Digital Research



[Index of Archives]     [Linux Kernel]     [Linux SCSI]     [Linux IDE]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux