On Thu, Mar 10, 2011 at 12:01:29PM -0800, Paul Menage wrote: > On Wed, Mar 9, 2011 at 10:18 PM, Ben Blum <bblum@xxxxxxxxxxxxxx> wrote: > >> This BUG_ON() seems unnecessary, given the i++ directly above it. > > > > It's meant to communicate that the loop must go through at least once, > > so that 'struct cgroup *oldcgrp' will be initialised within a loop later > > (setting it to NULL in the beginning is just to shut up the compiler.) > > Right, but it's a do {} while() loop with no break in it - it's > impossible to not go through at least once... OK; I guess it can go. > > Although if the deal is that cancel_attach reverts > > the things that can_attach does (and can_attach_task is separate) (is > > this the case? it should probably go in the documentation), then passing > > a can_attach and failing a can_attach_task should cause cancel_attach to > > get called for that subsystem, which in this code it doesn't. Something > > like: > > > > ? ?retval = ss->can_attach(); > > ? ?if (retval) { > > ? ? ? ?failed_ss = ss; > > ? ? ? ?goto out_cancel_attach; > > ? ?} > > ? ?retval = ss->can_attach_task(); > > ? ?if (retval) { > > ? ? ? ?failed_ss = ss; > > ? ? ? ?cancel_extra_ss = true; > > ? ? ? ?goto out_cancel_attach; > > ? ?} > > Yes, but maybe call the flag cancel_failed_ss? Slightly more obvious, > to me at least. Sounds good. > >> > + ? ? ? ? ? ? ? ? ? ? ? BUG_ON(!thread_group_leader(tsk)); > >> > >> Can this race with an exiting/execing group leader? > > > > No, rcu_read_lock() is held. > > > > But rcu_read_lock() doesn't stop any actions - it just stops the data > structures from going away. Can't leadership change during an > execve()? Hmm, you may be right; my understanding of RCU is not complete. But actually I think the BUG_ON should just be removed, since we're about to drop locks before handing off to cgroup_attach_proc anyway (so at no important part is the assertion guaranteed), which will detect and EAGAIN if such a race happened. > > (However, I did try to test it, and it looks like if a leader calls > > sys_exit() then the whole group goes away; is this actually guaranteed?) > > I think so, but maybe not instantaneously. > > Paul > Hmm, well, should I make this assumption, then? The code would not be more complicated either way, really. I kind of prefer it as it is... -- Ben _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers