[Devel] Re: cgroup attach/fork hooks consistency with the ns_cgroup
Serge E. Hallyn
serue at us.ibm.com
Fri Jun 19 06:59:40 PDT 2009
Quoting Daniel Lezcano (daniel.lezcano at free.fr):
> Paul Menage wrote:
>> On Thu, Jun 18, 2009 at 11:36 AM, Daniel Lezcano<daniel.lezcano at free.fr> wrote:
>>
>>> There isn't a rule saying that we will inherit the values set by the parent
>>> ? If it is case, maybe we can remove the ns_cgroup and fix the cpuset at the
>>> same time, no ?
>>>
>>
>> There's no rule either way, but there is the backward-compatibility
>> aspects of cpusets.
>>
>> One way around that would be to add a "cgroup.clone_children" control
>> file - if you write 1 to it (it defaults to 0) then all mkdir
>> operations do a clone (i.e. pre-populate the child with appropriate
>> defaults even if that's not the normal behaviour for the subsystem.
>> That would avoid compatibility issues.
>>
>
> Yes, that sounds good.
>>> Maybe, we can first fix the ns_cgroup hook problem by moving the
>>> ns_cgroup_clone after cgroup_fork_callbacks
>>>
>>
>> You mean fork the task into the parent cgroup, then clone the new
>> cgroup and reattach to the new cgroup? That could work, although I'm
>> not sure whether it would be bad to have the new task briefly
>> appearing in the parent cgroups.
>>
> I tried the following patch:
I think the patch should be fine.
-serge
> Index: linux-2.6/kernel/fork.c
> ===================================================================
> --- linux-2.6.orig/kernel/fork.c
> +++ linux-2.6/kernel/fork.c
> @@ -1150,12 +1150,6 @@ static struct task_struct *copy_process(
> if (clone_flags & CLONE_THREAD)
> p->tgid = current->tgid;
>
> - if (current->nsproxy != p->nsproxy) {
> - retval = ns_cgroup_clone(p, pid);
> - if (retval)
> - goto bad_fork_free_graph;
> - }
> -
> p->set_child_tid = (clone_flags & CLONE_CHILD_SETTID) ?
> child_tidptr : NULL;
> /*
> * Clear TID on mm_release()?
> @@ -1204,6 +1198,12 @@ static struct task_struct *copy_process(
> if (retval)
> goto bad_fork_free_graph;
>
> + if (current->nsproxy != p->nsproxy) {
> + retval = ns_cgroup_clone(p, pid);
> + if (retval)
> + goto bad_fork_cgroup_callbacks;
> + }
> +
> /* Need tasklist lock for parent etc handling! */
> write_lock_irq(&tasklist_lock);
>
> That seems to fix the inconsistency problem but maybe I am missing
> something...
> Excepting kernel race condition in the copy_process function I may have
> missed, I don't see the difference with a program forking and adding the
> task in the child cgroup (or the child process adds itself right after
> the fork), the child will briefly appear to the parent cgroup, no ?
>
> -- Daniel
>
>
_______________________________________________
Containers mailing list
Containers at lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers
More information about the Devel
mailing list