summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKen'ichi Ohmichi <oomichi@mxs.nes.nec.co.jp>2009-05-08 01:52:46 +0530
committerBalbir Singh <balbir@linux.vnet.ibm.com>2009-05-08 01:52:46 +0530
commitdf06bb605d9c336e6cc60de3007b72de09dc77e5 (patch)
tree9947d0fbef2fd312a0b1e528955ac32f9ba716bd
parent8953fc07c0498d1ddd9a04dc549ffb85862f4c5f (diff)
downloadlibcg-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>
-rw-r--r--src/api.c10
-rw-r--r--src/wrapper.c2
2 files changed, 8 insertions, 4 deletions
diff --git a/src/api.c b/src/api.c
index baeb856..02022eb 100644
--- a/src/api.c
+++ b/src/api.c
@@ -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)