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> &param)
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