Modify CPU cgroup hierarchy 16/269016/9
authorUnsung Lee <unsung.lee@samsung.com>
Fri, 31 Dec 2021 06:22:30 +0000 (15:22 +0900)
committerHyotaek Shim <hyotaek.shim@samsung.com>
Fri, 7 Jan 2022 00:25:57 +0000 (00:25 +0000)
/sys/fs/cgroup/cpu/high/medium/low
                       /tizendocker

Change-Id: I67160165e21149353f0f3acda9048e214df1c8f2
Signed-off-by: Unsung Lee <unsung.lee@samsung.com>
src/common/cgroup/cgroup.c
src/common/cgroup/cgroup.h
src/common/cgroup/cpu-cgroup.h
src/process/proc-main.c
src/resource-limiter/cpu/cpu.c

index 16476a6..f597fe8 100644 (file)
 #include <unistd.h>
 #include <sys/mount.h>
 
-#define RELEASE_AGENT  "release_agent"
+#define RELEASE_AGENT     "release_agent"
 #define NOTIFY_ON_RELEASE  "notify_on_release"
 
+#define MAKE_NAME(name)    CGROUP_##name##_NAME
+#define cgroup_name_cpy(dst, src, length)      \
+               do { \
+                       bool success = sizeof(dst) >= length ? true : false;    \
+                       if(success) { \
+                               strncpy(dst, src, sizeof(dst) - 1);             \
+                       }       \
+                       else {  \
+                               return RESOURCED_ERROR_OUT_OF_MEMORY;   \
+                       }       \
+               } while(0)
+
+#define cgroup_name_cat(dst, src, length)      \
+               do { \
+                       bool success = sizeof(dst) >= strlen(dst) + length ? true : false;      \
+                       if(success) { \
+                               strncat(dst, src, sizeof(dst) - strlen(dst) - 1);               \
+                       }       \
+                       else {  \
+                               return RESOURCED_ERROR_OUT_OF_MEMORY;   \
+                       }       \
+               } while(0)
+
 static bool cgroup_is_exists(const char *cgroup_full_path)
 {
        struct stat stat_buf;
@@ -169,6 +192,48 @@ int cgroup_read_node_int32(const char *cgroup_name,
        return ret;
 }
 
+int cgroup_make_full_subdir(const char* parentdir)
+{
+       int result;
+       char path[MAX_PATH_LENGTH] = {0, };
+
+       cgroup_name_cpy(path, parentdir, strlen(parentdir) + 1);
+
+       for(int i = CGROUP_VIP; i < CGROUP_END; i++) {
+               char name[MAX_NAME_LENGTH] = {0, };
+
+               if(i == CGROUP_VIP) {
+                       cgroup_name_cpy(name, MAKE_NAME(VIP), strlen(MAKE_NAME(VIP))+ 1);
+               }
+               else if(i == CGROUP_HIGH) {
+                       cgroup_name_cpy(name, MAKE_NAME(HIGH), strlen(MAKE_NAME(HIGH))+ 1);
+               }
+               else if(i == CGROUP_MEDIUM) {
+                       cgroup_name_cpy(name, MAKE_NAME(MEDIUM), strlen(MAKE_NAME(MEDIUM))+ 1);
+               }
+               else if(i == CGROUP_LOW) {
+                       cgroup_name_cpy(name, MAKE_NAME(LOW), strlen(MAKE_NAME(LOW))+ 1);
+               }
+
+               result = cgroup_make_subdir(path, name, NULL);
+               ret_value_msg_if(result < 0, result, "%s/%s init failed\n", path, name);
+
+               cgroup_name_cat(path, "/", 2);
+               cgroup_name_cat(path, name, strlen(name) + 1);
+
+               // ../../perprocess
+               result = cgroup_make_subdir(path, MAKE_NAME(PER_PROCESS), NULL);
+               ret_value_msg_if(result < 0, result, "%s/%s init failed\n",
+                               path, MAKE_NAME(PER_PROCESS));
+               // ../../group
+               result = cgroup_make_subdir(path, MAKE_NAME(GROUP), NULL);
+               ret_value_msg_if(result < 0, result, "%s/%s init failed\n",
+                               path, MAKE_NAME(GROUP));
+       }
+
+       return RESOURCED_ERROR_NONE;
+}
+
 int cgroup_make_subdir(const char* parentdir, const char* cgroup_name, bool *already)
 {
        char buf[MAX_PATH_LENGTH];
index 7cec0ca..8991553 100644 (file)
@@ -39,9 +39,26 @@ extern "C" {
 #define TASK_FILE_NAME          "tasks"
 #define CGROUP_FILE_NAME        "cgroup.procs"
 
-//#define DEFAULT_CGROUP                       "/sys/fs/cgroup"
 #define CGROUP_PATH             "/sys/fs/cgroup"
 
+#define CGROUP_VIP_NAME         ""
+#define CGROUP_HIGH_NAME        "High"
+#define CGROUP_MEDIUM_NAME      "Medium"
+#define CGROUP_LOW_NAME         "Lowest"
+
+#define CGROUP_PER_PROCESS_NAME ""
+#define CGROUP_GROUP_NAME       ""
+
+enum cgroup_type {
+       CGROUP_TOP = -1,
+       CGROUP_ROOT,
+       CGROUP_VIP,
+       CGROUP_HIGH,
+       CGROUP_MEDIUM,
+       CGROUP_LOW,
+       CGROUP_END,
+};
+
 /**
  * @desc Get one unsigned int32 value from cgroup
  * @param cgroup_name - cgroup path
@@ -91,6 +108,13 @@ int cgroup_write_node_str(const char *cgroup_name,
                const char *file_name, const char *string);
 
 /**
+ * @desc make full cgroup,
+ * @param parentdir - parent cgroup path
+ * @return negative value if error
+ */
+int cgroup_make_full_subdir(const char* parentdir);
+
+/**
  * @desc make cgroup,
  * @param parentdir - parent cgroup path
  * @param cgroup_name - cgroup subdirectory to write
index 8b36e34..53a7ffa 100644 (file)
 extern "C" {
 #endif /* __cplusplus */
 
-#define CPUCG_PATH                      "/sys/fs/cgroup/cpu"
-#define CPUCG_BACKGROUND_PATH           CPUCG_PATH"/background"
-#define CPUCG_QUOTA_PATH                CPUCG_PATH"/quota"
+#define CPUCG_PATH                      CGROUP_PATH "/cpu"
+#define CPUCG_VIP_PATH                  CPUCG_PATH "/" CGROUP_VIP_NAME
+#define CPUCG_HIGH_PATH                 CPUCG_PATH "/" CGROUP_VIP_NAME "/" CGROUP_HIGH_NAME
+#define CPUCG_MEDIUM_PATH               CPUCG_PATH "/" CGROUP_VIP_NAME "/" CGROUP_HIGH_NAME "/" CGROUP_MEDIUM_NAME
+#define CPUCG_LOW_PATH                  CPUCG_PATH "/" CGROUP_VIP_NAME "/" CGROUP_HIGH_NAME "/" CGROUP_MEDIUM_NAME "/" CGROUP_LOW_NAME
 #define CPUCG_CONTROL_BANDWIDTH         "cpu.cfs_quota_us"
 #define CPUCG_CONTROL_FULL_BANDWIDTH    "cpu.cfs_period_us"
 #define CPUCG_SHARE                     "cpu.shares"
 
-/*#define CPU_DEFAULT_CGROUP         "/sys/fs/cgroup/cpu"
-#define CPU_BACKGROUND_GROUP       CPU_DEFAULT_CGROUP"/background"
-#define CPU_CPUQUOTA_GROUP         CPU_DEFAULT_CGROUP"/quota"
-#define CPU_CONTROL_BANDWIDTH      "cpu.cfs_quota_us"
-#define CPU_CONTROL_FULL_BANDWIDTH "cpu.cfs_period_us"
-#define CPU_SHARE                  "cpu.shares"*/
+#define CPUCG_VIP_PP_PATH               CPUCG_VIP_PATH"/"CGROUP_PER_PROCESS_NAME
+#define CPUCG_VIP_GROUP_PATH            CPUCG_VIP_PATH"/"CGROUP_GROUP_NAME
 
+#define CPUCG_HIGH_PP_PATH              CPUCG_HIGH_PATH"/"CGROUP_PER_PROCESS_NAME
+#define CPUCG_HIGH_GROUP_PATH           CPUCG_HIGH_PATH"/"CGROUP_GROUP_NAME
+
+#define CPUCG_MEDIUM_PP_PATH            CPUCG_MEDIUM_PATH"/"CGROUP_PER_PROCESS_NAME
+#define CPUCG_MEDIUM_GROUP_PATH         CPUCG_MEDIUM_PATH"/"CGROUP_GROUP_NAME
+
+#define CPUCG_LOW_PP_PATH               CPUCG_LOW_PATH"/"CGROUP_PER_PROCESS_NAME
+#define CPUCG_LOW_GROUP_PATH            CPUCG_LOW_PATH"/"CGROUP_GROUP_NAME
 
 #ifdef __cplusplus
 }
index 1845a26..6121d52 100644 (file)
@@ -1452,6 +1452,19 @@ enum proc_state proc_check_suspend_state(struct proc_app_info *pai)
        return PROC_STATE_DEFAULT;
 }
 
+/*static const char *convert_status_to_str(int status)
+{
+       static const char *set[] = {"foreground", "active", "backround",
+                                                               "inactive", "launch", "resume", "terminate",
+                                                               "service", "noti", "exclude", "memsweep", "terminated",
+                                                               "system_service", "cmdline", "exe", "stat", "status",
+                                                               "oomscore", "pgid_cmdline"};
+       if(status < PROC_CGROUP_SET_FOREGRD || status > PROC_CGROUP_GET_PGID_CMDLINE)
+               return "error status";
+       else
+               return set[status];
+}*/
+
 
 int resourced_proc_status_change(int status, pid_t pid, char *app_name, char *pkg_name, int apptype)
 {
@@ -1475,6 +1488,9 @@ int resourced_proc_status_change(int status, pid_t pid, char *app_name, char *pk
 
        ps.pid = pid;
        ps.pai = NULL;
+
+       //_E("status: %s, app_name: %s, pid: %d, oom_score: %d", convert_status_to_str(status), app_name, pid, oom_score_adj);
+
        switch (status) {
        case PROC_CGROUP_SET_FOREGRD:
                if (app_name)
index 36c27dd..680c87e 100644 (file)
 #include "file-helper.h"
 #include "cpu-cgroup.h"
 
-/*#define CPUCG_PATH         "/sys/fs/cgroup/cpu"
-#define CPUCG_BACKGROUND_PATH       CPUCG_PATH"/background"
-#define CPUCG_QUOTA_PATH         CPUCG_PATH"/quota"
-#define CPUCG_CONTROL_BANDWIDTH      "cpu.cfs_quota_us"
-#define CPUCG_CONTROL_FULL_BANDWIDTH "cpu.cfs_period_us"
-#define CPU_SHARE                  "cpu.shares"*/
-
-#define CPU_CONF_FILE     RD_CONFIG_FILE(cpu)
-#define CPU_CONF_SECTION       "CONTROL"
-#define CPU_CONF_PREDEFINE     "PREDEFINE"
-#define CPU_CONF_BOOTING       "BOOTING_PREDEFINE"
-#define CPU_CONF_WRT   "WRT_PREDEFINE"
-#define CPU_CONF_LAZY  "LAZY_PREDEFINE"
-#define MAX_PREDEFINED_TASKS 10
+#define CPU_CONF_FILE       RD_CONFIG_FILE(cpu)
+#define CPU_CONF_SECTION    "CONTROL"
+#define CPU_CONF_PREDEFINE  "PREDEFINE"
+#define CPU_CONF_BOOTING    "BOOTING_PREDEFINE"
+#define CPU_CONF_WRT        "WRT_PREDEFINE"
+#define CPU_CONF_LAZY       "LAZY_PREDEFINE"
+#define MAX_PREDEFINED_TASKS  10
 #define CPU_TIMER_INTERVAL       30
-#define CPU_DEFAULT_PRI 0
-#define CPU_BACKGROUND_PRI 1
-#define CPU_CONTROL_PRI 10
+#define CPU_DEFAULT_PRI       0
+#define CPU_BACKGROUND_PRI    1
+#define CPU_CONTROL_PRI       10
 
 static GSource *cpu_predefined_timer;
 static bool bCPUQuota;
@@ -187,7 +180,7 @@ static int load_cpu_config(struct parse_result *result, void *user_data)
        if (!strncmp(result->name, CPU_CONF_PREDEFINE, strlen(CPU_CONF_PREDEFINE)+1)) {
                pid = find_pid_from_cmdline(result->value);
                if (pid > 0) {
-                       cpu_move_cgroup(pid, CPUCG_BACKGROUND_PATH);
+                       cpu_move_cgroup(pid, CPUCG_MEDIUM_GROUP_PATH);
                        def_list.control[def_list.num].pid = pid;
                        def_list.control[def_list.num++].type = SET_DEFAUT;
                } else {
@@ -196,7 +189,7 @@ static int load_cpu_config(struct parse_result *result, void *user_data)
        } else if (!strncmp(result->name, CPU_CONF_BOOTING, strlen(CPU_CONF_BOOTING)+1)) {
                pid = find_pid_from_cmdline(result->value);
                if (pid > 0) {
-                       cpu_move_cgroup(pid, CPUCG_BACKGROUND_PATH);
+                       cpu_move_cgroup(pid, CPUCG_MEDIUM_GROUP_PATH);
                        def_list.control[def_list.num].pid = pid;
                        def_list.control[def_list.num++].type = SET_BOOTING;
                        setpriority(PRIO_PROCESS, pid, CPU_BACKGROUND_PRI);
@@ -204,7 +197,7 @@ static int load_cpu_config(struct parse_result *result, void *user_data)
        } else if (!strncmp(result->name, CPU_CONF_WRT, strlen(CPU_CONF_WRT)+1)) {
                pid = find_pid_from_cmdline(result->value);
                if (pid > 0) {
-                       cpu_move_cgroup(pid, CPUCG_BACKGROUND_PATH);
+                       cpu_move_cgroup(pid, CPUCG_MEDIUM_GROUP_PATH);
                        def_list.control[def_list.num].pid = pid;
                        def_list.control[def_list.num++].type = SET_WRT;
                        setpriority(PRIO_PROCESS, pid, CPU_CONTROL_PRI);
@@ -219,18 +212,18 @@ static int load_cpu_config(struct parse_result *result, void *user_data)
        } else if (!strncmp(result->name, "BACKGROUND_CPU_SHARE", strlen("BACKGROUND_CPU_SHARE")+1)) {
                value = atoi(result->value);
                if (value)
-                       cgroup_write_node_uint32(CPUCG_BACKGROUND_PATH, CPUCG_SHARE,
+                       cgroup_write_node_uint32(CPUCG_MEDIUM_PATH, CPUCG_SHARE,
                                        get_relative_value(CPUCG_PATH, CPUCG_SHARE, value));
        } else if (!strncmp(result->name, "QUOTA_CPU_SHARE", strlen("QUOTA_CPU_SHARE")+1)) {
                value = atoi(result->value);
                if (value && cpu_quota_enabled())
-                       cgroup_write_node_uint32(CPUCG_QUOTA_PATH, CPUCG_SHARE,
+                       cgroup_write_node_uint32(CPUCG_LOW_PATH, CPUCG_SHARE,
                                        get_relative_value(CPUCG_PATH, CPUCG_SHARE, value));
        } else if (!strncmp(result->name, "QUOTA_MAX_BANDWIDTH", strlen("QUOTA_MAX_BANDWIDTH")+1)) {
                value = atoi(result->value);
                if (value && cpu_quota_enabled())
-                       cgroup_write_node_uint32(CPUCG_QUOTA_PATH, CPUCG_CONTROL_BANDWIDTH,
-                                       get_relative_value(CPUCG_QUOTA_PATH,
+                       cgroup_write_node_uint32(CPUCG_LOW_PATH, CPUCG_CONTROL_BANDWIDTH,
+                                       get_relative_value(CPUCG_LOW_PATH,
                                                CPUCG_CONTROL_FULL_BANDWIDTH, value));
        }
 
@@ -249,7 +242,7 @@ static int cpu_service_state(void *data)
            CHECK_BIT(ps->pai->categories, PROC_BG_MEDIA))
                return RESOURCED_ERROR_NONE;
 
-       cpu_move_cgroup(ps->pid, CPUCG_BACKGROUND_PATH);
+       cpu_move_cgroup(ps->pid, CPUCG_MEDIUM_GROUP_PATH);
        return RESOURCED_ERROR_NONE;
 }
 
@@ -261,7 +254,7 @@ static int cpu_widget_state(void *data)
 
        _D("widget background: pid = %d, appname = %s", ps->pid, ps->pai->appid);
        if (CHECK_BIT(ps->pai->flags, PROC_DOWNLOADAPP))
-               cpu_move_cgroup(ps->pid, CPUCG_BACKGROUND_PATH);
+               cpu_move_cgroup(ps->pid, CPUCG_MEDIUM_GROUP_PATH);
        return RESOURCED_ERROR_NONE;
 }
 
@@ -276,7 +269,7 @@ static int cpu_foreground_state(void *data)
        if (pri == -1 || pri > CPU_DEFAULT_PRI)
                setpriority(PRIO_PGRP, ps->pid, CPU_DEFAULT_PRI);
        if (check_predefined(ps->pid) != SET_DEFAUT)
-               cpu_move_cgroup_foreach(ps->pid, ps->pai, CPUCG_PATH);
+               cpu_move_cgroup_foreach(ps->pid, ps->pai, CPUCG_HIGH_GROUP_PATH);
        return RESOURCED_ERROR_NONE;
 }
 
@@ -287,7 +280,7 @@ static int cpu_background_state(void *data)
 
        _D("app background: pid = %d", ps->pid);
        setpriority(PRIO_PGRP, ps->pid, CPU_BACKGROUND_PRI);
-       cpu_move_cgroup_foreach(ps->pid, ps->pai, CPUCG_BACKGROUND_PATH);
+       cpu_move_cgroup_foreach(ps->pid, ps->pai, CPUCG_MEDIUM_GROUP_PATH);
        return RESOURCED_ERROR_NONE;
 }
 
@@ -304,7 +297,7 @@ static int cpu_restrict_state(void *data)
                return RESOURCED_ERROR_NONE;
 
        _D("app suspend: pid = %d, appname = %s", ps->pid, ps->pai->appid);
-       cpu_move_cgroup_foreach(ps->pid, ps->pai, CPUCG_QUOTA_PATH);
+       cpu_move_cgroup_foreach(ps->pid, ps->pai, CPUCG_LOW_GROUP_PATH);
        return RESOURCED_ERROR_NONE;
 }
 
@@ -318,7 +311,7 @@ static int cpu_active_state(void *data)
        ret = proc_get_oom_score_adj(ps->pid, &oom_score_adj);
        if (ret || oom_score_adj < OOMADJ_PREVIOUS_DEFAULT)
                return RESOURCED_ERROR_NONE;
-       cpu_move_cgroup_foreach(ps->pid, ps->pai, CPUCG_PATH);
+       cpu_move_cgroup_foreach(ps->pid, ps->pai, CPUCG_HIGH_GROUP_PATH);
        return RESOURCED_ERROR_NONE;
 }
 
@@ -333,7 +326,7 @@ static int cpu_prelaunch_state(void *data)
        if (ps->pai->type & PROC_WEBAPP) {
                for (i = 0; i < def_list.num; i++) {
                        if (def_list.control[i].type == SET_WRT) {
-                               cpu_move_cgroup(def_list.control[i].pid, CPUCG_PATH);
+                               cpu_move_cgroup(def_list.control[i].pid, CPUCG_HIGH_GROUP_PATH);
                                setpriority(PRIO_PGRP, def_list.control[i].pid, 0);
                                ioprio_set(IOPRIO_WHO_PROCESS, def_list.control[i].pid, IOPRIO_CLASS_BE << IOPRIO_CLASS_SHIFT);
                                return RESOURCED_ERROR_NONE;
@@ -349,7 +342,7 @@ static int cpu_system_state(void *data)
        assert(ps);
 
        _D("system service : pid = %d", ps->pid);
-       cpu_move_cgroup(ps->pid, CPUCG_BACKGROUND_PATH);
+       cpu_move_cgroup(ps->pid, CPUCG_MEDIUM_GROUP_PATH);
        return RESOURCED_ERROR_NONE;
 }
 
@@ -358,7 +351,7 @@ static int cpu_terminatestart_state(void *data)
        struct proc_status *ps = (struct proc_status *)data;
        assert(ps);
 
-       cpu_move_cgroup_foreach(ps->pid, ps->pai, CPUCG_PATH);
+       cpu_move_cgroup_foreach(ps->pid, ps->pai, CPUCG_HIGH_GROUP_PATH);
        return RESOURCED_ERROR_NONE;
 }
 
@@ -368,9 +361,9 @@ static int cpu_exclude_state(void *data)
        if (check_predefined(pe->pid) == SET_DEFAUT)
                return RESOURCED_ERROR_NONE;
        if (pe->type == PROC_INCLUDE)
-               cpu_move_cgroup(pe->pid, CPUCG_BACKGROUND_PATH);
+               cpu_move_cgroup(pe->pid, CPUCG_MEDIUM_GROUP_PATH);
        else
-               cpu_move_cgroup(pe->pid, CPUCG_PATH);
+               cpu_move_cgroup(pe->pid, CPUCG_HIGH_GROUP_PATH);
        return RESOURCED_ERROR_NONE;
 }
 
@@ -380,12 +373,12 @@ static gboolean cpu_predefined_cb(gpointer data)
 
        for (i = 0; i < def_list.num; i++) {
                if (def_list.control[i].type == SET_LAZY) {
-                       cpu_move_cgroup(def_list.control[i].pid, CPUCG_BACKGROUND_PATH);
+                       cpu_move_cgroup(def_list.control[i].pid, CPUCG_MEDIUM_GROUP_PATH);
                } else if (def_list.control[i].type == SET_BOOTING) {
-                       cpu_move_cgroup(def_list.control[i].pid, CPUCG_PATH);
+                       cpu_move_cgroup(def_list.control[i].pid, CPUCG_HIGH_GROUP_PATH);
                        setpriority(PRIO_PROCESS, def_list.control[i].pid, 0);
                } else if (def_list.control[i].type == SET_WRT) {
-                       cpu_move_cgroup(def_list.control[i].pid, CPUCG_PATH);
+                       cpu_move_cgroup(def_list.control[i].pid, CPUCG_HIGH_GROUP_PATH);
                        setpriority(PRIO_PROCESS, def_list.control[i].pid, 0);
                        ioprio_set(IOPRIO_WHO_PROCESS, def_list.control[i].pid, IOPRIO_CLASS_BE << IOPRIO_CLASS_SHIFT);
                }
@@ -400,13 +393,14 @@ static int resourced_cpu_init(void *data)
        int ret_code;
 
        _D("resourced_cpu_init");
-       ret_code = cgroup_make_subdir(CPUCG_PATH, "background", NULL);
+       //ret_code = cgroup_make_subdir(CPUCG_PATH, "background", NULL);
+       ret_code = cgroup_make_full_subdir(CPUCG_PATH);
        ret_value_msg_if(ret_code < 0, ret_code, "cpu init failed\n");
        cpu_check_cpuquota();
-       if (cpu_quota_enabled()) {
+/*     if (cpu_quota_enabled()) {
                ret_code = cgroup_make_subdir(CPUCG_PATH, "quota", NULL);
                ret_value_msg_if(ret_code < 0, ret_code, "create service cgroup failed\n");
-       }
+       }*/
        config_parse(CPU_CONF_FILE, load_cpu_config, NULL);
 
        if (def_list.num) {