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>
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 &&
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) {
#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 */
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);
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)
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;
}
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;
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;
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;
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);
}