On 2014/9/20 17:13, Weng Meiling wrote: > Hi guys, > In our environment, we found the following problem: > > we have a process and it has some threads with the same name: > > # ps -L -eo comm,pid,lwp,args,start |grep Test > Testd 4489 4489 /usr/bin/Testd 09:03:39 > Testd 4489 4582 /usr/bin/Testd 09:03:39 > Testd 4489 4584 /usr/bin/Testd 09:03:39 > Testd 4489 4585 /usr/bin/Testd 09:03:39 > Testd 4489 4587 /usr/bin/Testd 09:03:39 > > > the cgrule is: > > *:Testd cpu,memory,cpuset test > > if the Testd has been running, and then restart or start cgred service, just > the process > 4489 will move into test cgroup, but the other threads just leave in the root > cgroup, > the reason seems that cgred just move running processes according /proc, but > thread isn't > listed under /proc, should not cgred deal with this situation? >
The following patch maybe can deal with this situation, another way to deal with this situation is to use cgroup.procs file then tasks in cgroup_attach_task_pid() according to some conditions, but this need to modify many apis, so I think the following patch is more suitable, just modify one api. What do you think about this? Subject: [PATCH] cgred: cgred should deal with threads when starts Signed-off-by: Weng Meiling <wengmeiling.w...@huawei.com> --- src/api.c | 44 ++++++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/src/api.c b/src/api.c index 8106eff..951cafb 100644 --- a/src/api.c +++ b/src/api.c @@ -3189,25 +3189,45 @@ int cgroup_change_all_cgroups(void) while ((pid_dir = readdir(dir)) != NULL) { int err, pid; - uid_t euid; - gid_t egid; - char *procname = NULL; + DIR *subdir; + struct dirent *subpid_dir = NULL; + char subpath[FILENAME_MAX]; err = sscanf(pid_dir->d_name, "%i", &pid); if (err < 1) continue; - err = cgroup_get_uid_gid_from_procfs(pid, &euid, &egid); - if (err) - continue; + /* sscanf the task directory to deal with threads */ + memset(subpath, 0, FILENAME_MAX); + sprintf(subpath, "/proc/%d/task", pid); + subdir = opendir(subpath); + if (!subdir) { + closedir(dir); + return -ECGOTHER; + } - err = cgroup_get_procname_from_procfs(pid, &procname); - if (err) - continue; + while ((subpid_dir = readdir(subdir)) != NULL) { + int subpid; + gid_t egid; + uid_t euid; + char *procname = NULL; + err = sscanf(subpid_dir->d_name, "%i", &subpid); + if (err < 1) + continue; - err = cgroup_change_cgroup_flags(euid, egid, procname, pid, 0); - if (err) - cgroup_dbg("cgroup change pid %i failed\n", pid); + err = cgroup_get_uid_gid_from_procfs(subpid, &euid, &egid); + if (err) + continue; + + err = cgroup_get_procname_from_procfs(subpid, &procname); + if (err) + continue; + + err = cgroup_change_cgroup_flags(euid, egid, procname, subpid, 0); + if (err) + cgroup_dbg("cgroup change pid %i failed\n", subpid); + } + closedir(subdir); } closedir(dir); -- 1.8.3 Thanks! Weng Meiling ------------------------------------------------------------------------------ Meet PCI DSS 3.0 Compliance Requirements with EventLog Analyzer Achieve PCI DSS 3.0 Compliant Status with Out-of-the-box PCI DSS Reports Are you Audit-Ready for PCI DSS 3.0 Compliance? Download White paper Comply to PCI DSS 3.0 Requirement 10 and 11.5 with EventLog Analyzer http://pubads.g.doubleclick.net/gampad/clk?id=154622311&iu=/4140/ostg.clktrk _______________________________________________ Libcg-devel mailing list Libcg-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libcg-devel