From 7e8316465ecd723d9ee018583ee2657371450015 Mon Sep 17 00:00:00 2001 From: Unsung Lee Date: Tue, 5 Sep 2023 13:42:01 +0900 Subject: [PATCH] lowmem: Add active, inactive, and swap usage in task_info Add active, inactive, and swap usage of each app in task_info structure. This infomration will be used in get_kill_candidates_post_with_wss() function. Active, inactive, and swap usage are counted by - Active usage is sum of active_anon + active_file in memcg - Inactive usage is sum of inactive_anon + inactive_file in memcg - Swap usage is a mount of swap in memcg Change-Id: I1e96d12023eb303754a0120e18c20ee9e66a1459 Signed-off-by: Unsung Lee --- src/common/cgroup/memory-cgroup.c | 34 ++++++++++++++++++++++++++++ src/common/cgroup/memory-cgroup.h | 12 ++++++++++ src/resource-limiter/memory/lowmem.c | 43 ++++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+) diff --git a/src/common/cgroup/memory-cgroup.c b/src/common/cgroup/memory-cgroup.c index e0d6a07..fa5ff21 100644 --- a/src/common/cgroup/memory-cgroup.c +++ b/src/common/cgroup/memory-cgroup.c @@ -525,6 +525,40 @@ int memcg_get_memory_stat(const char *name, struct cgroup_memory_stat **mem_stat return 0; } +int memcg_get_inactive_memory(char *memcg, unsigned long long *inactive_bytes) +{ + int ret; + _cleanup_free_ struct cgroup_memory_stat *mem_stat = NULL; + + ret = memcg_get_memory_stat(memcg, &mem_stat); + if (ret) { + _D("fail to get memory status : %s", memcg); + return ret; + } + + *inactive_bytes = mem_stat->value[CGROUP_MEMORY_STAT_INACTIVE_FILE]; + *inactive_bytes += mem_stat->value[CGROUP_MEMORY_STAT_INACTIVE_ANON]; + + return 0; +} + +int memcg_get_active_memory(char *memcg, unsigned long long *active_bytes) +{ + int ret; + _cleanup_free_ struct cgroup_memory_stat *mem_stat = NULL; + + ret = memcg_get_memory_stat(memcg, &mem_stat); + if (ret) { + _D("fail to get memory status : %s", memcg); + return ret; + } + + *active_bytes = mem_stat->value[CGROUP_MEMORY_STAT_ACTIVE_FILE]; + *active_bytes += mem_stat->value[CGROUP_MEMORY_STAT_ACTIVE_ANON]; + + return 0; +} + int memcg_get_anon_usage(char *memcg, unsigned long long *anon_usage_bytes) { int r; diff --git a/src/common/cgroup/memory-cgroup.h b/src/common/cgroup/memory-cgroup.h index 41ba718..91c3842 100644 --- a/src/common/cgroup/memory-cgroup.h +++ b/src/common/cgroup/memory-cgroup.h @@ -212,6 +212,18 @@ void memcg_info_set_swappiness(struct memcg_info *mi, int swappiness); int memcg_get_memory_stat(const char *name, struct cgroup_memory_stat **mem_stat); /** + * @desc get inactive memory usage of cgroup based on memory.stat + * @return 0 if the value was correctly read + */ +int memcg_get_inactive_memory(char *memcg, unsigned long long *inactive_bytes); + +/** + * @desc get active memory usage of cgroup based on memory.stat + * @return 0 if the value was correctly read + */ +int memcg_get_active_memory(char *memcg, unsigned long long *active_bytes); + +/** * @desc get anon memory usage of cgroup based on memory.stat * @return 0 if the value was correctly read */ diff --git a/src/resource-limiter/memory/lowmem.c b/src/resource-limiter/memory/lowmem.c index 8f216b6..f1b43f9 100644 --- a/src/resource-limiter/memory/lowmem.c +++ b/src/resource-limiter/memory/lowmem.c @@ -543,6 +543,44 @@ static void init_task_window_info(struct task_info *task, struct proc_app_window task->is_mapped = window.is_mapped; } +static void init_task_working_set_size_info(struct task_info *task, + const char *appid) +{ + char path[PATH_MAX] = ""; + unsigned long long inactive_bytes; + unsigned long long active_bytes; + unsigned long long swap_bytes; + int ret; + + assert(task); + assert(appid); + + snprintf(path, PATH_MAX, "%s/%s", MEMCG_PRIVATE_PATH, appid); + + ret = memcg_get_active_memory(path, &active_bytes); + if (ret) + goto parse_fail; + + ret = memcg_get_inactive_memory(path, &inactive_bytes); + if (ret) + goto parse_fail; + + ret = memcg_get_swap_usage(path, &swap_bytes); + if (ret) + goto parse_fail; + + task->active_memory_kb = (unsigned long) BYTE_TO_KBYTE(active_bytes); + task->inactive_memory_kb = (unsigned long) BYTE_TO_KBYTE(inactive_bytes); + task->swap_memory_kb = (unsigned long) BYTE_TO_KBYTE(swap_bytes); + + return; + +parse_fail: + task->active_memory_kb = 0; + task->inactive_memory_kb = 0; + task->swap_memory_kb = 0; +} + static GArray *lowmem_get_task_info_app(int killer_flags, int start_oom, int end_oom) { GSList *iter = NULL; @@ -555,6 +593,9 @@ static GArray *lowmem_get_task_info_app(int killer_flags, int start_oom, int end struct proc_app_info *pai = (struct proc_app_info *)(iter->data); struct task_info task; + if (!pai->appid) + continue; + if (!pai->main_pid) continue; @@ -607,6 +648,8 @@ static GArray *lowmem_get_task_info_app(int killer_flags, int start_oom, int end } init_task_window_info(&task, pai->window); + init_task_working_set_size_info(&task, pai->appid); + g_array_append_val(lowmem_task_info_app_array, task); } -- 2.7.4