1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "qos_common.h"
16 #include <cstdio>
17 #include <cstdlib>
18 #include <unistd.h>
19 #include <sys/ioctl.h>
20 #include <fcntl.h>
21 #include "rme_log_domain.h"
22
23 constexpr unsigned int AF_QOS_DELEGATED = 0x0001;
24
25 namespace OHOS {
26 namespace QosCommon {
27
28 DEFINE_RMELOG_INTELLISENSE("qos_manager");
29
TrivalOpenQosCtrlNode(void)30 static int TrivalOpenQosCtrlNode(void)
31 {
32 char fileName[] = "/proc/thread-self/sched_qos_ctrl";
33 int fd = open(fileName, O_RDWR);
34 return fd;
35 }
36
TrivalOpenAuthCtrlNode(void)37 static int TrivalOpenAuthCtrlNode(void)
38 {
39 char fileName[] = "/dev/auth_ctrl";
40 int fd = open(fileName, O_RDWR);
41 return fd;
42 }
43
AuthEnable(int uid,unsigned int flag,unsigned int status)44 int AuthEnable(int uid, unsigned int flag, unsigned int status)
45 {
46 struct AuthCtrlData data;
47 int fd;
48 int ret;
49
50 fd = TrivalOpenAuthCtrlNode();
51 if (fd < 0) {
52 RME_LOGE("thread %{public}d belong to user %{public}d open auth node failed\n", gettid(), getuid());
53 return fd;
54 }
55
56 data.uid = uid;
57 data.rtgFlag = flag;
58 data.qosFlag = AF_QOS_DELEGATED;
59 data.status = status;
60 data.type = AUTH_ENABLE;
61
62 ret = ioctl(fd, BASIC_AUTH_CTRL_OPERATION, &data);
63 if (ret < 0) {
64 RME_LOGE("auth enable failed for uid %{public}d with status %{public}u\n", uid, status);
65 }
66 close(fd);
67 return ret;
68 }
69
AuthPause(int uid)70 int AuthPause(int uid)
71 {
72 struct AuthCtrlData data;
73 int fd;
74 int ret;
75
76 fd = TrivalOpenAuthCtrlNode();
77 if (fd < 0) {
78 RME_LOGE("thread %{public}d belong to user %{public}d open auth node failed\n", gettid(), getuid());
79 return fd;
80 }
81
82 data.uid = uid;
83 data.rtgFlag = 0;
84 data.qosFlag = AF_QOS_DELEGATED;
85 data.status = AUTH_STATUS_BACKGROUND;
86 data.type = AUTH_SWITCH;
87
88 ret = ioctl(fd, BASIC_AUTH_CTRL_OPERATION, &data);
89 if (ret < 0) {
90 RME_LOGE("auth pause failed for uid %{public}d\n", uid);
91 }
92 close(fd);
93 return ret;
94 }
95
AuthDelete(int uid)96 int AuthDelete(int uid)
97 {
98 struct AuthCtrlData data;
99 int fd;
100 int ret;
101
102 fd = TrivalOpenAuthCtrlNode();
103 if (fd < 0) {
104 RME_LOGE("thread %{public}d belong to user %{public}d open auth node failed\n", gettid(), getuid());
105 return fd;
106 }
107
108 data.uid = uid;
109 data.type = AUTH_DELETE;
110
111 ret = ioctl(fd, BASIC_AUTH_CTRL_OPERATION, &data);
112 if (ret < 0) {
113 RME_LOGE("auth delete failed for uid %{public}d\n", uid);
114 }
115 close(fd);
116 return ret;
117 }
118
QosApplyForThread(int level,int tid)119 int QosApplyForThread(int level, int tid)
120 {
121 struct QosCtrlData data;
122 int fd;
123
124 int ret;
125
126 fd = TrivalOpenQosCtrlNode();
127 if (fd < 0) {
128 RME_LOGE("thread %{public}d belong to user %{public}d open qos node failed\n", gettid(), getuid());
129 return fd;
130 }
131
132 data.level = level;
133 data.type = QOS_APPLY;
134 data.pid = tid;
135
136 ret = ioctl(fd, QOS_CTRL_BASIC_OPERATION, &data);
137 if (ret < 0) {
138 RME_LOGE("qos apply failed for thread %{public}d\n", tid);
139 }
140 close(fd);
141 return ret;
142 }
143
QosLeaveForThread(int tid)144 int QosLeaveForThread(int tid)
145 {
146 struct QosCtrlData data;
147 int fd;
148 int ret;
149
150 fd = TrivalOpenQosCtrlNode();
151 if (fd < 0) {
152 RME_LOGE("thread %{public}d belong to user %{public}d open qos node failed\n", gettid(), getuid());
153 return fd;
154 }
155
156 data.type = QOS_LEAVE;
157 data.pid = tid;
158
159 ret = ioctl(fd, QOS_CTRL_BASIC_OPERATION, &data);
160 if (ret < 0) {
161 RME_LOGE("qos leave failed for thread %{public}d\n", tid);
162 }
163 close(fd);
164 return ret;
165 }
166
QosPolicy(struct QosPolicyDatas * policyDatas)167 int QosPolicy(struct QosPolicyDatas *policyDatas)
168 {
169 int fd;
170 int ret;
171
172 fd = TrivalOpenQosCtrlNode();
173 if (fd < 0) {
174 RME_LOGE("thread %{public}d belong to user %{public}d open qos node failed\n", gettid(), getuid());
175 return fd;
176 }
177
178 ret = ioctl(fd, QOS_CTRL_POLICY_OPERATION, policyDatas);
179 if (ret < 0) {
180 RME_LOGE("set qos policy failed for thread %{public}d\n", gettid());
181 }
182 close(fd);
183 return ret;
184 }
185
186 } // namespace QosCommon
187 } // namespace OHOS