• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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