diff options
Diffstat (limited to 'include/linux/cgroup.h')
-rw-r--r-- | include/linux/cgroup.h | 53 |
1 files changed, 47 insertions, 6 deletions
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index c9bbcb2a75ae..b8ad1ea99586 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h | |||
@@ -37,16 +37,24 @@ extern void cgroup_post_fork(struct task_struct *p); | |||
37 | extern void cgroup_exit(struct task_struct *p, int run_callbacks); | 37 | extern void cgroup_exit(struct task_struct *p, int run_callbacks); |
38 | extern int cgroupstats_build(struct cgroupstats *stats, | 38 | extern int cgroupstats_build(struct cgroupstats *stats, |
39 | struct dentry *dentry); | 39 | struct dentry *dentry); |
40 | extern int cgroup_load_subsys(struct cgroup_subsys *ss); | ||
41 | extern void cgroup_unload_subsys(struct cgroup_subsys *ss); | ||
40 | 42 | ||
41 | extern const struct file_operations proc_cgroup_operations; | 43 | extern const struct file_operations proc_cgroup_operations; |
42 | 44 | ||
43 | /* Define the enumeration of all cgroup subsystems */ | 45 | /* Define the enumeration of all builtin cgroup subsystems */ |
44 | #define SUBSYS(_x) _x ## _subsys_id, | 46 | #define SUBSYS(_x) _x ## _subsys_id, |
45 | enum cgroup_subsys_id { | 47 | enum cgroup_subsys_id { |
46 | #include <linux/cgroup_subsys.h> | 48 | #include <linux/cgroup_subsys.h> |
47 | CGROUP_SUBSYS_COUNT | 49 | CGROUP_BUILTIN_SUBSYS_COUNT |
48 | }; | 50 | }; |
49 | #undef SUBSYS | 51 | #undef SUBSYS |
52 | /* | ||
53 | * This define indicates the maximum number of subsystems that can be loaded | ||
54 | * at once. We limit to this many since cgroupfs_root has subsys_bits to keep | ||
55 | * track of all of them. | ||
56 | */ | ||
57 | #define CGROUP_SUBSYS_COUNT (BITS_PER_BYTE*sizeof(unsigned long)) | ||
50 | 58 | ||
51 | /* Per-subsystem/per-cgroup state maintained by the system. */ | 59 | /* Per-subsystem/per-cgroup state maintained by the system. */ |
52 | struct cgroup_subsys_state { | 60 | struct cgroup_subsys_state { |
@@ -76,6 +84,12 @@ enum { | |||
76 | CSS_REMOVED, /* This CSS is dead */ | 84 | CSS_REMOVED, /* This CSS is dead */ |
77 | }; | 85 | }; |
78 | 86 | ||
87 | /* Caller must verify that the css is not for root cgroup */ | ||
88 | static inline void __css_get(struct cgroup_subsys_state *css, int count) | ||
89 | { | ||
90 | atomic_add(count, &css->refcnt); | ||
91 | } | ||
92 | |||
79 | /* | 93 | /* |
80 | * Call css_get() to hold a reference on the css; it can be used | 94 | * Call css_get() to hold a reference on the css; it can be used |
81 | * for a reference obtained via: | 95 | * for a reference obtained via: |
@@ -87,7 +101,7 @@ static inline void css_get(struct cgroup_subsys_state *css) | |||
87 | { | 101 | { |
88 | /* We don't need to reference count the root state */ | 102 | /* We don't need to reference count the root state */ |
89 | if (!test_bit(CSS_ROOT, &css->flags)) | 103 | if (!test_bit(CSS_ROOT, &css->flags)) |
90 | atomic_inc(&css->refcnt); | 104 | __css_get(css, 1); |
91 | } | 105 | } |
92 | 106 | ||
93 | static inline bool css_is_removed(struct cgroup_subsys_state *css) | 107 | static inline bool css_is_removed(struct cgroup_subsys_state *css) |
@@ -118,11 +132,11 @@ static inline bool css_tryget(struct cgroup_subsys_state *css) | |||
118 | * css_get() or css_tryget() | 132 | * css_get() or css_tryget() |
119 | */ | 133 | */ |
120 | 134 | ||
121 | extern void __css_put(struct cgroup_subsys_state *css); | 135 | extern void __css_put(struct cgroup_subsys_state *css, int count); |
122 | static inline void css_put(struct cgroup_subsys_state *css) | 136 | static inline void css_put(struct cgroup_subsys_state *css) |
123 | { | 137 | { |
124 | if (!test_bit(CSS_ROOT, &css->flags)) | 138 | if (!test_bit(CSS_ROOT, &css->flags)) |
125 | __css_put(css); | 139 | __css_put(css, 1); |
126 | } | 140 | } |
127 | 141 | ||
128 | /* bits in struct cgroup flags field */ | 142 | /* bits in struct cgroup flags field */ |
@@ -221,6 +235,10 @@ struct cgroup { | |||
221 | 235 | ||
222 | /* For RCU-protected deletion */ | 236 | /* For RCU-protected deletion */ |
223 | struct rcu_head rcu_head; | 237 | struct rcu_head rcu_head; |
238 | |||
239 | /* List of events which userspace want to recieve */ | ||
240 | struct list_head event_list; | ||
241 | spinlock_t event_list_lock; | ||
224 | }; | 242 | }; |
225 | 243 | ||
226 | /* | 244 | /* |
@@ -258,7 +276,8 @@ struct css_set { | |||
258 | /* | 276 | /* |
259 | * Set of subsystem states, one for each subsystem. This array | 277 | * Set of subsystem states, one for each subsystem. This array |
260 | * is immutable after creation apart from the init_css_set | 278 | * is immutable after creation apart from the init_css_set |
261 | * during subsystem registration (at boot time). | 279 | * during subsystem registration (at boot time) and modular subsystem |
280 | * loading/unloading. | ||
262 | */ | 281 | */ |
263 | struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT]; | 282 | struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT]; |
264 | 283 | ||
@@ -363,6 +382,23 @@ struct cftype { | |||
363 | int (*trigger)(struct cgroup *cgrp, unsigned int event); | 382 | int (*trigger)(struct cgroup *cgrp, unsigned int event); |
364 | 383 | ||
365 | int (*release)(struct inode *inode, struct file *file); | 384 | int (*release)(struct inode *inode, struct file *file); |
385 | |||
386 | /* | ||
387 | * register_event() callback will be used to add new userspace | ||
388 | * waiter for changes related to the cftype. Implement it if | ||
389 | * you want to provide this functionality. Use eventfd_signal() | ||
390 | * on eventfd to send notification to userspace. | ||
391 | */ | ||
392 | int (*register_event)(struct cgroup *cgrp, struct cftype *cft, | ||
393 | struct eventfd_ctx *eventfd, const char *args); | ||
394 | /* | ||
395 | * unregister_event() callback will be called when userspace | ||
396 | * closes the eventfd or on cgroup removing. | ||
397 | * This callback must be implemented, if you want provide | ||
398 | * notification functionality. | ||
399 | */ | ||
400 | int (*unregister_event)(struct cgroup *cgrp, struct cftype *cft, | ||
401 | struct eventfd_ctx *eventfd); | ||
366 | }; | 402 | }; |
367 | 403 | ||
368 | struct cgroup_scanner { | 404 | struct cgroup_scanner { |
@@ -428,6 +464,8 @@ struct cgroup_subsys { | |||
428 | void (*destroy)(struct cgroup_subsys *ss, struct cgroup *cgrp); | 464 | void (*destroy)(struct cgroup_subsys *ss, struct cgroup *cgrp); |
429 | int (*can_attach)(struct cgroup_subsys *ss, struct cgroup *cgrp, | 465 | int (*can_attach)(struct cgroup_subsys *ss, struct cgroup *cgrp, |
430 | struct task_struct *tsk, bool threadgroup); | 466 | struct task_struct *tsk, bool threadgroup); |
467 | void (*cancel_attach)(struct cgroup_subsys *ss, struct cgroup *cgrp, | ||
468 | struct task_struct *tsk, bool threadgroup); | ||
431 | void (*attach)(struct cgroup_subsys *ss, struct cgroup *cgrp, | 469 | void (*attach)(struct cgroup_subsys *ss, struct cgroup *cgrp, |
432 | struct cgroup *old_cgrp, struct task_struct *tsk, | 470 | struct cgroup *old_cgrp, struct task_struct *tsk, |
433 | bool threadgroup); | 471 | bool threadgroup); |
@@ -472,6 +510,9 @@ struct cgroup_subsys { | |||
472 | /* used when use_id == true */ | 510 | /* used when use_id == true */ |
473 | struct idr idr; | 511 | struct idr idr; |
474 | spinlock_t id_lock; | 512 | spinlock_t id_lock; |
513 | |||
514 | /* should be defined only by modular subsystems */ | ||
515 | struct module *module; | ||
475 | }; | 516 | }; |
476 | 517 | ||
477 | #define SUBSYS(_x) extern struct cgroup_subsys _x ## _subsys; | 518 | #define SUBSYS(_x) extern struct cgroup_subsys _x ## _subsys; |