>>> + rcu_read_lock(); >>> + css = task_css(current, pids_cgrp_id); >>> + if (!css_tryget_online(css)) { >>> + retval = -EBUSY; >>> + goto err_rcu_unlock; >>> + } >>> + rcu_read_unlock(); >> >> Hmmm... so, the above is guaranteed to succeed in finite amount of >> time (the race window is actually very narrow) and it'd be silly to >> fail fork because a task was being moved across cgroups. >> >> I think it'd be a good idea to implement task_get_css() which loops >> and returns the current css for the requested subsystem with reference >> count bumped and it can use css_tryget() too. Holding a ref doesn't >> prevent css from dying anyway, so it doesn't make any difference. > > Hmmm, okay. I'll work on this later. Would something like this suffice? struct cgroup_subsys_state *task_get_css(struct task_struct *task, int subsys_id) { bool have_ref = false; struct cgroup_subsys_state *css; while(!have_ref) { rcu_read_lock(); css = task_css(task, subsys_id); have_ref = !css_tryget(css); rcu_read_unlock(); } return css; } Also, as a side note (in the same vein I guess), does a ref on a css_set give you an implicit ref on a css inside that css_set, or are those two orthogonal operations? -- Aleksa Sarai (cyphar) www.cyphar.com -- To unsubscribe from this list: send the line "unsubscribe cgroups" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html