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 #include "memmgr_log.h"
16 #include "xml_helper.h"
17 #include "reclaim_config.h"
18
19 #define MAX_UNINTPARAM 100
20 #define MAX_INTPARAM 1000
21
22 namespace OHOS {
23 namespace Memory {
24 namespace {
25 const std::string TAG = "ReclaimConfig";
26 }
27
ReclaimConfig()28 ReclaimConfig::ReclaimConfig()
29 {
30 }
31
SetDefaultConfig(int minScore,int maxScore,unsigned int mem2zramRatio,unsigned int zram2ufsRatio,unsigned int refaultThreshold)32 void ReclaimConfig::SetDefaultConfig(int minScore, int maxScore, unsigned int mem2zramRatio,
33 unsigned int zram2ufsRatio, unsigned int refaultThreshold)
34 {
35 DECLARE_SHARED_POINTER(ZswapdParam, zswapdParam);
36
37 MAKE_POINTER(zswapdParam, shared, ZswapdParam, "make default ZswapdParam failed", return,
38 minScore, maxScore, mem2zramRatio, zram2ufsRatio, refaultThreshold);
39 AddReclaimConfigToSet(zswapdParam);
40 }
41
ParseConfig(const xmlNodePtr & rootNodePtr)42 void ReclaimConfig::ParseConfig(const xmlNodePtr &rootNodePtr)
43 {
44 if (!XmlHelper::CheckNode(rootNodePtr) || !XmlHelper::HasChild(rootNodePtr)) {
45 HILOGD("Node exsist:%{public}d,has child node:%{public}d",
46 XmlHelper::CheckNode(rootNodePtr), XmlHelper::HasChild(rootNodePtr));
47 return;
48 }
49
50 std::map<std::string, std::string> param;
51 for (xmlNodePtr currNode = rootNodePtr->xmlChildrenNode; currNode != nullptr; currNode = currNode->next) {
52 if (!XmlHelper::GetModuleParam(currNode, param)) {
53 HILOGW("Get moudle param failed.");
54 return;
55 }
56 SetZswapdParamConfig(param);
57 }
58 }
59
SetZswapdParamConfig(std::map<std::string,std::string> & param)60 void ReclaimConfig::SetZswapdParamConfig(std::map<std::string, std::string> ¶m)
61 {
62 int minScore;
63 int maxScore;
64 unsigned int mem2zramRatio;
65 unsigned int zram2ufsRatio;
66 unsigned int refaultThreshold;
67
68 XmlHelper::SetIntParam(param, "minScore", minScore, 0);
69 XmlHelper::SetIntParam(param, "maxScore", maxScore, RECLAIM_PRIORITY_MAX);
70 XmlHelper::SetUnsignedIntParam(param, "mem2zramRatio", mem2zramRatio, MEMCG_MEM_2_ZRAM_RATIO);
71 XmlHelper::SetUnsignedIntParam(param, "zram2ufsRatio", zram2ufsRatio, MEMCG_ZRAM_2_UFS_RATIO);
72 XmlHelper::SetUnsignedIntParam(param, "refaultThreshold", refaultThreshold, MEMCG_REFAULT_THRESHOLD);
73
74 DECLARE_SHARED_POINTER(ZswapdParam, zswapdParam);
75 MAKE_POINTER(zswapdParam, shared, ZswapdParam, "make ZswapdParam failed", return,
76 minScore, maxScore, mem2zramRatio, zram2ufsRatio, refaultThreshold);
77 CheckZswapdParam(zswapdParam);
78
79 AddReclaimConfigToSet(zswapdParam);
80 }
81
CheckZswapdParam(std::shared_ptr<ZswapdParam> zswapdParam)82 void ReclaimConfig::CheckZswapdParam(std::shared_ptr<ZswapdParam> zswapdParam)
83 {
84 int minScore = 0;
85 int maxScore = 0;
86 unsigned int mem2zramRatio = 0;
87 unsigned int zram2ufsRatio = 0;
88 unsigned int refaultThreshold = 0;
89
90 if (zswapdParam->GetMinScore() < 0 || zswapdParam->GetMinScore() > MAX_INTPARAM) {
91 minScore = 0;
92 } else {
93 minScore = zswapdParam->GetMinScore();
94 }
95 zswapdParam->SetMinScore(minScore);
96
97 if (zswapdParam->GetMaxScore() < 0 || zswapdParam->GetMaxScore() > MAX_INTPARAM) {
98 maxScore = RECLAIM_PRIORITY_MAX;
99 } else {
100 maxScore = zswapdParam->GetMaxScore();
101 }
102 zswapdParam->SetMaxScore(maxScore);
103
104 if (zswapdParam->GetMem2zramRatio() < 0 || zswapdParam->GetMem2zramRatio() > MAX_UNINTPARAM) {
105 mem2zramRatio = MEMCG_MEM_2_ZRAM_RATIO;
106 } else {
107 mem2zramRatio = zswapdParam->GetMem2zramRatio();
108 }
109 zswapdParam->SetMem2zramRatio(mem2zramRatio);
110
111 if (zswapdParam->GetZram2ufsRatio() < 0 || zswapdParam->GetZram2ufsRatio() > MAX_UNINTPARAM) {
112 zram2ufsRatio = MEMCG_ZRAM_2_UFS_RATIO;
113 } else {
114 zram2ufsRatio = zswapdParam->GetZram2ufsRatio();
115 }
116 zswapdParam->SetZram2ufsRatio(zram2ufsRatio);
117
118 if (zswapdParam->GetRefaultThreshold() < 0 || zswapdParam->GetRefaultThreshold() > MAX_UNINTPARAM) {
119 refaultThreshold = MEMCG_REFAULT_THRESHOLD;
120 } else {
121 refaultThreshold = zswapdParam->GetRefaultThreshold();
122 }
123 zswapdParam->SetRefaultThreshold(refaultThreshold);
124 }
125
AddReclaimConfigToSet(std::shared_ptr<ZswapdParam> zswapdParam)126 void ReclaimConfig::AddReclaimConfigToSet(std::shared_ptr<ZswapdParam> zswapdParam)
127 {
128 reclaimConfigSet_.insert(zswapdParam);
129 }
130
ClearReclaimConfigSet()131 void ReclaimConfig::ClearReclaimConfigSet()
132 {
133 reclaimConfigSet_.clear();
134 }
135
GetReclaimConfigSet()136 const ReclaimConfig::ReclaimConfigSet& ReclaimConfig::GetReclaimConfigSet()
137 {
138 return reclaimConfigSet_;
139 }
140
ZswapdParam()141 ZswapdParam::ZswapdParam()
142 {
143 }
144
ZswapdParam(int minScore,int maxScore,unsigned int mem2zramRatio,unsigned int zram2ufsRatio,unsigned int refaultThreshold)145 ZswapdParam::ZswapdParam(int minScore, int maxScore, unsigned int mem2zramRatio,
146 unsigned int zram2ufsRatio, unsigned int refaultThreshold)
147 : minScore_(minScore),
148 maxScore_(maxScore),
149 mem2zramRatio_(mem2zramRatio),
150 zram2ufsRatio_(zram2ufsRatio),
151 refaultThreshold_(refaultThreshold)
152 {
153 }
154
GetMinScore()155 int ZswapdParam::GetMinScore()
156 {
157 return minScore_;
158 }
159
SetMinScore(int minScore)160 void ZswapdParam::SetMinScore(int minScore)
161 {
162 minScore_ = minScore;
163 }
164
GetMaxScore()165 int ZswapdParam::GetMaxScore()
166 {
167 return maxScore_;
168 }
169
SetMaxScore(int maxScore)170 void ZswapdParam::SetMaxScore(int maxScore)
171 {
172 maxScore_ = maxScore;
173 }
174
GetMem2zramRatio()175 unsigned int ZswapdParam::GetMem2zramRatio()
176 {
177 return mem2zramRatio_;
178 }
179
SetMem2zramRatio(unsigned int mem2zramRatio)180 void ZswapdParam::SetMem2zramRatio(unsigned int mem2zramRatio)
181 {
182 mem2zramRatio_ = mem2zramRatio;
183 }
184
GetZram2ufsRatio()185 unsigned int ZswapdParam::GetZram2ufsRatio()
186 {
187 return zram2ufsRatio_;
188 }
189
SetZram2ufsRatio(unsigned int zram2ufsRatio)190 void ZswapdParam::SetZram2ufsRatio(unsigned int zram2ufsRatio)
191 {
192 zram2ufsRatio_ = zram2ufsRatio;
193 }
194
GetRefaultThreshold()195 unsigned int ZswapdParam::GetRefaultThreshold()
196 {
197 return refaultThreshold_;
198 }
199
SetRefaultThreshold(unsigned int refaultThreshold)200 void ZswapdParam::SetRefaultThreshold(unsigned int refaultThreshold)
201 {
202 refaultThreshold_ = refaultThreshold;
203 }
204
Dump(int fd)205 void ReclaimConfig::Dump(int fd)
206 {
207 int index = 0;
208 for (auto it = reclaimConfigSet_.begin(); it != reclaimConfigSet_.end(); it++) {
209 index++;
210 dprintf(fd, "ReclaimConfig %d: \n", index);
211 dprintf(fd, " minScore: %d\n", (*it)->GetMinScore());
212 dprintf(fd, " maxScore: %d\n", (*it)->GetMaxScore());
213 dprintf(fd, " mem2zramRatio: %u\n", (*it)->GetMem2zramRatio());
214 dprintf(fd, " zram2ufsRatio: %u\n", (*it)->GetZram2ufsRatio());
215 dprintf(fd, " refaultThreshold: %u\n", (*it)->GetRefaultThreshold());
216 }
217 }
218 } // namespace Memory
219 } // namespace OHOS
220