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, maxScore;
63 unsigned int mem2zramRatio, zram2ufsRatio, refaultThreshold;
64
65 XmlHelper::SetIntParam(param, "minScore", minScore, 0);
66 XmlHelper::SetIntParam(param, "maxScore", maxScore, RECLAIM_PRIORITY_MAX);
67 XmlHelper::SetUnsignedIntParam(param, "mem2zramRatio", mem2zramRatio, MEMCG_MEM_2_ZRAM_RATIO);
68 XmlHelper::SetUnsignedIntParam(param, "zram2ufsRatio", zram2ufsRatio, MEMCG_ZRAM_2_UFS_RATIO);
69 XmlHelper::SetUnsignedIntParam(param, "refaultThreshold", refaultThreshold, MEMCG_REFAULT_THRESHOLD);
70
71 DECLARE_SHARED_POINTER(ZswapdParam, zswapdParam);
72 MAKE_POINTER(zswapdParam, shared, ZswapdParam, "make ZswapdParam failed", return,
73 minScore, maxScore, mem2zramRatio, zram2ufsRatio, refaultThreshold);
74 CheckZswapdParam(zswapdParam);
75
76 AddReclaimConfigToSet(zswapdParam);
77 }
78
CheckZswapdParam(std::shared_ptr<ZswapdParam> zswapdParam)79 void ReclaimConfig::CheckZswapdParam(std::shared_ptr<ZswapdParam> zswapdParam)
80 {
81 int minScore = 0;
82 int maxScore = 0;
83 unsigned int mem2zramRatio = 0;
84 unsigned int zram2ufsRatio = 0;
85 unsigned int refaultThreshold = 0;
86
87 if (zswapdParam->GetMinScore() < 0 || zswapdParam->GetMinScore() > MAX_INTPARAM) {
88 minScore = 0;
89 } else {
90 minScore = zswapdParam->GetMinScore();
91 }
92 zswapdParam->SetMinScore(minScore);
93
94 if (zswapdParam->GetMaxScore() < 0 || zswapdParam->GetMaxScore() > MAX_INTPARAM) {
95 maxScore = RECLAIM_PRIORITY_MAX;
96 } else {
97 maxScore = zswapdParam->GetMaxScore();
98 }
99 zswapdParam->SetMaxScore(maxScore);
100
101 if (zswapdParam->GetMem2zramRatio() < 0 || zswapdParam->GetMem2zramRatio() > MAX_UNINTPARAM) {
102 mem2zramRatio = MEMCG_MEM_2_ZRAM_RATIO;
103 } else {
104 mem2zramRatio = zswapdParam->GetMem2zramRatio();
105 }
106 zswapdParam->SetMem2zramRatio(mem2zramRatio);
107
108 if (zswapdParam->GetZram2ufsRatio() < 0 || zswapdParam->GetZram2ufsRatio() > MAX_UNINTPARAM) {
109 zram2ufsRatio = MEMCG_ZRAM_2_UFS_RATIO;
110 } else {
111 zram2ufsRatio = zswapdParam->GetZram2ufsRatio();
112 }
113 zswapdParam->SetZram2ufsRatio(zram2ufsRatio);
114
115 if (zswapdParam->GetRefaultThreshold() < 0 || zswapdParam->GetRefaultThreshold() > MAX_UNINTPARAM) {
116 refaultThreshold = MEMCG_REFAULT_THRESHOLD;
117 } else {
118 refaultThreshold = zswapdParam->GetRefaultThreshold();
119 }
120 zswapdParam->SetRefaultThreshold(refaultThreshold);
121 }
122
AddReclaimConfigToSet(std::shared_ptr<ZswapdParam> zswapdParam)123 void ReclaimConfig::AddReclaimConfigToSet(std::shared_ptr<ZswapdParam> zswapdParam)
124 {
125 reclaimConfigSet_.insert(zswapdParam);
126 }
127
ClearReclaimConfigSet()128 void ReclaimConfig::ClearReclaimConfigSet()
129 {
130 reclaimConfigSet_.clear();
131 }
132
GetReclaimConfigSet()133 const ReclaimConfig::ReclaimConfigSet& ReclaimConfig::GetReclaimConfigSet()
134 {
135 return reclaimConfigSet_;
136 }
137
ZswapdParam()138 ZswapdParam::ZswapdParam()
139 {
140 }
141
ZswapdParam(int minScore,int maxScore,unsigned int mem2zramRatio,unsigned int zram2ufsRatio,unsigned int refaultThreshold)142 ZswapdParam::ZswapdParam(int minScore, int maxScore, unsigned int mem2zramRatio,
143 unsigned int zram2ufsRatio, unsigned int refaultThreshold)
144 : minScore_(minScore),
145 maxScore_(maxScore),
146 mem2zramRatio_(mem2zramRatio),
147 zram2ufsRatio_(zram2ufsRatio),
148 refaultThreshold_(refaultThreshold)
149 {
150 }
151
GetMinScore()152 int ZswapdParam::GetMinScore()
153 {
154 return minScore_;
155 }
156
SetMinScore(int minScore)157 void ZswapdParam::SetMinScore(int minScore)
158 {
159 minScore_ = minScore;
160 }
161
GetMaxScore()162 int ZswapdParam::GetMaxScore()
163 {
164 return maxScore_;
165 }
166
SetMaxScore(int maxScore)167 void ZswapdParam::SetMaxScore(int maxScore)
168 {
169 maxScore_ = maxScore;
170 }
171
GetMem2zramRatio()172 unsigned int ZswapdParam::GetMem2zramRatio()
173 {
174 return mem2zramRatio_;
175 }
176
SetMem2zramRatio(unsigned int mem2zramRatio)177 void ZswapdParam::SetMem2zramRatio(unsigned int mem2zramRatio)
178 {
179 mem2zramRatio_ = mem2zramRatio;
180 }
181
GetZram2ufsRatio()182 unsigned int ZswapdParam::GetZram2ufsRatio()
183 {
184 return zram2ufsRatio_;
185 }
186
SetZram2ufsRatio(unsigned int zram2ufsRatio)187 void ZswapdParam::SetZram2ufsRatio(unsigned int zram2ufsRatio)
188 {
189 zram2ufsRatio_ = zram2ufsRatio;
190 }
191
GetRefaultThreshold()192 unsigned int ZswapdParam::GetRefaultThreshold()
193 {
194 return refaultThreshold_;
195 }
196
SetRefaultThreshold(unsigned int refaultThreshold)197 void ZswapdParam::SetRefaultThreshold(unsigned int refaultThreshold)
198 {
199 refaultThreshold_ = refaultThreshold;
200 }
201
Dump(int fd)202 void ReclaimConfig::Dump(int fd)
203 {
204 int index = 0;
205 for (auto it = reclaimConfigSet_.begin(); it != reclaimConfigSet_.end(); it++) {
206 index++;
207 dprintf(fd, "ReclaimConfig %d: \n", index);
208 dprintf(fd, " minScore: %d\n", (*it)->GetMinScore());
209 dprintf(fd, " maxScore: %d\n", (*it)->GetMaxScore());
210 dprintf(fd, " mem2zramRatio: %u\n", (*it)->GetMem2zramRatio());
211 dprintf(fd, " zram2ufsRatio: %u\n", (*it)->GetZram2ufsRatio());
212 dprintf(fd, " refaultThreshold: %u\n", (*it)->GetRefaultThreshold());
213 }
214 }
215 } // namespace Memory
216 } // namespace OHOS
217