memory-cgroup: Move code to correct module and refer to correct module 34/296334/7
authorUnsung Lee <unsung.lee@samsung.com>
Tue, 25 Jul 2023 10:26:09 +0000 (19:26 +0900)
committerChanwoo Choi <cw00.choi@samsung.com>
Mon, 31 Jul 2023 02:40:05 +0000 (02:40 +0000)
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 <unsung.lee@samsung.com>
src/common/cgroup/memory-cgroup.c
src/common/cgroup/memory-cgroup.h
src/resource-limiter/memory/lowmem.c
src/resource-optimizer/memory/swap/swap.c

index 009ba88..e0d6a07 100644 (file)
@@ -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) {
index 25154d1..41ba718 100644 (file)
 #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 <system/syscommon-plugin-resourced-memory-lmk.h>
-
 #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);
 
index ce6e6d2..dc9a730 100644 (file)
@@ -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;
index 970a181..1e1d232 100644 (file)
@@ -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);
 }