diff options
author | Ken'ichi Ohmichi <oomichi@mxs.nes.nec.co.jp> | 2009-05-08 01:52:46 +0530 |
---|---|---|
committer | Balbir Singh <balbir@linux.vnet.ibm.com> | 2009-05-08 01:52:46 +0530 |
commit | df06bb605d9c336e6cc60de3007b72de09dc77e5 (patch) | |
tree | 9947d0fbef2fd312a0b1e528955ac32f9ba716bd /src | |
parent | 8953fc07c0498d1ddd9a04dc549ffb85862f4c5f (diff) | |
download | libcg-df06bb605d9c336e6cc60de3007b72de09dc77e5.tar.gz libcg-df06bb605d9c336e6cc60de3007b72de09dc77e5.tar.xz libcg-df06bb605d9c336e6cc60de3007b72de09dc77e5.zip |
I tested a cgrlesengd daemon with huge load, which makes many 'su',
in long time. And the daemon was killed by an OOM killer. So the
daemon has memory leak. This patch fixes this problem.
The daemon allocates memory at cg_prepare_cgroup(), but it does not
free the memory. This patch adds necessary free() to cgroup_change_
cgroup_path by calling cgroup_free_controllers(). In addition, this
patch adds free()s for handling error and flushes the counters of the
allocations in cgroup_free_controllers().
Signed-off-by: Ken'ichi Ohmichi <oomichi@mxs.nes.nec.co.jp>
Signed-off-by: Balbir Singh <balbir@linux.vnet.ibm.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/api.c | 10 | ||||
-rw-r--r-- | src/wrapper.c | 2 |
2 files changed, 8 insertions, 4 deletions
@@ -1699,6 +1699,7 @@ unlock_error: * XX: Need to figure out how to cleanup? Cleanup just the stuff * we added, or the whole structure. */ + cgroup_free_controllers(cgroup); cgroup = NULL; return error; } @@ -1744,6 +1745,7 @@ static int cg_prepare_cgroup(struct cgroup *cgroup, pid_t pid, " failed\n", cg_mount_table[i].name); pthread_rwlock_unlock(&cg_mount_table_lock); + cgroup_free_controllers(cgroup); return ECGROUPNOTALLOWED; } } @@ -1757,6 +1759,7 @@ static int cg_prepare_cgroup(struct cgroup *cgroup, pid_t pid, if (!cptr) { cgroup_dbg("Adding controller '%s' failed\n", controller); + cgroup_free_controllers(cgroup); return ECGROUPNOTALLOWED; } } @@ -1975,11 +1978,10 @@ int cgroup_change_cgroup_path(char *dest, pid_t pid, char *controllers[]) return ret; /* Add task to cgroup */ ret = cgroup_attach_task_pid(&cgroup, pid); - if (ret) { + if (ret) cgroup_dbg("cgroup_attach_task_pid failed:%d\n", ret); - return ret; - } - return 0; + cgroup_free_controllers(&cgroup); + return ret; } /** diff --git a/src/wrapper.c b/src/wrapper.c index 2f8fcf2..1ee1665 100644 --- a/src/wrapper.c +++ b/src/wrapper.c @@ -83,8 +83,10 @@ void cgroup_free_controllers(struct cgroup *cgroup) for (i = 0; i < cgroup->index; i++) { for (j = 0; j < cgroup->controller[i]->index; j++) free(cgroup->controller[i]->values[j]); + cgroup->controller[i]->index = 0; free(cgroup->controller[i]); } + cgroup->index = 0; } void cgroup_free(struct cgroup **cgroup) |