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 14enum ioctl_abi_format_qos{ 15 QOS_IOCTL_ABI_ARM32, 16 QOS_IOCTL_ABI_AARCH64, 17}; 18 19enum 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 39enum 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 */ 58enum 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 64struct 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 84struct 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 103struct 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 114struct auth_struct; 115 116int qos_apply(struct qos_ctrl_data *data); 117int qos_leave(struct qos_ctrl_data *data); 118int qos_get(struct qos_ctrl_data *data); 119 120void qos_switch(struct auth_struct *auth, int target_status); 121 122void init_task_qos(struct task_struct *p); 123void sched_exit_qos_list(struct task_struct *p); 124void remove_qos_tasks(struct auth_struct *auth); 125 126long do_qos_ctrl_ioctl(int abi, struct file *file, unsigned int cmd, unsigned long arg); 127 128#endif /* _QOS_CTRL_H */ 129 130