resourced_ret_c cgroup_write_pid_fullpath(const char *cgroup_full_path,
const int pid)
{
+ int ret;
char buf[256];
- int ret = cgroup_write_node(cgroup_full_path, CGROUP_FILE_NAME,
+
+ if (pid <=0) {
+ _E("try to write empty pid to %s", cgroup_full_path);
+ return RESOURCED_ERROR_NO_DATA;
+ }
+
+ ret = cgroup_write_node_uint32(cgroup_full_path, CGROUP_FILE_NAME,
(u_int32_t)pid);
ret_value_msg_if(ret < 0, RESOURCED_ERROR_FAIL,
return RESOURCED_ERROR_NONE;
}
-int cgroup_write_node(const char *cgroup_name,
- const char *file_name, unsigned int value)
+int cgroup_write_node_uint32(const char *cgroup_name,
+ const char *file_name, uint32_t value)
+{
+ char buf[MAX_PATH_LENGTH];
+ snprintf(buf, sizeof(buf), "%s/%s", cgroup_name, file_name);
+ _SD("cgroup_buf %s, value %d\n", buf, value);
+ return fwrite_uint(buf, value);
+}
+
+int cgroup_write_node_int32(const char *cgroup_name,
+ const char *file_name, int32_t value)
{
char buf[MAX_PATH_LENGTH];
snprintf(buf, sizeof(buf), "%s/%s", cgroup_name, file_name);
return fwrite_str(buf, string);
}
-int cgroup_read_node(const char *cgroup_name,
- const char *file_name, unsigned int *value)
+int cgroup_read_node_uint32(const char *cgroup_name,
+ const char *file_name, uint32_t *value)
{
char buf[MAX_PATH_LENGTH];
int ret;
return ret;
}
+int cgroup_read_node_int32(const char *cgroup_name,
+ const char *file_name, int32_t *value)
+{
+ char buf[MAX_PATH_LENGTH];
+ int ret;
+ snprintf(buf, sizeof(buf), "%s/%s", cgroup_name, file_name);
+ ret = fread_int(buf, value);
+ _SD("cgroup_buf %s, value %d\n", buf, *value);
+ return ret;
+}
+
int cgroup_make_subdir(const char* parentdir, const char* cgroup_name, bool *already)
{
char buf[MAX_PATH_LENGTH];
return 0;
}
-int cgroup_get_pids(const char *name, GArray **pids)
-{
- _cleanup_free_ char *cg_procs = NULL;
- _cleanup_fclose_ FILE *f = NULL;
- char buf[MAX_PATH_LENGTH] = "";
- GArray *array;
- pid_t pid;
-
- assert(name);
- assert(pids);
- assert(!pids);
-
- if (asprintf(&cg_procs, "%s/cgroup.procs", name) < 0)
- return -ENOMEM;
-
- f = fopen(cg_procs, "r");
- if (!f) {
- _E("Failed to open '%s': %m", name);
- return -errno;
- }
-
- array = g_array_new(false, false, sizeof(pid_t));
-
- while (fgets(buf, 32, f)) {
- pid = atoi(buf);
- g_array_append_val(array, pid);
- }
-
- *pids = array;
-
- return 0;
-}
-
static void cgroup_memory_stat_init(struct cgroup_memory_stat *mem_stat, long long val)
{
enum cgroup_memory_stat_id id;
* g_array_free(pids_array, TRUE);
*
*/
+int cgroup_get_pids(const char *name, GArray **pids)
+{
+ _cleanup_free_ char *cg_procs = NULL;
+ _cleanup_fclose_ FILE *f = NULL;
+ char buf[MAX_PATH_LENGTH] = "";
+ GArray *array;
+ pid_t pid;
+
+ assert(name);
+ assert(pids);
+ assert(!*pids);
+
+ if (asprintf(&cg_procs, "%s/cgroup.procs", name) < 0)
+ return -ENOMEM;
+
+ f = fopen(cg_procs, "r");
+ if (!f) {
+ _E("Failed to open '%s': %m", name);
+ return -errno;
+ }
+
+ array = g_array_new(false, false, sizeof(pid_t));
+
+ while (fgets(buf, 32, f)) {
+ pid = atoi(buf);
+ g_array_append_val(array, pid);
+ }
+
+ *pids = array;
+
+ return 0;
+}
*
*/
+#include <assert.h>
+#include <string.h>
#include <resourced.h>
#include <sys/types.h>
+#include <stdint.h>
#include <glib.h>
+#include "macro.h"
/*
* Cgroup creation interface
#define PROC_TASK_CHILDREN "/proc/%d/task/%d/children"
/**
- * @desc Get one unsigned int value from cgroup
+ * @desc Get one unsigned int32 value from cgroup
* @param cgroup_name - cgroup path
* @param file_name - cgroup content to write
* @param value - out parameter, value to fill
* @return negative value if error
*/
-int cgroup_read_node(const char *cgroup_name,
- const char *file_name, unsigned int *value);
+int cgroup_read_node_uint32(const char *cgroup_name,
+ const char *file_name, uint32_t *value);
/**
- * @desc Put value to cgroup,
+ * @desc Get one signed int32 value from cgroup
+ * @param cgroup_name - cgroup path
+ * @param file_name - cgroup content to write
+ * @param value - out parameter, value to fill
+ * @return negative value if error
+ */
+int cgroup_read_node_int32(const char *cgroup_name,
+ const char *file_name, int32_t *value);
+
+/**
+ * @desc Put unsigned int32 value to cgroup,
+ * @param cgroup_name - cgroup path
+ * @param file_name - cgroup content to write
+ * @param value - unsigned int32 data to write
+ * @return negative value if error
+ */
+int cgroup_write_node_uint32(const char *cgroup_name, const char *file_name, uint32_t value);
+
+/**
+ * @desc Put signed int32 value to cgroup,
* @param cgroup_name - cgroup path
* @param file_name - cgroup content to write
- * @param value - data to write
+ * @param value - signed int32 data to write
* @return negative value if error
*/
-int cgroup_write_node(const char *cgroup_name, const char *file_name, unsigned int value);
+int cgroup_write_node_int32(const char *cgroup_name, const char *file_name, int32_t value);
/**
* @desc Put value to cgroup,
static int cpu_move_cgroup(pid_t pid, char *path)
{
- return cgroup_write_node(path, CGROUP_FILE_NAME, pid);
+ return cgroup_write_node_uint32(path, CGROUP_FILE_NAME, pid);
}
static int cpu_move_cgroup_foreach(pid_t pid, struct proc_app_info *pai, char *path)
pid_t child_pid;
if (!pai)
- return cgroup_write_node(path, CGROUP_FILE_NAME, pid);
+ return cgroup_write_node_uint32(path, CGROUP_FILE_NAME, pid);
- cgroup_write_node(path, CGROUP_FILE_NAME, pai->main_pid);
+ cgroup_write_node_uint32(path, CGROUP_FILE_NAME, pai->main_pid);
if (pai->childs) {
gslist_for_each_item(iter, pai->childs) {
child_pid = GPOINTER_TO_PID(iter->data);
- cgroup_write_node(path, CGROUP_FILE_NAME, child_pid);
+ cgroup_write_node_uint32(path, CGROUP_FILE_NAME, child_pid);
}
}
return RESOURCED_ERROR_NONE;
{
unsigned int val;
- if (cgroup_read_node(cgroup_name, file_name, &val) != RESOURCED_ERROR_NONE) {
+ if (cgroup_read_node_uint32(cgroup_name, file_name, &val) != RESOURCED_ERROR_NONE) {
_E("Can't read %s%s. value is set to 1000", cgroup_name, file_name);
val = 1000;
}
} else if (!strncmp(result->name, "BACKGROUND_CPU_SHARE", strlen("BACKGROUND_CPU_SHARE")+1)) {
value = atoi(result->value);
if (value)
- cgroup_write_node(CPU_BACKGROUND_GROUP, CPU_SHARE,
+ cgroup_write_node_uint32(CPU_BACKGROUND_GROUP, CPU_SHARE,
get_relative_value(CPU_DEFAULT_CGROUP, CPU_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(CPU_CPUQUOTA_GROUP, CPU_SHARE,
+ cgroup_write_node_uint32(CPU_CPUQUOTA_GROUP, CPU_SHARE,
get_relative_value(CPU_DEFAULT_CGROUP, CPU_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(CPU_CPUQUOTA_GROUP, CPU_CONTROL_BANDWIDTH,
+ cgroup_write_node_uint32(CPU_CPUQUOTA_GROUP, CPU_CONTROL_BANDWIDTH,
get_relative_value(CPU_CPUQUOTA_GROUP,
CPU_CONTROL_FULL_BANDWIDTH, value));
}
int memcg_get_usage(struct memcg_info *mi, unsigned int *usage_bytes)
{
- return cgroup_read_node(mi->name, "memory.usage_in_bytes", usage_bytes);
+ return cgroup_read_node_uint32(mi->name, "memory.usage_in_bytes", usage_bytes);
}
/*
mi = memcg_tree[memcg_idx]->info;
_D("name : %s, pid : %d", mi->name, pid);
- cgroup_write_node(mi->name, CGROUP_FILE_NAME, pid);
+ cgroup_write_node_uint32(mi->name, CGROUP_FILE_NAME, pid);
msg.type = memcg_idx;
msg.info = mi;
resourced_notify(RESOURCED_NOTIFIER_SWAP_START, &msg);
int ret = RESOURCED_ERROR_NONE;
_I("write memcg param for %s", name);
/* enable cgroup move */
- ret = cgroup_write_node(name,
+ ret = cgroup_write_node_uint32(name,
MEMCG_MOVE_CHARGE_PATH, 3);
if (ret)
return ret;
return ret;
/* disable memcg OOM-killer */
- ret = cgroup_write_node(name,
+ ret = cgroup_write_node_uint32(name,
MEMCG_OOM_CONTROL_PATH, 1);
if (ret)
return ret;
/* write limit_in_bytes */
- ret = cgroup_write_node(name,
+ ret = cgroup_write_node_uint32(name,
MEMCG_LIMIT_PATH, limit);
_I("set %s's limit to %u", name, limit);
return ret;
_D("pid: %d, proc_name: %s, cg_name: %s, oom_score_adj: %d", pid,
pai ? pai->appid : "---", memcg_name[memcg_idx],
oom_score_adj);
- cgroup_write_node(mi->name, CGROUP_FILE_NAME, pid);
+ cgroup_write_node_uint32(mi->name, CGROUP_FILE_NAME, pid);
proc_set_process_memory_state(pai, memcg_idx, mi, oom_score_adj);
/*
memcg_limit = swap_calculate_hard_limit_in_bytes(usage);
_D("Swap request: %s cgroup usage is %lu, hard limit set to %lu (hard limit fraction %f)",
msg.info->name, usage, memcg_limit, swap_hard_limit_fraction);
- ret = cgroup_write_node(msg.info->name, MEMCG_SIZE_LIMIT, memcg_limit);
+ ret = cgroup_write_node_uint32(msg.info->name, MEMCG_SIZE_LIMIT, memcg_limit);
if (ret != RESOURCED_ERROR_NONE)
_E("Not able to set hard limit of %s memory cgroup", msg.info->name);
struct swap_status_msg *msg = data;
limit = -1;
- ret = cgroup_write_node(msg->info->name, MEMCG_SIZE_LIMIT, limit);
+ ret = cgroup_write_node_int32(msg->info->name, MEMCG_SIZE_LIMIT, limit);
if (ret != RESOURCED_ERROR_NONE)
_E("Failed to change hard limit of %s cgroup to -1", msg->info->name);
else
if (ret != RESOURCED_ERROR_NONE)
return;
- cgroup_write_node(memcg_swap->info->name, MOVE_CHARGE, 1);
+ cgroup_write_node_uint32(memcg_swap->info->name, MOVE_CHARGE, 1);
}
static int resourced_swap_init(void *data)
int ret;
if (sub_cgroup) {
snprintf(path_buf, sizeof(path_buf), "%s/%s", TIMER_CGROUP_PATH, sub_cgroup);
- ret = cgroup_write_node(path_buf, node, val);
+ ret = cgroup_write_node_uint32(path_buf, node, val);
} else
- ret = cgroup_write_node(TIMER_CGROUP_PATH, node, val);
+ ret = cgroup_write_node_uint32(TIMER_CGROUP_PATH, node, val);
return ret;
}
return -ENOMEM;
}
- r = cgroup_write_node(cgroup_name, TASK_FILE_NAME, pid);
+ r = cgroup_write_node_uint32(cgroup_name, TASK_FILE_NAME, pid);
if (r < 0) {
_E("failed to write pid '%d' to '%s': %s",
pid, cgroup_name, strerror_r(-r, buf, sizeof(buf)));