1 /*
2  * Copyright (c) 2022 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 
16 #include "qos_policy.h"
17 #include <unistd.h>
18 #include "concurrent_task_log.h"
19 
20 static struct QosPolicyDatas g_defaultQosPolicy = {
21     .policyType = QOS_POLICY_DEFAULT,
22     .policyFlag = QOS_FLAG_ALL,
23     .policys = {
24         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
25         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
26         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
27         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
28         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
29         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
30         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
31     }
32 };
33 
34 static struct QosPolicyDatas g_foregroundQosPolicy = {
35     .policyType = QOS_POLICY_FRONT,
36     .policyFlag = QOS_FLAG_ALL,
37     .policys = {
38         {10, 10, 0, 200, 0, SCHED_POLICY_OTHER},
39         {5, 5, 0, 250, 0, SCHED_POLICY_OTHER},
40         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
41 #ifdef QOS_EXT_ENABLE
42         {-10, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
43         {-10, -10, 0, 1024, 0, SCHED_POLICY_OTHER},
44         {-10, -10, 0, 1024, 0, SCHED_POLICY_OTHER},
45 #else
46         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
47         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
48         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
49 #endif
50         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
51     }
52 };
53 
54 static struct QosPolicyDatas g_backgroundQosPolicy = {
55     .policyType = QOS_POLICY_BACK,
56     .policyFlag = QOS_FLAG_ALL & ~QOS_FLAG_RT,
57     .policys = {
58         {15, 15, 0, 150, 0, SCHED_POLICY_OTHER},
59         {10, 10, 0, 200, 0, SCHED_POLICY_OTHER},
60         {5, 5, 0, 250, 0, SCHED_POLICY_OTHER},
61         {0, 0, 0, 300, 0, SCHED_POLICY_OTHER},
62 #ifdef QOS_EXT_ENABLE
63         {-5, -5, 0, 350, 0, SCHED_POLICY_OTHER},
64         {-5, -5, 0, 350, 0, SCHED_POLICY_OTHER},
65 #else
66         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
67         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
68 #endif
69         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
70     }
71 };
72 
73 static struct QosPolicyDatas g_systemServerQosPolicy = {
74     .policyType = QOS_POLICY_SYSTEM_SERVER,
75     .policyFlag = QOS_FLAG_ALL,
76     .policys = {
77         {10, 10, 0, 200, 0, SCHED_POLICY_OTHER},
78         {5, 5, 0, 250, 0, SCHED_POLICY_OTHER},
79         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
80 #ifdef QOS_EXT_ENABLE
81         {-10, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
82         {-10, -10, 0, 1024, 0, SCHED_POLICY_OTHER},
83         {-10, -10, 0, 1024, 1, SCHED_POLICY_FIFO | SCHED_RESET_ON_FORK},
84 #else
85         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
86         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
87         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
88 #endif
89         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
90     }
91 };
92 
93 static struct QosPolicyDatas g_focusQosPolicy = {
94     .policyType = QOS_POLICY_FOCUS,
95     .policyFlag = QOS_FLAG_ALL,
96     .policys = {
97         {10, 10, 0, 200, 0, SCHED_POLICY_OTHER},
98         {5, 5, 0, 250, 0, SCHED_POLICY_OTHER},
99         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
100 #ifdef QOS_EXT_ENABLE
101         {-10, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
102         {-10, -10, 0, 1024, 0, SCHED_POLICY_OTHER},
103         {-10, -10, 0, 1024, 1, SCHED_POLICY_RT_EX | SCHED_RESET_ON_FORK},
104 #else
105         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
106         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
107         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
108 #endif
109         {0, 0, 0, 1024, 0, SCHED_POLICY_OTHER},
110     }
111 };
112 
113 namespace OHOS {
114 namespace ConcurrentTask {
SetQosPolicy(struct QosPolicyDatas * policyDatas)115 int QosPolicy::SetQosPolicy(struct QosPolicyDatas *policyDatas)
116 {
117     return QosPolicySet(policyDatas);
118 }
119 
Init()120 void QosPolicy::Init()
121 {
122     int ret;
123 
124     ret = SetQosPolicy(&g_defaultQosPolicy);
125     if (ret) {
126         CONCUR_LOGE("%{public}d set g_defaultQosPolicy failed", getuid());
127     }
128 
129     ret = SetQosPolicy(&g_foregroundQosPolicy);
130     if (ret) {
131         CONCUR_LOGE("%{public}d set g_foregroundQosPolicy failed", getuid());
132     }
133 
134     ret = SetQosPolicy(&g_backgroundQosPolicy);
135     if (ret) {
136         CONCUR_LOGE("%{public}d set g_backgroundQosPolicy failed", getuid());
137     }
138 
139     ret = SetQosPolicy(&g_systemServerQosPolicy);
140     if (ret) {
141         CONCUR_LOGE("%{public}d set g_systemServerQosPolicy failed", getuid());
142     }
143 
144     ret = SetQosPolicy(&g_focusQosPolicy);
145     if (ret) {
146         CONCUR_LOGE("%{public}d set g_focusQosPolicy failed", getuid());
147     }
148 
149     CONCUR_LOGI("set qos policy finish");
150 }
151 }
152 }
153