Messages in this thread | | | Date | Wed, 03 Dec 2008 11:44:36 +0800 | From | Li Zefan <> | Subject | Re: [PATCH 1/3] cgroup: fix pre_destroy and semantics of css->refcnt |
| |
> +/* > + * Try to set all subsys's refcnt to be 0. > + * css->refcnt==0 means this subsys will be destroy()'d. > + */ > +static bool cgroup_set_subsys_removed(struct cgroup *cgrp) > +{ > + struct cgroup_subsys *ss; > + struct cgroup_subsys_state *css, *tmp; > + > + for_each_subsys(cgrp->root, ss) { > + css = cgrp->subsys[ss->subsys_id]; > + if (!atomic_dec_and_test(&css->refcnt)) > + goto rollback; > + } > + return true; > +rollback: > + for_each_subsys(cgrp->root, ss) { > + tmp = cgrp->subsys[ss->subsys_id]; > + atomic_inc(&tmp->refcnt); > + if (tmp == css) > + break; > + } > + return false; > +} > +
This function may return false, then causes rmdir() fail. So css_tryget(subsys1) returns 0 doesn't necessarily mean subsys1->destroy() will be called, if subsys2's css's refcnt is >1 when cgroup_set_subsys_removed() is called.
Will this bring up bugs and problems?
| |