aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorPaul Menage <menage@google.com>2009-01-07 21:08:36 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-01-08 11:31:10 -0500
commit999cd8a450f8f93701669a61cac4d3b19eca07e8 (patch)
tree990e5b08e6db971d2e9943f89abf39e7c8f4cb1e /include/linux
parentb5a84319a4343a0db753436fd8147e61eaafa7ea (diff)
cgroups: add a per-subsystem hierarchy_mutex
These patches introduce new locking/refcount support for cgroups to reduce the need for subsystems to call cgroup_lock(). This will ultimately allow the atomicity of cgroup_rmdir() (which was removed recently) to be restored. These three patches give: 1/3 - introduce a per-subsystem hierarchy_mutex which a subsystem can use to prevent changes to its own cgroup tree 2/3 - use hierarchy_mutex in place of calling cgroup_lock() in the memory controller 3/3 - introduce a css_tryget() function similar to the one recently proposed by Kamezawa, but avoiding spurious refcount failures in the event of a race between a css_tryget() and an unsuccessful cgroup_rmdir() Future patches will likely involve: - using hierarchy mutex in place of cgroup_lock() in more subsystems where appropriate - restoring the atomicity of cgroup_rmdir() with respect to cgroup_create() This patch: Add a hierarchy_mutex to the cgroup_subsys object that protects changes to the hierarchy observed by that subsystem. It is taken by the cgroup subsystem (in addition to cgroup_mutex) for the following operations: - linking a cgroup into that subsystem's cgroup tree - unlinking a cgroup from that subsystem's cgroup tree - moving the subsystem to/from a hierarchy (including across the bind() callback) Thus if the subsystem holds its own hierarchy_mutex, it can safely traverse its own hierarchy. Signed-off-by: Paul Menage <menage@google.com> Tested-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Li Zefan <lizf@cn.fujitsu.com> Cc: Balbir Singh <balbir@in.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/cgroup.h17
1 files changed, 16 insertions, 1 deletions
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
index 73d1c730c3c4..ce1c1f34c30c 100644
--- a/include/linux/cgroup.h
+++ b/include/linux/cgroup.h
@@ -340,8 +340,23 @@ struct cgroup_subsys {
340#define MAX_CGROUP_TYPE_NAMELEN 32 340#define MAX_CGROUP_TYPE_NAMELEN 32
341 const char *name; 341 const char *name;
342 342
343 struct cgroupfs_root *root; 343 /*
344 * Protects sibling/children links of cgroups in this
345 * hierarchy, plus protects which hierarchy (or none) the
346 * subsystem is a part of (i.e. root/sibling). To avoid
347 * potential deadlocks, the following operations should not be
348 * undertaken while holding any hierarchy_mutex:
349 *
350 * - allocating memory
351 * - initiating hotplug events
352 */
353 struct mutex hierarchy_mutex;
344 354
355 /*
356 * Link to parent, and list entry in parent's children.
357 * Protected by this->hierarchy_mutex and cgroup_lock()
358 */
359 struct cgroupfs_root *root;
345 struct list_head sibling; 360 struct list_head sibling;
346}; 361};
347 362