diff options
Diffstat (limited to 'include/linux/ioprio.h')
-rw-r--r-- | include/linux/ioprio.h | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/include/linux/ioprio.h b/include/linux/ioprio.h new file mode 100644 index 000000000..7578d4f6a --- /dev/null +++ b/include/linux/ioprio.h @@ -0,0 +1,74 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef IOPRIO_H +#define IOPRIO_H + +#include <linux/sched.h> +#include <linux/sched/rt.h> +#include <linux/iocontext.h> + +#include <uapi/linux/ioprio.h> + +/* + * Default IO priority. + */ +#define IOPRIO_DEFAULT IOPRIO_PRIO_VALUE(IOPRIO_CLASS_NONE, 0) + +/* + * Check that a priority value has a valid class. + */ +static inline bool ioprio_valid(unsigned short ioprio) +{ + unsigned short class = IOPRIO_PRIO_CLASS(ioprio); + + return class > IOPRIO_CLASS_NONE && class <= IOPRIO_CLASS_IDLE; +} + +/* + * if process has set io priority explicitly, use that. if not, convert + * the cpu scheduler nice value to an io priority + */ +static inline int task_nice_ioprio(struct task_struct *task) +{ + return (task_nice(task) + 20) / 5; +} + +/* + * This is for the case where the task hasn't asked for a specific IO class. + * Check for idle and rt task process, and return appropriate IO class. + */ +static inline int task_nice_ioclass(struct task_struct *task) +{ + if (task->policy == SCHED_IDLE) + return IOPRIO_CLASS_IDLE; + else if (task_is_realtime(task)) + return IOPRIO_CLASS_RT; + else + return IOPRIO_CLASS_BE; +} + +#ifdef CONFIG_BLOCK +int __get_task_ioprio(struct task_struct *p); +#else +static inline int __get_task_ioprio(struct task_struct *p) +{ + return IOPRIO_DEFAULT; +} +#endif /* CONFIG_BLOCK */ + +static inline int get_current_ioprio(void) +{ + return __get_task_ioprio(current); +} + +extern int set_task_ioprio(struct task_struct *task, int ioprio); + +#ifdef CONFIG_BLOCK +extern int ioprio_check_cap(int ioprio); +#else +static inline int ioprio_check_cap(int ioprio) +{ + return -ENOTBLK; +} +#endif /* CONFIG_BLOCK */ + +#endif |