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

Reply via email to