From b6e74627c914a74cfb07d00fa0e4e42751cbbdfe Mon Sep 17 00:00:00 2001 From: Unsung Lee Date: Tue, 25 Jul 2023 19:26:09 +0900 Subject: [PATCH] memory-cgroup: Move code to correct module and refer to correct module Move lowmem module code which is located in memory-cgroup to lowmem module. In addition, add a function which sets lowest oom score of memory cgroup. Previously, swap module was incorrectly referencing oom level insteaf of memory cgroup. Relocation is done like below: - oom_level is only related to lowmem module. so move all related functions to lowmem module - swap module needs to reference memory cgroup to move pid to Throttling memory cgroup. Therefore, it should reference function from memory cgroup instead of lowmem module. Change-Id: Idd863113f7d058afa60973aea541d5c1c03a2c02 Signed-off-by: Unsung Lee --- src/common/cgroup/memory-cgroup.c | 59 ++++++++------------------- src/common/cgroup/memory-cgroup.h | 32 +++++---------- src/resource-limiter/memory/lowmem.c | 67 +++++++++++++++++++++++++++++-- src/resource-optimizer/memory/swap/swap.c | 8 ++-- 4 files changed, 93 insertions(+), 73 deletions(-) diff --git a/src/common/cgroup/memory-cgroup.c b/src/common/cgroup/memory-cgroup.c index 009ba88..e0d6a07 100644 --- a/src/common/cgroup/memory-cgroup.c +++ b/src/common/cgroup/memory-cgroup.c @@ -88,6 +88,23 @@ bool memcg_memsw_is_supported(void) return is_supported; } +int memcg_get_lowest_oom_score_adj(enum cgroup_type cgroup_type, int *oom_score_adj) +{ + switch (cgroup_type) { + case MEMCG_THROTTLING: + *oom_score_adj = OOMADJ_BACKGRD_UNLOCKED + OOMADJ_APP_INCREASE; + break; + case MEMCG_ROOT: + *oom_score_adj = OOMADJ_SU; + break; + default: + _E("Unknown memory cgroup type"); + return RESOURCED_ERROR_FAIL; + } + + return RESOURCED_ERROR_NONE; +} + int cgroup_get_type(int oom_score_adj) { if (oom_score_adj >= OOMADJ_BACKGRD_UNLOCKED + OOMADJ_APP_INCREASE && @@ -97,48 +114,6 @@ int cgroup_get_type(int oom_score_adj) return MEMCG_ROOT; } -int cgroup_get_lowest_oom_score_adj( - enum syscommon_resourced_memory_lmk_oom_level oom_level) -{ - switch (oom_level) { - case OOM_LEVEL_BACKGROUND_LEAST_RECENTLY_USED: - return OOMADJ_BACKGRD_UNLOCKED + OOMADJ_APP_INCREASE; - case OOM_LEVEL_BACKGROUND_MOST_RECENTLY_USED: - return OOMADJ_BACKGRD_PERCEPTIBLE; - case OOM_LEVEL_FOREGROUND: - return OOMADJ_FOREGRD_LOCKED; - case OOM_LEVEL_FOREGROUND_AND_PROC: - return OOMADJ_SU; - default: - if (oom_level < OOM_LEVEL_BACKGROUND_LEAST_RECENTLY_USED - || oom_level > OOM_LEVEL_ALL) - _E("oom level is out of range"); - - return OOMADJ_SU; - } -} - -int cgroup_get_highest_oom_score_adj( - enum syscommon_resourced_memory_lmk_oom_level oom_level) -{ - switch (oom_level) { - case OOM_LEVEL_BACKGROUND_LEAST_RECENTLY_USED: - return OOMADJ_APP_MAX; - case OOM_LEVEL_BACKGROUND_MOST_RECENTLY_USED: - return OOMADJ_BACKGRD_UNLOCKED; - case OOM_LEVEL_FOREGROUND: - return OOMADJ_FOREGRD_UNLOCKED; - case OOM_LEVEL_FOREGROUND_AND_PROC: - return OOMADJ_FOREGRD_UNLOCKED; - default: - if (oom_level < OOM_LEVEL_BACKGROUND_LEAST_RECENTLY_USED - || oom_level > OOM_LEVEL_ALL) - _E("oom level is out of range"); - - return OOMADJ_APP_MAX; - } -} - struct cgroup *get_cgroup_tree(int idx) { if(idx < MEMCG_ROOT || idx >= MEMCG_END) { diff --git a/src/common/cgroup/memory-cgroup.h b/src/common/cgroup/memory-cgroup.h index 25154d1..41ba718 100644 --- a/src/common/cgroup/memory-cgroup.h +++ b/src/common/cgroup/memory-cgroup.h @@ -30,14 +30,6 @@ #include "cgroup.h" #include "const.h" -/** - * FIXME: Remove this header from common code. - * Currently, some lowmem module code is located in common memory-cgroup.h. - * Therefore, no choice to include this header file before moving lowmem module - * code to correctt location. - */ -#include - #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ @@ -252,27 +244,21 @@ int memcg_make_full_subdir(const char* parentdir); bool get_use_hierarchy(int idx); /** + * @desc get lowest oom_score_adj of each memory cgroup type, + * @param cgroup_type - cgroup_type + * @param oom_score_adj - output value, + * oom_score_adj of the corresponding memory cgroup type + * @return negative value if error + */ +int memcg_get_lowest_oom_score_adj(enum cgroup_type, int *oom_score_adj); + +/** * @desc Get cgroup type according to oom_score_adj * @param oom_score_adj - oom_score_adj * @return cgroup type */ int cgroup_get_type(int oom_score_adj); -/** - * @desc Get the highest oom_score_adj of the cgroup type - * @param oom_level - oom level - * @return oom_score_adj - */ -int cgroup_get_highest_oom_score_adj( - enum syscommon_resourced_memory_lmk_oom_level oom_level); - -/** - * @desc Get the lowest oom_score_adj of the cgroup type - * @param oom_level - oom level - * @return oom_score_adj - */ -int cgroup_get_lowest_oom_score_adj( - enum syscommon_resourced_memory_lmk_oom_level oom_level); struct memcg_info *get_memcg_info(int idx); struct cgroup *get_cgroup_tree(int idx); diff --git a/src/resource-limiter/memory/lowmem.c b/src/resource-limiter/memory/lowmem.c index ce6e6d2..dc9a730 100644 --- a/src/resource-limiter/memory/lowmem.c +++ b/src/resource-limiter/memory/lowmem.c @@ -797,6 +797,62 @@ leave: return victim_cnt; } +static int lowmem_get_lowest_oom_score_adj( + enum syscommon_resourced_memory_lmk_oom_level oom_level, + int *oom_score_adj) +{ + switch (oom_level) { + case OOM_LEVEL_BACKGROUND_LEAST_RECENTLY_USED: + *oom_score_adj = OOMADJ_BACKGRD_UNLOCKED + OOMADJ_APP_INCREASE; + break; + case OOM_LEVEL_BACKGROUND_MOST_RECENTLY_USED: + *oom_score_adj = OOMADJ_BACKGRD_PERCEPTIBLE; + break; + case OOM_LEVEL_FOREGROUND: + *oom_score_adj = OOMADJ_FOREGRD_LOCKED; + break; + case OOM_LEVEL_FOREGROUND_AND_PROC: + *oom_score_adj = OOMADJ_SU; + break; + case OOM_LEVEL_ALL: + *oom_score_adj = OOMADJ_SU; + break; + default: + _E("oom level is out of range"); + return RESOURCED_ERROR_INVALID_PARAMETER; + } + + return RESOURCED_ERROR_NONE; +} + +static int lowmem_get_highest_oom_score_adj( + enum syscommon_resourced_memory_lmk_oom_level oom_level, + int *oom_score_adj) +{ + switch (oom_level) { + case OOM_LEVEL_BACKGROUND_LEAST_RECENTLY_USED: + *oom_score_adj = OOMADJ_APP_MAX; + break; + case OOM_LEVEL_BACKGROUND_MOST_RECENTLY_USED: + *oom_score_adj = OOMADJ_BACKGRD_UNLOCKED; + break; + case OOM_LEVEL_FOREGROUND: + *oom_score_adj = OOMADJ_FOREGRD_UNLOCKED; + break; + case OOM_LEVEL_FOREGROUND_AND_PROC: + *oom_score_adj = OOMADJ_FOREGRD_UNLOCKED; + break; + case OOM_LEVEL_ALL: + *oom_score_adj = OOMADJ_APP_MAX; + break; + default: + _E("oom level is out of range"); + return RESOURCED_ERROR_INVALID_PARAMETER; + } + + return RESOURCED_ERROR_NONE; +} + static int calculate_range_of_oom( enum syscommon_resourced_memory_lmk_oom_level oom_level, int *min, int *max) @@ -807,8 +863,10 @@ static int calculate_range_of_oom( return RESOURCED_ERROR_FAIL; } - *max = cgroup_get_highest_oom_score_adj(oom_level); - *min = cgroup_get_lowest_oom_score_adj(oom_level); + if (lowmem_get_highest_oom_score_adj(oom_level, max) < 0) + return RESOURCED_ERROR_FAIL; + if (lowmem_get_lowest_oom_score_adj(oom_level, min) < 0) + return RESOURCED_ERROR_FAIL; return RESOURCED_ERROR_NONE; } @@ -1027,8 +1085,9 @@ void lowmem_trigger_swap(pid_t pid, char *path, bool move) return; } - lowest_oom_score_adj = cgroup_get_lowest_oom_score_adj( - OOM_LEVEL_BACKGROUND_LEAST_RECENTLY_USED); + if (lowmem_get_lowest_oom_score_adj(OOM_LEVEL_BACKGROUND_LEAST_RECENTLY_USED, + &lowest_oom_score_adj) < 0) + return; if (oom_score_adj < lowest_oom_score_adj) { oom_score_adj = lowest_oom_score_adj; diff --git a/src/resource-optimizer/memory/swap/swap.c b/src/resource-optimizer/memory/swap/swap.c index 970a181..1e1d232 100644 --- a/src/resource-optimizer/memory/swap/swap.c +++ b/src/resource-optimizer/memory/swap/swap.c @@ -180,8 +180,7 @@ static inline void swap_add_bundle(struct swap_thread_bundle *bundle) pthread_mutex_unlock(&swap_thread_queue.lock); } -static int swap_move_to_cgroup_by_pid( - enum syscommon_resourced_memory_lmk_oom_level oom_level, pid_t pid) +static int swap_move_to_cgroup_by_pid(enum cgroup_type cgroup_type, pid_t pid) { int error; int oom_score_adj; @@ -195,7 +194,8 @@ static int swap_move_to_cgroup_by_pid( return RESOURCED_ERROR_FAIL; } - lowest_oom_score_adj = cgroup_get_lowest_oom_score_adj(oom_level); + if (memcg_get_lowest_oom_score_adj(cgroup_type, &lowest_oom_score_adj) < 0) + return RESOURCED_ERROR_FAIL; if (oom_score_adj < lowest_oom_score_adj) oom_score_adj = lowest_oom_score_adj; @@ -849,7 +849,7 @@ static void swap_start_pid_dbus_signal_handler(GVariant *params) cgroup_swap = get_cgroup_tree(MEMCG_THROTTLING); if (!cgroup_swap) return; - swap_move_to_cgroup_by_pid(OOM_LEVEL_BACKGROUND_LEAST_RECENTLY_USED, pid); + swap_move_to_cgroup_by_pid(MEMCG_THROTTLING, pid); swap_start_handler(cgroup_swap->memcg_info->name); _I("[SWAP] swap cgroup entered : pid : %d", (int)pid); } -- 2.7.4