On 08/20/2012 03:29 PM, Daniel Wagner wrote: >> This is racy I think. The read of the static key is atomic with other reads, >> > but the entire conditional is not atomic. If two cpus were creating cgroups in >> > parallel, it would be possible for both to read the static key as being zero >> > (the second cpu would read the key before the first cpu could increment it). > D'oh, That is racy. > Take a look at how we solve this particular problem in memcg. By using a pair of bits meaning "ever active" and "currently active", we can avoid problems with the static key increments. Nothing bad can't happen by increasing the static key more than once; the problem is that you need to somehow take note of that to make sure you decrement the as many times you incremented when you release it. Two other important things to keep in mind while dealing with static branches: * You can't increase/decrease while holding the cgroup_lock. lockdep may trigger, because the cgroup_lock holds the cpu_hotplug lock, that the static branches update path will also take. (due to cpusets). Doing a logical hotplug will stress this path, and make the problem visible. Take a look at disarm_sock_keys() (mm/memcontrol.c) to see how we solve this particular problem. * If you have code in more than one call site, the update among them is not atomic. Not sure if this one applies to your case, but it can lead you to some very unpleasant to debug problems. We use one of those two bits I mentioned ("currently active") to make sure objects are not marked before all sites are already patched. Hope our previous experience with this can help you. -- 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