diff options
Diffstat (limited to 'include/linux/cgroup.h')
| -rw-r--r-- | include/linux/cgroup.h | 181 |
1 files changed, 154 insertions, 27 deletions
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index 900af5964f55..5047355b9a0f 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #include <linux/idr.h> | 19 | #include <linux/idr.h> |
| 20 | #include <linux/workqueue.h> | 20 | #include <linux/workqueue.h> |
| 21 | #include <linux/xattr.h> | 21 | #include <linux/xattr.h> |
| 22 | #include <linux/fs.h> | ||
| 22 | 23 | ||
| 23 | #ifdef CONFIG_CGROUPS | 24 | #ifdef CONFIG_CGROUPS |
| 24 | 25 | ||
| @@ -27,13 +28,10 @@ struct cgroup_subsys; | |||
| 27 | struct inode; | 28 | struct inode; |
| 28 | struct cgroup; | 29 | struct cgroup; |
| 29 | struct css_id; | 30 | struct css_id; |
| 31 | struct eventfd_ctx; | ||
| 30 | 32 | ||
| 31 | extern int cgroup_init_early(void); | 33 | extern int cgroup_init_early(void); |
| 32 | extern int cgroup_init(void); | 34 | extern int cgroup_init(void); |
| 33 | extern void cgroup_lock(void); | ||
| 34 | extern int cgroup_lock_is_held(void); | ||
| 35 | extern bool cgroup_lock_live_group(struct cgroup *cgrp); | ||
| 36 | extern void cgroup_unlock(void); | ||
| 37 | extern void cgroup_fork(struct task_struct *p); | 35 | extern void cgroup_fork(struct task_struct *p); |
| 38 | extern void cgroup_post_fork(struct task_struct *p); | 36 | extern void cgroup_post_fork(struct task_struct *p); |
| 39 | extern void cgroup_exit(struct task_struct *p, int run_callbacks); | 37 | extern void cgroup_exit(struct task_struct *p, int run_callbacks); |
| @@ -42,16 +40,27 @@ extern int cgroupstats_build(struct cgroupstats *stats, | |||
| 42 | extern int cgroup_load_subsys(struct cgroup_subsys *ss); | 40 | extern int cgroup_load_subsys(struct cgroup_subsys *ss); |
| 43 | extern void cgroup_unload_subsys(struct cgroup_subsys *ss); | 41 | extern void cgroup_unload_subsys(struct cgroup_subsys *ss); |
| 44 | 42 | ||
| 45 | extern const struct file_operations proc_cgroup_operations; | 43 | extern int proc_cgroup_show(struct seq_file *, void *); |
| 46 | 44 | ||
| 47 | /* Define the enumeration of all builtin cgroup subsystems */ | 45 | /* |
| 46 | * Define the enumeration of all cgroup subsystems. | ||
| 47 | * | ||
| 48 | * We define ids for builtin subsystems and then modular ones. | ||
| 49 | */ | ||
| 48 | #define SUBSYS(_x) _x ## _subsys_id, | 50 | #define SUBSYS(_x) _x ## _subsys_id, |
| 49 | #define IS_SUBSYS_ENABLED(option) IS_ENABLED(option) | ||
| 50 | enum cgroup_subsys_id { | 51 | enum cgroup_subsys_id { |
| 52 | #define IS_SUBSYS_ENABLED(option) IS_BUILTIN(option) | ||
| 51 | #include <linux/cgroup_subsys.h> | 53 | #include <linux/cgroup_subsys.h> |
| 54 | #undef IS_SUBSYS_ENABLED | ||
| 55 | CGROUP_BUILTIN_SUBSYS_COUNT, | ||
| 56 | |||
| 57 | __CGROUP_SUBSYS_TEMP_PLACEHOLDER = CGROUP_BUILTIN_SUBSYS_COUNT - 1, | ||
| 58 | |||
| 59 | #define IS_SUBSYS_ENABLED(option) IS_MODULE(option) | ||
| 60 | #include <linux/cgroup_subsys.h> | ||
| 61 | #undef IS_SUBSYS_ENABLED | ||
| 52 | CGROUP_SUBSYS_COUNT, | 62 | CGROUP_SUBSYS_COUNT, |
| 53 | }; | 63 | }; |
| 54 | #undef IS_SUBSYS_ENABLED | ||
| 55 | #undef SUBSYS | 64 | #undef SUBSYS |
| 56 | 65 | ||
| 57 | /* Per-subsystem/per-cgroup state maintained by the system. */ | 66 | /* Per-subsystem/per-cgroup state maintained by the system. */ |
| @@ -148,6 +157,13 @@ enum { | |||
| 148 | * specified at mount time and thus is implemented here. | 157 | * specified at mount time and thus is implemented here. |
| 149 | */ | 158 | */ |
| 150 | CGRP_CPUSET_CLONE_CHILDREN, | 159 | CGRP_CPUSET_CLONE_CHILDREN, |
| 160 | /* see the comment above CGRP_ROOT_SANE_BEHAVIOR for details */ | ||
| 161 | CGRP_SANE_BEHAVIOR, | ||
| 162 | }; | ||
| 163 | |||
| 164 | struct cgroup_name { | ||
| 165 | struct rcu_head rcu_head; | ||
| 166 | char name[]; | ||
| 151 | }; | 167 | }; |
| 152 | 168 | ||
| 153 | struct cgroup { | 169 | struct cgroup { |
| @@ -172,11 +188,23 @@ struct cgroup { | |||
| 172 | struct cgroup *parent; /* my parent */ | 188 | struct cgroup *parent; /* my parent */ |
| 173 | struct dentry *dentry; /* cgroup fs entry, RCU protected */ | 189 | struct dentry *dentry; /* cgroup fs entry, RCU protected */ |
| 174 | 190 | ||
| 191 | /* | ||
| 192 | * This is a copy of dentry->d_name, and it's needed because | ||
| 193 | * we can't use dentry->d_name in cgroup_path(). | ||
| 194 | * | ||
| 195 | * You must acquire rcu_read_lock() to access cgrp->name, and | ||
| 196 | * the only place that can change it is rename(), which is | ||
| 197 | * protected by parent dir's i_mutex. | ||
| 198 | * | ||
| 199 | * Normally you should use cgroup_name() wrapper rather than | ||
| 200 | * access it directly. | ||
| 201 | */ | ||
| 202 | struct cgroup_name __rcu *name; | ||
| 203 | |||
| 175 | /* Private pointers for each registered subsystem */ | 204 | /* Private pointers for each registered subsystem */ |
| 176 | struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT]; | 205 | struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT]; |
| 177 | 206 | ||
| 178 | struct cgroupfs_root *root; | 207 | struct cgroupfs_root *root; |
| 179 | struct cgroup *top_cgroup; | ||
| 180 | 208 | ||
| 181 | /* | 209 | /* |
| 182 | * List of cg_cgroup_links pointing at css_sets with | 210 | * List of cg_cgroup_links pointing at css_sets with |
| @@ -213,6 +241,96 @@ struct cgroup { | |||
| 213 | struct simple_xattrs xattrs; | 241 | struct simple_xattrs xattrs; |
| 214 | }; | 242 | }; |
| 215 | 243 | ||
| 244 | #define MAX_CGROUP_ROOT_NAMELEN 64 | ||
| 245 | |||
| 246 | /* cgroupfs_root->flags */ | ||
| 247 | enum { | ||
| 248 | /* | ||
| 249 | * Unfortunately, cgroup core and various controllers are riddled | ||
| 250 | * with idiosyncrasies and pointless options. The following flag, | ||
| 251 | * when set, will force sane behavior - some options are forced on, | ||
| 252 | * others are disallowed, and some controllers will change their | ||
| 253 | * hierarchical or other behaviors. | ||
| 254 | * | ||
| 255 | * The set of behaviors affected by this flag are still being | ||
| 256 | * determined and developed and the mount option for this flag is | ||
| 257 | * prefixed with __DEVEL__. The prefix will be dropped once we | ||
| 258 | * reach the point where all behaviors are compatible with the | ||
| 259 | * planned unified hierarchy, which will automatically turn on this | ||
| 260 | * flag. | ||
| 261 | * | ||
| 262 | * The followings are the behaviors currently affected this flag. | ||
| 263 | * | ||
| 264 | * - Mount options "noprefix" and "clone_children" are disallowed. | ||
| 265 | * Also, cgroupfs file cgroup.clone_children is not created. | ||
| 266 | * | ||
| 267 | * - When mounting an existing superblock, mount options should | ||
| 268 | * match. | ||
| 269 | * | ||
| 270 | * - Remount is disallowed. | ||
| 271 | * | ||
| 272 | * - memcg: use_hierarchy is on by default and the cgroup file for | ||
| 273 | * the flag is not created. | ||
| 274 | * | ||
| 275 | * The followings are planned changes. | ||
| 276 | * | ||
| 277 | * - release_agent will be disallowed once replacement notification | ||
| 278 | * mechanism is implemented. | ||
| 279 | */ | ||
| 280 | CGRP_ROOT_SANE_BEHAVIOR = (1 << 0), | ||
| 281 | |||
| 282 | CGRP_ROOT_NOPREFIX = (1 << 1), /* mounted subsystems have no named prefix */ | ||
| 283 | CGRP_ROOT_XATTR = (1 << 2), /* supports extended attributes */ | ||
| 284 | }; | ||
| 285 | |||
| 286 | /* | ||
| 287 | * A cgroupfs_root represents the root of a cgroup hierarchy, and may be | ||
| 288 | * associated with a superblock to form an active hierarchy. This is | ||
| 289 | * internal to cgroup core. Don't access directly from controllers. | ||
| 290 | */ | ||
| 291 | struct cgroupfs_root { | ||
| 292 | struct super_block *sb; | ||
| 293 | |||
| 294 | /* | ||
| 295 | * The bitmask of subsystems intended to be attached to this | ||
| 296 | * hierarchy | ||
| 297 | */ | ||
| 298 | unsigned long subsys_mask; | ||
| 299 | |||
| 300 | /* Unique id for this hierarchy. */ | ||
| 301 | int hierarchy_id; | ||
| 302 | |||
| 303 | /* The bitmask of subsystems currently attached to this hierarchy */ | ||
| 304 | unsigned long actual_subsys_mask; | ||
| 305 | |||
| 306 | /* A list running through the attached subsystems */ | ||
| 307 | struct list_head subsys_list; | ||
| 308 | |||
| 309 | /* The root cgroup for this hierarchy */ | ||
| 310 | struct cgroup top_cgroup; | ||
| 311 | |||
| 312 | /* Tracks how many cgroups are currently defined in hierarchy.*/ | ||
| 313 | int number_of_cgroups; | ||
| 314 | |||
| 315 | /* A list running through the active hierarchies */ | ||
| 316 | struct list_head root_list; | ||
| 317 | |||
| 318 | /* All cgroups on this root, cgroup_mutex protected */ | ||
| 319 | struct list_head allcg_list; | ||
| 320 | |||
| 321 | /* Hierarchy-specific flags */ | ||
| 322 | unsigned long flags; | ||
| 323 | |||
| 324 | /* IDs for cgroups in this hierarchy */ | ||
| 325 | struct ida cgroup_ida; | ||
| 326 | |||
| 327 | /* The path to use for release notifications. */ | ||
| 328 | char release_agent_path[PATH_MAX]; | ||
| 329 | |||
| 330 | /* The name for this hierarchy - may be empty */ | ||
| 331 | char name[MAX_CGROUP_ROOT_NAMELEN]; | ||
| 332 | }; | ||
| 333 | |||
| 216 | /* | 334 | /* |
| 217 | * A css_set is a structure holding pointers to a set of | 335 | * A css_set is a structure holding pointers to a set of |
| 218 | * cgroup_subsys_state objects. This saves space in the task struct | 336 | * cgroup_subsys_state objects. This saves space in the task struct |
| @@ -278,6 +396,7 @@ struct cgroup_map_cb { | |||
| 278 | /* cftype->flags */ | 396 | /* cftype->flags */ |
| 279 | #define CFTYPE_ONLY_ON_ROOT (1U << 0) /* only create on root cg */ | 397 | #define CFTYPE_ONLY_ON_ROOT (1U << 0) /* only create on root cg */ |
| 280 | #define CFTYPE_NOT_ON_ROOT (1U << 1) /* don't create on root cg */ | 398 | #define CFTYPE_NOT_ON_ROOT (1U << 1) /* don't create on root cg */ |
| 399 | #define CFTYPE_INSANE (1U << 2) /* don't create if sane_behavior */ | ||
| 281 | 400 | ||
| 282 | #define MAX_CFTYPE_NAME 64 | 401 | #define MAX_CFTYPE_NAME 64 |
| 283 | 402 | ||
| @@ -304,9 +423,6 @@ struct cftype { | |||
| 304 | /* CFTYPE_* flags */ | 423 | /* CFTYPE_* flags */ |
| 305 | unsigned int flags; | 424 | unsigned int flags; |
| 306 | 425 | ||
| 307 | /* file xattrs */ | ||
| 308 | struct simple_xattrs xattrs; | ||
| 309 | |||
| 310 | int (*open)(struct inode *inode, struct file *file); | 426 | int (*open)(struct inode *inode, struct file *file); |
| 311 | ssize_t (*read)(struct cgroup *cgrp, struct cftype *cft, | 427 | ssize_t (*read)(struct cgroup *cgrp, struct cftype *cft, |
| 312 | struct file *file, | 428 | struct file *file, |
| @@ -404,18 +520,31 @@ struct cgroup_scanner { | |||
| 404 | void *data; | 520 | void *data; |
| 405 | }; | 521 | }; |
| 406 | 522 | ||
| 523 | /* | ||
| 524 | * See the comment above CGRP_ROOT_SANE_BEHAVIOR for details. This | ||
| 525 | * function can be called as long as @cgrp is accessible. | ||
| 526 | */ | ||
| 527 | static inline bool cgroup_sane_behavior(const struct cgroup *cgrp) | ||
| 528 | { | ||
| 529 | return cgrp->root->flags & CGRP_ROOT_SANE_BEHAVIOR; | ||
| 530 | } | ||
| 531 | |||
| 532 | /* Caller should hold rcu_read_lock() */ | ||
| 533 | static inline const char *cgroup_name(const struct cgroup *cgrp) | ||
| 534 | { | ||
| 535 | return rcu_dereference(cgrp->name)->name; | ||
| 536 | } | ||
| 537 | |||
| 407 | int cgroup_add_cftypes(struct cgroup_subsys *ss, struct cftype *cfts); | 538 | int cgroup_add_cftypes(struct cgroup_subsys *ss, struct cftype *cfts); |
| 408 | int cgroup_rm_cftypes(struct cgroup_subsys *ss, struct cftype *cfts); | 539 | int cgroup_rm_cftypes(struct cgroup_subsys *ss, struct cftype *cfts); |
| 409 | 540 | ||
| 410 | int cgroup_is_removed(const struct cgroup *cgrp); | 541 | int cgroup_is_removed(const struct cgroup *cgrp); |
| 542 | bool cgroup_is_descendant(struct cgroup *cgrp, struct cgroup *ancestor); | ||
| 411 | 543 | ||
| 412 | int cgroup_path(const struct cgroup *cgrp, char *buf, int buflen); | 544 | int cgroup_path(const struct cgroup *cgrp, char *buf, int buflen); |
| 413 | 545 | ||
| 414 | int cgroup_task_count(const struct cgroup *cgrp); | 546 | int cgroup_task_count(const struct cgroup *cgrp); |
| 415 | 547 | ||
| 416 | /* Return true if cgrp is a descendant of the task's cgroup */ | ||
| 417 | int cgroup_is_descendant(const struct cgroup *cgrp, struct task_struct *task); | ||
| 418 | |||
| 419 | /* | 548 | /* |
| 420 | * Control Group taskset, used to pass around set of tasks to cgroup_subsys | 549 | * Control Group taskset, used to pass around set of tasks to cgroup_subsys |
| 421 | * methods. | 550 | * methods. |
| @@ -458,7 +587,6 @@ struct cgroup_subsys { | |||
| 458 | void (*bind)(struct cgroup *root); | 587 | void (*bind)(struct cgroup *root); |
| 459 | 588 | ||
| 460 | int subsys_id; | 589 | int subsys_id; |
| 461 | int active; | ||
| 462 | int disabled; | 590 | int disabled; |
| 463 | int early_init; | 591 | int early_init; |
| 464 | /* | 592 | /* |
| @@ -523,10 +651,16 @@ static inline struct cgroup_subsys_state *cgroup_subsys_state( | |||
| 523 | * rcu_dereference_check() conditions, such as locks used during the | 651 | * rcu_dereference_check() conditions, such as locks used during the |
| 524 | * cgroup_subsys::attach() methods. | 652 | * cgroup_subsys::attach() methods. |
| 525 | */ | 653 | */ |
| 654 | #ifdef CONFIG_PROVE_RCU | ||
| 655 | extern struct mutex cgroup_mutex; | ||
| 526 | #define task_subsys_state_check(task, subsys_id, __c) \ | 656 | #define task_subsys_state_check(task, subsys_id, __c) \ |
| 527 | rcu_dereference_check(task->cgroups->subsys[subsys_id], \ | 657 | rcu_dereference_check((task)->cgroups->subsys[(subsys_id)], \ |
| 528 | lockdep_is_held(&task->alloc_lock) || \ | 658 | lockdep_is_held(&(task)->alloc_lock) || \ |
| 529 | cgroup_lock_is_held() || (__c)) | 659 | lockdep_is_held(&cgroup_mutex) || (__c)) |
| 660 | #else | ||
| 661 | #define task_subsys_state_check(task, subsys_id, __c) \ | ||
| 662 | rcu_dereference((task)->cgroups->subsys[(subsys_id)]) | ||
| 663 | #endif | ||
| 530 | 664 | ||
| 531 | static inline struct cgroup_subsys_state * | 665 | static inline struct cgroup_subsys_state * |
| 532 | task_subsys_state(struct task_struct *task, int subsys_id) | 666 | task_subsys_state(struct task_struct *task, int subsys_id) |
| @@ -661,8 +795,8 @@ struct task_struct *cgroup_iter_next(struct cgroup *cgrp, | |||
| 661 | struct cgroup_iter *it); | 795 | struct cgroup_iter *it); |
| 662 | void cgroup_iter_end(struct cgroup *cgrp, struct cgroup_iter *it); | 796 | void cgroup_iter_end(struct cgroup *cgrp, struct cgroup_iter *it); |
| 663 | int cgroup_scan_tasks(struct cgroup_scanner *scan); | 797 | int cgroup_scan_tasks(struct cgroup_scanner *scan); |
| 664 | int cgroup_attach_task(struct cgroup *, struct task_struct *); | ||
| 665 | int cgroup_attach_task_all(struct task_struct *from, struct task_struct *); | 798 | int cgroup_attach_task_all(struct task_struct *from, struct task_struct *); |
| 799 | int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from); | ||
| 666 | 800 | ||
| 667 | /* | 801 | /* |
| 668 | * CSS ID is ID for cgroup_subsys_state structs under subsys. This only works | 802 | * CSS ID is ID for cgroup_subsys_state structs under subsys. This only works |
| @@ -687,13 +821,6 @@ void free_css_id(struct cgroup_subsys *ss, struct cgroup_subsys_state *css); | |||
| 687 | 821 | ||
| 688 | struct cgroup_subsys_state *css_lookup(struct cgroup_subsys *ss, int id); | 822 | struct cgroup_subsys_state *css_lookup(struct cgroup_subsys *ss, int id); |
| 689 | 823 | ||
| 690 | /* | ||
| 691 | * Get a cgroup whose id is greater than or equal to id under tree of root. | ||
| 692 | * Returning a cgroup_subsys_state or NULL. | ||
| 693 | */ | ||
| 694 | struct cgroup_subsys_state *css_get_next(struct cgroup_subsys *ss, int id, | ||
| 695 | struct cgroup_subsys_state *root, int *foundid); | ||
| 696 | |||
| 697 | /* Returns true if root is ancestor of cg */ | 824 | /* Returns true if root is ancestor of cg */ |
| 698 | bool css_is_ancestor(struct cgroup_subsys_state *cg, | 825 | bool css_is_ancestor(struct cgroup_subsys_state *cg, |
| 699 | const struct cgroup_subsys_state *root); | 826 | const struct cgroup_subsys_state *root); |
