2 * PASS (Power Aware System Service) - Memory Resource Driver
4 * Copyright (c) 2022 Samsung Electronics Co., Ltd.
6 * Licensed under the Apache License, Version 2.0 (the License);
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
20 * @file resource-memory.c
27 #include <util/common.h>
29 #include <util/kernel.h>
31 #include <libsyscommon/resource-manager.h>
32 #include <libsyscommon/resource-type.h>
34 #include <resource-monitor/resource-monitor.h>
36 #define PROC_MEM_INFO_MEM_AVAILABLE "MemAvailable"
37 #define PROC_MEM_INFO_MEM_FREE "MemFree"
38 #define PROC_MEM_INFO_BUFFER "Buffers"
39 #define PROC_MEM_INFO_CACHED "Cached"
40 #define PROC_MEM_INFO_CMA_FREE "CmaFree"
41 #define PROC_MEM_INFO_SWAP_FREE "SwapFree"
43 static int memory_get_cma_total(u_int64_t *val)
45 static u_int64_t cma_total = 0;
49 ret = kernel_get_memory_info("CmaTotal", &cma_total);
51 _E("failed to get system CMA total memory\n");
61 static int memory_get_swap_total(u_int64_t *val)
63 static u_int64_t swap_total = 0;
67 ret = kernel_get_memory_info("SwapTotal", &swap_total);
69 _E("failed to get system SWAP total memory\n");
79 static int memory_get_memory_info(struct syscommon_resman_resource *res,
80 const struct syscommon_resman_resource_attribute *attr,
83 u_int64_t *val = (u_int64_t *)data;
86 if (!res || !attr || !data)
90 case MEMORY_ATTR_TOTAL:
91 ret = kernel_get_memory_total(val);
93 case MEMORY_ATTR_AVAILABLE:
94 ret = kernel_get_memory_info(PROC_MEM_INFO_MEM_AVAILABLE, val);
96 case MEMORY_ATTR_FREE:
97 ret = kernel_get_memory_info(PROC_MEM_INFO_MEM_FREE, val);
99 case MEMORY_ATTR_BUFFER:
100 ret = kernel_get_memory_info(PROC_MEM_INFO_BUFFER, val);
102 case MEMORY_ATTR_CACHED:
103 ret = kernel_get_memory_info(PROC_MEM_INFO_CACHED, val);
105 case MEMORY_ATTR_CMA_TOTAL:
106 ret = memory_get_cma_total(val);
108 case MEMORY_ATTR_CMA_FREE:
109 ret = kernel_get_memory_info(PROC_MEM_INFO_CMA_FREE, val);
111 case MEMORY_ATTR_SWAP_TOTAL:
112 ret = memory_get_swap_total(val);
114 case MEMORY_ATTR_SWAP_FREE:
115 ret = kernel_get_memory_info(PROC_MEM_INFO_SWAP_FREE, val);
118 _E("wrong memory resource attribute\n");
127 static const struct syscommon_resman_resource_attribute memory_attrs[] = {
129 .name = "MEMORY_ATTR_TOTAL",
130 .id = MEMORY_ATTR_TOTAL,
131 .type = SYSCOMMON_RESMAN_DATA_TYPE_UINT64,
132 .flag = SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PUBLIC,
134 .get = memory_get_memory_info,
137 .name = "MEMORY_ATTR_AVAILABLE",
138 .id = MEMORY_ATTR_AVAILABLE,
139 .type = SYSCOMMON_RESMAN_DATA_TYPE_UINT64,
140 .flag = SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PUBLIC,
142 .get = memory_get_memory_info,
145 .name = "MEMORY_ATTR_FREE",
146 .id = MEMORY_ATTR_FREE,
147 .type = SYSCOMMON_RESMAN_DATA_TYPE_UINT64,
148 .flag = SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PUBLIC,
150 .get = memory_get_memory_info,
153 .name = "MEMORY_ATTR_BUFFER",
154 .id = MEMORY_ATTR_BUFFER,
155 .type = SYSCOMMON_RESMAN_DATA_TYPE_UINT64,
156 .flag = SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PUBLIC,
158 .get = memory_get_memory_info,
161 .name = "MEMORY_ATTR_CACHED",
162 .id = MEMORY_ATTR_CACHED,
163 .type = SYSCOMMON_RESMAN_DATA_TYPE_UINT64,
164 .flag = SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PUBLIC,
166 .get = memory_get_memory_info,
169 .name = "MEMORY_ATTR_CMA_TOTAL",
170 .id = MEMORY_ATTR_CMA_TOTAL,
171 .type = SYSCOMMON_RESMAN_DATA_TYPE_UINT64,
172 .flag = SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PUBLIC,
174 .get = memory_get_memory_info,
177 .name = "MEMORY_ATTR_CMA_FREE",
178 .id = MEMORY_ATTR_CMA_FREE,
179 .type = SYSCOMMON_RESMAN_DATA_TYPE_UINT64,
180 .flag = SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PUBLIC,
182 .get = memory_get_memory_info,
185 .name = "MEMORY_ATTR_SWAP_TOTAL",
186 .id = MEMORY_ATTR_SWAP_TOTAL,
187 .type = SYSCOMMON_RESMAN_DATA_TYPE_UINT64,
188 .flag = SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PUBLIC,
190 .get = memory_get_memory_info,
193 .name = "MEMORY_ATTR_SWAP_FREE",
194 .id = MEMORY_ATTR_SWAP_FREE,
195 .type = SYSCOMMON_RESMAN_DATA_TYPE_UINT64,
196 .flag = SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PUBLIC,
198 .get = memory_get_memory_info,
203 static const struct syscommon_resman_resource_driver memory_resource_driver = {
205 .type = RESOURCE_TYPE_MEMORY,
206 .flag = SYSCOMMON_RESMAN_RESOURCE_DRIVER_FLAG_COUNT_ONLY_ONE,
207 .attrs = memory_attrs,
208 .num_attrs = ARRAY_SIZE(memory_attrs),
210 SYSCOMMON_RESMAN_RESOURCE_DRIVER_REGISTER(&memory_resource_driver)