1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * include/linux/sched/qos_ctrl.h 4 * 5 * Copyright (c) 2022 Huawei Device Co., Ltd. 6 */ 7 8 #ifndef _QOS_CTRL_H 9 #define _QOS_CTRL_H 10 11 #include <linux/sched.h> 12 #include <linux/fs.h> 13 14 enum ioctl_abi_format_qos{ 15 QOS_IOCTL_ABI_ARM32, 16 QOS_IOCTL_ABI_AARCH64, 17 }; 18 19 enum qos_ctrl_cmdid { 20 QOS_CTRL = 1, 21 QOS_POLICY, 22 QOS_CTRL_MAX_NR 23 }; 24 25 #define QOS_CTRL_IPC_MAGIG 0xCC 26 27 #define QOS_CTRL_BASIC_OPERATION \ 28 _IOWR(QOS_CTRL_IPC_MAGIG, QOS_CTRL, struct qos_ctrl_data) 29 #define QOS_CTRL_POLICY_OPERATION \ 30 _IOWR(QOS_CTRL_IPC_MAGIG, QOS_POLICY, struct qos_policy_datas) 31 32 #define NO_QOS -1 33 #define NR_QOS 7 34 #define NR_RT_QOS 2 35 #define MIN_RT_QOS_LEVEL (NR_QOS - NR_RT_QOS) 36 37 #define QOS_NUM_MAX 2000 38 39 enum qos_manipulate_type { 40 QOS_APPLY = 1, 41 QOS_LEAVE, 42 QOS_GET, 43 QOS_OPERATION_CMD_MAX_NR, 44 }; 45 46 #ifndef CONFIG_QOS_POLICY_MAX_NR 47 #define QOS_POLICYS_COUNT 5 48 #else 49 #define QOS_POLICYS_COUNT CONFIG_QOS_POLICY_MAX_NR 50 #endif 51 52 /* 53 * keep match with auth_status 54 * 55 * range (QOS_POLICY_SYSTEM, QOS_POLICY_MAX_NR) could defined by user 56 * use ctrl_qos_policy 57 */ 58 enum qos_policy_type { 59 QOS_POLICY_DEFAULT = 1, /* reserved for "NO QOS" */ 60 QOS_POLICY_SYSTEM = 2, /* reserved for ROOT and SYSTEM */ 61 QOS_POLICY_MAX_NR = QOS_POLICYS_COUNT, 62 }; 63 64 struct qos_ctrl_data { 65 int pid; 66 67 /* 68 * type: operation type, see qos_manipulate_type 69 * level: valid from 1 to NR_QOS. Larger value, more aggressive supply 70 */ 71 unsigned int type; 72 73 /* 74 * user space level, range from [1, NR_QOS] 75 * 76 * NOTICE!!!: 77 * minus 1 before use in kernel, so the kernel range is [0, NR_QOS) 78 */ 79 unsigned int level; 80 81 int qos; 82 }; 83 84 struct qos_policy_data { 85 int nice; 86 int latency_nice; 87 int uclamp_min; 88 int uclamp_max; 89 int rt_sched_priority; 90 int policy; 91 }; 92 93 #define QOS_FLAG_NICE 0x01 94 #define QOS_FLAG_LATENCY_NICE 0x02 95 #define QOS_FLAG_UCLAMP 0x04 96 #define QOS_FLAG_RT 0x08 97 98 #define QOS_FLAG_ALL (QOS_FLAG_NICE | \ 99 QOS_FLAG_LATENCY_NICE | \ 100 QOS_FLAG_UCLAMP | \ 101 QOS_FLAG_RT) 102 103 struct qos_policy_datas { 104 /* 105 * policy_type: id for qos policy, valid from [1, QOS_POLICY_MAX_NR) 106 * policy_flag: control valid sched attr for policy, QOS_FLAG_ALL for whole access 107 * policys: sched params for specific level qos, minus 1 for matching struct in kerenl 108 */ 109 int policy_type; 110 unsigned int policy_flag; 111 struct qos_policy_data policys[NR_QOS]; 112 }; 113 114 struct auth_struct; 115 116 int qos_apply(struct qos_ctrl_data *data); 117 int qos_leave(struct qos_ctrl_data *data); 118 int qos_get(struct qos_ctrl_data *data); 119 120 void qos_switch(struct auth_struct *auth, int target_status); 121 122 void init_task_qos(struct task_struct *p); 123 void sched_exit_qos_list(struct task_struct *p); 124 void remove_qos_tasks(struct auth_struct *auth); 125 126 long do_qos_ctrl_ioctl(int abi, struct file *file, unsigned int cmd, unsigned long arg); 127 128 #endif /* _QOS_CTRL_H */ 129 130