#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;
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];
#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;
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 {
} 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);
} 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);
} 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));
}
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;
}
_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;
}
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;
}
_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;
}
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;
}
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;
}
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;
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;
}
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;
}
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;
}
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);
}
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) {