Hi Jan, Ivana, Vivek, Balbir,

What do you think about the problem?

On 2014/5/2 3:26, Dhaval Giani wrote:
> On Mon, Apr 28, 2014 at 10:05 PM, Weng Meiling
> <wengmeiling.w...@huawei.com> wrote:
>> On 2014/4/29 3:05, Dhaval Giani wrote:
>>> Hi Weng,
>>>
>>> I apologize for our tardiness is responding back!
>>>
>>> On Sun, Apr 27, 2014 at 9:09 PM, Weng Meiling
>>> <wengmeiling.w...@huawei.com> wrote:
>>>> Hi Ivana,
>>>> What do you think about this problem?
>>>>
>>>> Weng Meiling
>>>> Thanks!
>>>>
>>>> On 2014/4/22 11:06, Weng Meiling wrote:
>>>>> ping...
>>>>> On 2014/4/10 16:09, Weng Meiling wrote:
>>>>>> Cgred just migrate forked process when the parent's cgroup is changed,
>>>>>> so that the forked process can stay in the same cgroup which match the
>>>>>> cgred rules with it's parent. But there is a situation when parent 
>>>>>> process
>>>>>> fork a child process, and exited before it moved into the cgroup matched
>>>>>> the rules successfullly. The forked child process is also failed into the
>>>>>> cgroup. This result is inconsistent with rules. So this patch fix the
>>>>>> problem. Just apply rule for forked process when parent process exited
>>>>>> when forking.
>>>>>>
>>>
>>> I am not sure of the exact race here.
>>>
>>> Parent Forks & Exits
>>> Child is not classified?
>>>
>>> Can you clarify the exact race?
>>>
>> The exact race should be parent exit & move to group.
>> The race may cause child is not classified as rules.
>>
>> I can used a example to clarify it:
>>
>> start cgred service and the rule:
>>
>> root:testd      memory          test1
>>
>> We have a testd  service,  and after it starts, it will fork a child process
>> and exited immediately. The right result should be the testd process (the 
>> parent
>> and the child) is in memory:test1 according to the rule. But the real result 
>> is
>> sometime it is not.
>>
>> The race is as following:
>>
>> parent:               cgred:
>>
>>         fork()
>>         exit()
>>                        move process ------ the parent process exited before 
>> it has been moved to the group.
>>
> 
> Sorry for misunderstanding the race.
> 
>> child move based on event PROC_EVENT_FORK, because the parent has exited, so
>> cgre_was_parent_changed_when_forking() can't get it's parent's info and 
>> return
>> 0, this will result in the rule will not be executed. So the child process 
>> will
>> stay the same group with it's parent, But the parent was not moved to the 
>> specified
>> group before exited, so the child is not in the specified group too. From 
>> the user's
>> point of view, the result doesn't match the rule.
>>
>> The patch  add check if parents exits, if parent has exited in 
>> cgre_was_parent_changed_when_forking(),
>> then returns 1 so that the rule will be executed and the child process can 
>> be moved
>> to the specified group.
>>
> 
> So this idea sounds really racy to me. The only sure way it can be
> ensured is *if* the child runs before the parent exits. I know there
> is a kernel tunable for that, but I am not sure if it is a good idea.
> But just for fun,  could you try
>  (as root)
> echo 1 > /proc/sys/kernel/sched_child_runs_first
> 
> (I am just fishing here), but if you are unable to reproduce the issue
> here, we at least have a workaround for now.
> 
>>
>>
>>
>>>>>> But I'm not sure whether the fix is suitable. Because the other way(just 
>>>>>> remove
>>>>>> the cgre_was_parent_changed_when_forking() for forked processes) will 
>>>>>> affect
>>>>>> cgclassify --sticky. But this way is not which I have done some test.
>>>>>>
>>>>>> Signed-off-by: Weng Meiling <wengmeiling.w...@huawei.com>
>>>>>> ---
>>>>>>  src/daemon/cgrulesengd.c | 5 +++++
>>>>>>  1 file changed, 5 insertions(+)
>>>>>>
>>>>>> diff --git a/src/daemon/cgrulesengd.c b/src/daemon/cgrulesengd.c
>>>>>> index 367b898..5e254c8 100644
>>>>>> --- a/src/daemon/cgrulesengd.c
>>>>>> +++ b/src/daemon/cgrulesengd.c
>>>>>> @@ -265,6 +265,8 @@ static int 
>>>>>> cgre_was_parent_changed_when_forking(const struct proc_event *ev)
>>>>>>      pid_t parent_pid;
>>>>>>      __u64 timestamp_child;
>>>>>>      __u64 timestamp_parent;
>>>>>> +    char path[FILENAME_MAX];
>>>>>> +    struct stat buff_stat;
>>>>>>
>>>>>>      parent_pid = ev->event_data.fork.parent_pid;
>>>>>>      timestamp_child = ev->timestamp_ns;
>>>>>> @@ -279,6 +281,9 @@ static int 
>>>>>> cgre_was_parent_changed_when_forking(const struct proc_event *ev)
>>>>>>                      continue;
>>>>>>              return 1;
>>>>>>      }
>>>>>> +    sprintf(path, "/proc/%d", parent_pid);
>>>
>>> I would prefer to use one of the "n" versions (so snprintf here)
>>>
>>>>>> +    if (stat(path, &buff_stat) < 0)
>>>>>> +            return 1;
>>>
>>> As far as I can see, all you are checking here is if the parent
>>> exists. What is the the parent dies immediately after this check?
>>>
>>
>> Oh, if parent dies immediately after this check, the problem is still exists.
>> So the fix way is not suitable. Do you have any idea?
>>
> 
> Unfortunately not. Jan, Ivana, Vivek, Balbir?
> 
> Thanks!
> Dhaval
> 
> .
> 



------------------------------------------------------------------------------
"Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE
Instantly run your Selenium tests across 300+ browser/OS combos.
Get unparalleled scalability from the best Selenium testing platform available
Simple to use. Nothing to install. Get started now for free."
http://p.sf.net/sfu/SauceLabs
_______________________________________________
Libcg-devel mailing list
Libcg-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libcg-devel

Reply via email to