Hi, what do you think about this situation? Thanks! Weng Meiling
On 2014/9/24 9:02, Weng Meiling wrote: > ping... > > On 2014/9/22 17:32, Weng Meiling wrote: >> 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); >> > ------------------------------------------------------------------------------ Slashdot TV. Videos for Nerds. Stuff that Matters. http://pubads.g.doubleclick.net/gampad/clk?id=160591471&iu=/4140/ostg.clktrk _______________________________________________ Libcg-devel mailing list Libcg-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libcg-devel