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