diff options
author | Paul Menage <menage@google.com> | 2007-10-19 02:39:30 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-19 14:53:36 -0400 |
commit | ddbcc7e8e50aefe467c01cac3dec71f118cd8ac2 (patch) | |
tree | 0881a031e669582f819d572339e955b04abfc3d2 /include/linux/sched.h | |
parent | 55a230aae650157720becc09cadb7d10efbf5013 (diff) |
Task Control Groups: basic task cgroup framework
Generic Process Control Groups
--------------------------
There have recently been various proposals floating around for
resource management/accounting and other task grouping subsystems in
the kernel, including ResGroups, User BeanCounters, NSProxy
cgroups, and others. These all need the basic abstraction of being
able to group together multiple processes in an aggregate, in order to
track/limit the resources permitted to those processes, or control
other behaviour of the processes, and all implement this grouping in
different ways.
This patchset provides a framework for tracking and grouping processes
into arbitrary "cgroups" and assigning arbitrary state to those
groupings, in order to control the behaviour of the cgroup as an
aggregate.
The intention is that the various resource management and
virtualization/cgroup efforts can also become task cgroup
clients, with the result that:
- the userspace APIs are (somewhat) normalised
- it's easier to test e.g. the ResGroups CPU controller in
conjunction with the BeanCounters memory controller, or use either of
them as the resource-control portion of a virtual server system.
- the additional kernel footprint of any of the competing resource
management systems is substantially reduced, since it doesn't need
to provide process grouping/containment, hence improving their
chances of getting into the kernel
This patch:
Add the main task cgroups framework - the cgroup filesystem, and the
basic structures for tracking membership and associating subsystem state
objects to tasks.
Signed-off-by: Paul Menage <menage@google.com>
Cc: Serge E. Hallyn <serue@us.ibm.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Dave Hansen <haveblue@us.ibm.com>
Cc: Balbir Singh <balbir@in.ibm.com>
Cc: Paul Jackson <pj@sgi.com>
Cc: Kirill Korotaev <dev@openvz.org>
Cc: Herbert Poetzl <herbert@13thfloor.at>
Cc: Srivatsa Vaddagiri <vatsa@in.ibm.com>
Cc: Cedric Le Goater <clg@fr.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/sched.h')
-rw-r--r-- | include/linux/sched.h | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h index 10a83d8d5775..af2ed4bae678 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -894,6 +894,34 @@ struct sched_entity { | |||
894 | #endif | 894 | #endif |
895 | }; | 895 | }; |
896 | 896 | ||
897 | #ifdef CONFIG_CGROUPS | ||
898 | |||
899 | #define SUBSYS(_x) _x ## _subsys_id, | ||
900 | enum cgroup_subsys_id { | ||
901 | #include <linux/cgroup_subsys.h> | ||
902 | CGROUP_SUBSYS_COUNT | ||
903 | }; | ||
904 | #undef SUBSYS | ||
905 | |||
906 | /* A css_set is a structure holding pointers to a set of | ||
907 | * cgroup_subsys_state objects. | ||
908 | */ | ||
909 | |||
910 | struct css_set { | ||
911 | |||
912 | /* Set of subsystem states, one for each subsystem. NULL for | ||
913 | * subsystems that aren't part of this hierarchy. These | ||
914 | * pointers reduce the number of dereferences required to get | ||
915 | * from a task to its state for a given cgroup, but result | ||
916 | * in increased space usage if tasks are in wildly different | ||
917 | * groupings across different hierarchies. This array is | ||
918 | * immutable after creation */ | ||
919 | struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT]; | ||
920 | |||
921 | }; | ||
922 | |||
923 | #endif /* CONFIG_CGROUPS */ | ||
924 | |||
897 | struct task_struct { | 925 | struct task_struct { |
898 | volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ | 926 | volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ |
899 | void *stack; | 927 | void *stack; |
@@ -1130,6 +1158,9 @@ struct task_struct { | |||
1130 | int cpuset_mems_generation; | 1158 | int cpuset_mems_generation; |
1131 | int cpuset_mem_spread_rotor; | 1159 | int cpuset_mem_spread_rotor; |
1132 | #endif | 1160 | #endif |
1161 | #ifdef CONFIG_CGROUPS | ||
1162 | struct css_set cgroups; | ||
1163 | #endif | ||
1133 | #ifdef CONFIG_FUTEX | 1164 | #ifdef CONFIG_FUTEX |
1134 | struct robust_list_head __user *robust_list; | 1165 | struct robust_list_head __user *robust_list; |
1135 | #ifdef CONFIG_COMPAT | 1166 | #ifdef CONFIG_COMPAT |
@@ -1625,7 +1656,8 @@ static inline int thread_group_empty(struct task_struct *p) | |||
1625 | /* | 1656 | /* |
1626 | * Protects ->fs, ->files, ->mm, ->group_info, ->comm, keyring | 1657 | * Protects ->fs, ->files, ->mm, ->group_info, ->comm, keyring |
1627 | * subscriptions and synchronises with wait4(). Also used in procfs. Also | 1658 | * subscriptions and synchronises with wait4(). Also used in procfs. Also |
1628 | * pins the final release of task.io_context. Also protects ->cpuset. | 1659 | * pins the final release of task.io_context. Also protects ->cpuset and |
1660 | * ->cgroup.subsys[]. | ||
1629 | * | 1661 | * |
1630 | * Nests both inside and outside of read_lock(&tasklist_lock). | 1662 | * Nests both inside and outside of read_lock(&tasklist_lock). |
1631 | * It must not be nested with write_lock_irq(&tasklist_lock), | 1663 | * It must not be nested with write_lock_irq(&tasklist_lock), |