Re: [PATCH v4 02/19] block: introduce ioprio hints

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

 



On 2023/03/10 6:54, Niklas Cassel wrote:
> From: Damien Le Moal <damien.lemoal@xxxxxxxxxxxxxxxxxx>
> 
> IO priorities currently only use 6-bits of the 16-bits ioprio value: the
> 3-upper bits are used to define up to 8 priority classes (4 of which are
> valid) and the 3 lower bits of the value are used to define a priority
> level for the real-time and best-effort class.
> 
> The remaining 10-bits between the IO priority class and level are
> unused, and in fact, cannot be used by the user as doing so would
> either result in the value being completely ignored, or in an error
> returned by ioprio_check_cap().
> 
> Use these 10-bits of an ioprio value to allow a user to specify IO
> hints. An IO hint is defined as a 10-bits value, allowing up to 1023
> different hints to be specified, with the value 0 being reserved as the
> "no hint" case. An IO hint can apply to any IO that specifies a valid
> priority class other than NONE, regardless of the IO priority level
> specified.
> 
> To do so, the macros IOPRIO_PRIO_HINT() and IOPRIO_PRIO_VALUE_HINT() are
> introduced in include/uapi/linux/ioprio.h to respectively allow a user
> to get and set a hint in an ioprio value.
> 
> To support the ATA and SCSI command duration limits feature, 7 hints
> are defined: IOPRIO_HINT_DEV_DURATION_LIMIT_1 to
> IOPRIO_HINT_DEV_DURATION_LIMIT_7, allowing a user to specify which
> command duration limit descriptor should be applied to the commands
> serving an IO. Specifying these hints has for now no effect whatsoever
> if the target block devices do not support the command duration limits
> feature. However, in the future, block IO schedulers can be modified to
> optimize IO issuing order based on these hints, even for devices that
> do not support the command duration limits feature.
> 
> Given that the 7 duration limits hints defined have no effect on any
> block layer component, the actual definition of the duration limits
> implied by these hints remains at the device level.
> 
> Signed-off-by: Damien Le Moal <damien.lemoal@xxxxxxxxxxxxxxxxxx>
> Signed-off-by: Niklas Cassel <niklas.cassel@xxxxxxx>

Jens, Martin,

Any thoughts on this new interface ?

Bart,

I would like to hear your opinion as well.


> ---
>  include/uapi/linux/ioprio.h | 49 +++++++++++++++++++++++++++++++++++++
>  1 file changed, 49 insertions(+)
> 
> diff --git a/include/uapi/linux/ioprio.h b/include/uapi/linux/ioprio.h
> index 4444b4e4fdad..607c7617b9d2 100644
> --- a/include/uapi/linux/ioprio.h
> +++ b/include/uapi/linux/ioprio.h
> @@ -58,4 +58,53 @@ enum {
>  #define IOPRIO_NORM	4
>  #define IOPRIO_BE_NORM	IOPRIO_NORM
>  
> +/*
> + * The 10-bits between the priority class and the priority level are used to
> + * optionally define IO hints for any combination of IO priority class and
> + * level. Depending on the kernel configuration, IO scheduler being used and
> + * the target IO device being used, hints can influence how IOs are processed
> + * without affecting the IO scheduling ordering defined by the IO priority
> + * class and level.
> + */
> +#define IOPRIO_HINT_SHIFT		IOPRIO_LEVEL_NR_BITS
> +#define IOPRIO_HINT_NR_BITS		10
> +#define IOPRIO_NR_HINTS			(1 << IOPRIO_HINT_NR_BITS)
> +#define IOPRIO_HINT_MASK		(IOPRIO_NR_HINTS - 1)
> +#define IOPRIO_PRIO_HINT(ioprio)	\
> +	(((ioprio) >> IOPRIO_HINT_SHIFT) & IOPRIO_HINT_MASK)
> +
> +/*
> + * Alternate macro for IOPRIO_PRIO_VALUE() to define an IO priority with
> + * a class, level and hint.
> + */
> +#define IOPRIO_PRIO_VALUE_HINT(class, level, hint)		 \
> +	((((class) & IOPRIO_CLASS_MASK) << IOPRIO_CLASS_SHIFT) | \
> +	 (((hint) & IOPRIO_HINT_MASK) << IOPRIO_HINT_SHIFT) |	 \
> +	 ((level) & IOPRIO_LEVEL_MASK))
> +
> +/*
> + * IO hints.
> + */
> +enum {
> +	/* No hint */
> +	IOPRIO_HINT_NONE = 0,
> +
> +	/*
> +	 * Device command duration limits: indicate to the device a desired
> +	 * duration limit for the commands that will be used to process an IO.
> +	 * These will currently only be effective for SCSI and ATA devices that
> +	 * support the command duration limits feature. If this feature is
> +	 * enabled, then the commands issued to the device to process an IO with
> +	 * one of these hints set will have the duration limit index (dld field)
> +	 * set to the value of the hint.
> +	 */
> +	IOPRIO_HINT_DEV_DURATION_LIMIT_1 = 1,
> +	IOPRIO_HINT_DEV_DURATION_LIMIT_2 = 2,
> +	IOPRIO_HINT_DEV_DURATION_LIMIT_3 = 3,
> +	IOPRIO_HINT_DEV_DURATION_LIMIT_4 = 4,
> +	IOPRIO_HINT_DEV_DURATION_LIMIT_5 = 5,
> +	IOPRIO_HINT_DEV_DURATION_LIMIT_6 = 6,
> +	IOPRIO_HINT_DEV_DURATION_LIMIT_7 = 7,
> +};
> +
>  #endif /* _UAPI_LINUX_IOPRIO_H */

-- 
Damien Le Moal
Western Digital Research




[Index of Archives]     [Linux RAID]     [Linux SCSI]     [Linux ATA RAID]     [IDE]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Device Mapper]

  Powered by Linux