On Tue, Jul 14, 2009 at 10:43 AM, Paul Menage<menage@xxxxxxxxxx> wrote: > > I've been trying to think of a way to do that. AFAICS the only way to > do that reliably would be to move the call to cgroup_fork() that hooks > into the parent's cgroup inside the lock on the group leader's thread > list, and move the fork callbacks into cgroup_fork(). (Which would > mean that they'd not be able to sleep/fail, etc). Currently the only user of the cgroup fork callbacks is the freezer cgroup. Matt, if this callback was moved inside tasklist_lock, would that present any problems? Given that in other places you call freeze_task() from inside other low-level locks like css_set_lock (within a cgroup iteration) then hopefully it would be OK. The only question then would be whether anything between the point where cgroup_fork() is currently called, and the point where the new thread is added to its thread group list, cares about p->cgroups being valid. We can probably flush out any such assumptions by clearing tsk->cgroups in dup_task_struct, so that any attempts to reference it would immediately oops. Then (assuming this doesn't expose any such dependencies) we can move the cgroup_fork() call inside the write_lock_irq(&tasklist_lock) in do_fork(). The "procs" handler can (once it has done any necessary allocations) take a read_lock on tasklist_lock, and atomically move all threads to the new cgroup. Paul _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers