Blame view
include/linux/cgroup.h
19.5 KB
ddbcc7e8e Task Control Grou... |
1 2 3 4 5 6 7 8 9 10 11 |
#ifndef _LINUX_CGROUP_H #define _LINUX_CGROUP_H /* * cgroup interface * * Copyright (C) 2003 BULL SA * Copyright (C) 2004-2006 Silicon Graphics, Inc. * */ #include <linux/sched.h> |
ddbcc7e8e Task Control Grou... |
12 13 14 |
#include <linux/cpumask.h> #include <linux/nodemask.h> #include <linux/rcupdate.h> |
846c7bb05 Add cgroupstats |
15 |
#include <linux/cgroupstats.h> |
31a7df01f cgroups: mechanis... |
16 |
#include <linux/prio_heap.h> |
cc31edcee cgroups: convert ... |
17 |
#include <linux/rwsem.h> |
38460b48d cgroup: CSS ID su... |
18 |
#include <linux/idr.h> |
ddbcc7e8e Task Control Grou... |
19 20 21 22 23 24 |
#ifdef CONFIG_CGROUPS struct cgroupfs_root; struct cgroup_subsys; struct inode; |
84eea8428 cgroups: misc cle... |
25 |
struct cgroup; |
38460b48d cgroup: CSS ID su... |
26 |
struct css_id; |
ddbcc7e8e Task Control Grou... |
27 28 29 |
extern int cgroup_init_early(void); extern int cgroup_init(void); |
ddbcc7e8e Task Control Grou... |
30 |
extern void cgroup_lock(void); |
d11c563dd sched: Use lockde... |
31 |
extern int cgroup_lock_is_held(void); |
84eea8428 cgroups: misc cle... |
32 |
extern bool cgroup_lock_live_group(struct cgroup *cgrp); |
ddbcc7e8e Task Control Grou... |
33 |
extern void cgroup_unlock(void); |
b4f48b636 Task Control Grou... |
34 35 |
extern void cgroup_fork(struct task_struct *p); extern void cgroup_fork_callbacks(struct task_struct *p); |
817929ec2 Task Control Grou... |
36 |
extern void cgroup_post_fork(struct task_struct *p); |
b4f48b636 Task Control Grou... |
37 |
extern void cgroup_exit(struct task_struct *p, int run_callbacks); |
846c7bb05 Add cgroupstats |
38 39 |
extern int cgroupstats_build(struct cgroupstats *stats, struct dentry *dentry); |
e6a1105ba cgroups: subsyste... |
40 |
extern int cgroup_load_subsys(struct cgroup_subsys *ss); |
cf5d5941f cgroups: subsyste... |
41 |
extern void cgroup_unload_subsys(struct cgroup_subsys *ss); |
ddbcc7e8e Task Control Grou... |
42 |
|
828c09509 const: constify r... |
43 |
extern const struct file_operations proc_cgroup_operations; |
a424316ca Task Control Grou... |
44 |
|
aae8aab40 cgroups: revamp s... |
45 |
/* Define the enumeration of all builtin cgroup subsystems */ |
817929ec2 Task Control Grou... |
46 47 48 |
#define SUBSYS(_x) _x ## _subsys_id, enum cgroup_subsys_id { #include <linux/cgroup_subsys.h> |
aae8aab40 cgroups: revamp s... |
49 |
CGROUP_BUILTIN_SUBSYS_COUNT |
817929ec2 Task Control Grou... |
50 51 |
}; #undef SUBSYS |
aae8aab40 cgroups: revamp s... |
52 53 54 55 56 57 |
/* * This define indicates the maximum number of subsystems that can be loaded * at once. We limit to this many since cgroupfs_root has subsys_bits to keep * track of all of them. */ #define CGROUP_SUBSYS_COUNT (BITS_PER_BYTE*sizeof(unsigned long)) |
817929ec2 Task Control Grou... |
58 |
|
ddbcc7e8e Task Control Grou... |
59 60 |
/* Per-subsystem/per-cgroup state maintained by the system. */ struct cgroup_subsys_state { |
d20a390a0 cgroups: fix cgro... |
61 62 |
/* * The cgroup that this subsystem is attached to. Useful |
ddbcc7e8e Task Control Grou... |
63 |
* for subsystems that want to know about the cgroup |
d20a390a0 cgroups: fix cgro... |
64 65 |
* hierarchy structure */ |
ddbcc7e8e Task Control Grou... |
66 |
struct cgroup *cgroup; |
d20a390a0 cgroups: fix cgro... |
67 68 |
/* * State maintained by the cgroup system to allow subsystems |
e7c5ec919 cgroups: add css_... |
69 |
* to be "busy". Should be accessed via css_get(), |
d20a390a0 cgroups: fix cgro... |
70 71 |
* css_tryget() and and css_put(). */ |
ddbcc7e8e Task Control Grou... |
72 73 74 75 |
atomic_t refcnt; unsigned long flags; |
38460b48d cgroup: CSS ID su... |
76 |
/* ID for this css, if possible */ |
2c392b8c3 cgroups: __rcu an... |
77 |
struct css_id __rcu *id; |
ddbcc7e8e Task Control Grou... |
78 79 80 81 82 |
}; /* bits in struct cgroup_subsys_state flags field */ enum { CSS_ROOT, /* This CSS is the root of the subsystem */ |
e7c5ec919 cgroups: add css_... |
83 |
CSS_REMOVED, /* This CSS is dead */ |
ddbcc7e8e Task Control Grou... |
84 |
}; |
d7b9fff71 cgroup: introduce... |
85 86 87 88 89 |
/* Caller must verify that the css is not for root cgroup */ static inline void __css_get(struct cgroup_subsys_state *css, int count) { atomic_add(count, &css->refcnt); } |
ddbcc7e8e Task Control Grou... |
90 |
/* |
e7c5ec919 cgroups: add css_... |
91 92 93 94 |
* Call css_get() to hold a reference on the css; it can be used * for a reference obtained via: * - an existing ref-counted reference to the css * - task->cgroups for a locked task |
ddbcc7e8e Task Control Grou... |
95 96 97 98 99 100 |
*/ static inline void css_get(struct cgroup_subsys_state *css) { /* We don't need to reference count the root state */ if (!test_bit(CSS_ROOT, &css->flags)) |
d7b9fff71 cgroup: introduce... |
101 |
__css_get(css, 1); |
ddbcc7e8e Task Control Grou... |
102 |
} |
e7c5ec919 cgroups: add css_... |
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
static inline bool css_is_removed(struct cgroup_subsys_state *css) { return test_bit(CSS_REMOVED, &css->flags); } /* * Call css_tryget() to take a reference on a css if your existing * (known-valid) reference isn't already ref-counted. Returns false if * the css has been destroyed. */ static inline bool css_tryget(struct cgroup_subsys_state *css) { if (test_bit(CSS_ROOT, &css->flags)) return true; while (!atomic_inc_not_zero(&css->refcnt)) { if (test_bit(CSS_REMOVED, &css->flags)) return false; |
804b3c28a cgroups: add cpu_... |
122 |
cpu_relax(); |
e7c5ec919 cgroups: add css_... |
123 124 125 |
} return true; } |
ddbcc7e8e Task Control Grou... |
126 127 |
/* * css_put() should be called to release a reference taken by |
e7c5ec919 cgroups: add css_... |
128 |
* css_get() or css_tryget() |
ddbcc7e8e Task Control Grou... |
129 |
*/ |
d7b9fff71 cgroup: introduce... |
130 |
extern void __css_put(struct cgroup_subsys_state *css, int count); |
ddbcc7e8e Task Control Grou... |
131 132 133 |
static inline void css_put(struct cgroup_subsys_state *css) { if (!test_bit(CSS_ROOT, &css->flags)) |
d7b9fff71 cgroup: introduce... |
134 |
__css_put(css, 1); |
ddbcc7e8e Task Control Grou... |
135 |
} |
3116f0e3d CGroup API files:... |
136 137 138 139 |
/* bits in struct cgroup flags field */ enum { /* Control Group is dead */ CGRP_REMOVED, |
d20a390a0 cgroups: fix cgro... |
140 141 142 143 |
/* * Control Group has previously had a child cgroup or a task, * but no longer (only if CGRP_NOTIFY_ON_RELEASE is set) */ |
3116f0e3d CGroup API files:... |
144 145 146 |
CGRP_RELEASABLE, /* Control Group requires release notifications to userspace */ CGRP_NOTIFY_ON_RELEASE, |
ec64f5154 cgroup: fix frequ... |
147 148 149 150 |
/* * A thread in rmdir() is wating for this cgroup. */ CGRP_WAIT_ON_RMDIR, |
97978e6d1 cgroup: add clone... |
151 152 153 154 |
/* * Clone cgroup values when creating a new child cgroup */ CGRP_CLONE_CHILDREN, |
3116f0e3d CGroup API files:... |
155 |
}; |
72a8cb30d cgroups: ensure c... |
156 157 158 159 160 161 162 163 164 165 166 167 |
/* which pidlist file are we talking about? */ enum cgroup_filetype { CGROUP_FILE_PROCS, CGROUP_FILE_TASKS, }; /* * A pidlist is a list of pids that virtually represents the contents of one * of the cgroup files ("procs" or "tasks"). We keep a list of such pidlists, * a pair (one each for procs, tasks) for each pid namespace that's relevant * to the cgroup. */ |
102a775e3 cgroups: add a re... |
168 |
struct cgroup_pidlist { |
72a8cb30d cgroups: ensure c... |
169 170 171 172 173 |
/* * used to find which pidlist is wanted. doesn't change as long as * this particular list stays in the list. */ struct { enum cgroup_filetype type; struct pid_namespace *ns; } key; |
102a775e3 cgroups: add a re... |
174 175 176 177 178 179 |
/* array of xids */ pid_t *list; /* how many elements the above list has */ int length; /* how many files are using the current array */ int use_count; |
72a8cb30d cgroups: ensure c... |
180 181 182 183 184 185 |
/* each of these stored in a list by its cgroup */ struct list_head links; /* pointer to the cgroup we belong to, for list removal purposes */ struct cgroup *owner; /* protects the other fields */ struct rw_semaphore mutex; |
102a775e3 cgroups: add a re... |
186 |
}; |
ddbcc7e8e Task Control Grou... |
187 188 |
struct cgroup { unsigned long flags; /* "unsigned long" so bitops work */ |
d20a390a0 cgroups: fix cgro... |
189 190 191 192 |
/* * count users of this cgroup. >0 means busy, but doesn't * necessarily indicate the number of tasks in the cgroup */ |
ddbcc7e8e Task Control Grou... |
193 194 195 196 197 198 199 200 |
atomic_t count; /* * We link our 'sibling' struct into our parent's 'children'. * Our children link their 'sibling' into our 'children'. */ struct list_head sibling; /* my parent's children */ struct list_head children; /* my children */ |
d20a390a0 cgroups: fix cgro... |
201 |
struct cgroup *parent; /* my parent */ |
2c392b8c3 cgroups: __rcu an... |
202 |
struct dentry __rcu *dentry; /* cgroup fs entry, RCU protected */ |
ddbcc7e8e Task Control Grou... |
203 204 205 206 207 208 |
/* Private pointers for each registered subsystem */ struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT]; struct cgroupfs_root *root; struct cgroup *top_cgroup; |
817929ec2 Task Control Grou... |
209 210 211 212 213 214 |
/* * List of cg_cgroup_links pointing at css_sets with * tasks in this cgroup. Protected by css_set_lock */ struct list_head css_sets; |
81a6a5cdd Task Control Grou... |
215 216 217 218 219 220 221 |
/* * Linked list running through all cgroups that can * potentially be reaped by the release agent. Protected by * release_list_lock */ struct list_head release_list; |
cc31edcee cgroups: convert ... |
222 |
|
72a8cb30d cgroups: ensure c... |
223 224 225 226 227 228 |
/* * list of pidlists, up to two for each namespace (one for procs, one * for tasks); created on demand. */ struct list_head pidlists; struct mutex pidlist_mutex; |
a47295e6b cgroups: make cgr... |
229 230 231 |
/* For RCU-protected deletion */ struct rcu_head rcu_head; |
0dea11687 cgroup: implement... |
232 233 234 235 |
/* List of events which userspace want to recieve */ struct list_head event_list; spinlock_t event_list_lock; |
817929ec2 Task Control Grou... |
236 |
}; |
d20a390a0 cgroups: fix cgro... |
237 238 |
/* * A css_set is a structure holding pointers to a set of |
817929ec2 Task Control Grou... |
239 240 |
* cgroup_subsys_state objects. This saves space in the task struct * object and speeds up fork()/exit(), since a single inc/dec and a |
d20a390a0 cgroups: fix cgro... |
241 242 |
* list_add()/del() can bump the reference count on the entire cgroup * set for a task. |
817929ec2 Task Control Grou... |
243 244 245 246 247 |
*/ struct css_set { /* Reference count */ |
146aa1bd0 cgroups: fix prob... |
248 |
atomic_t refcount; |
817929ec2 Task Control Grou... |
249 250 |
/* |
472b1053f cgroups: use a ha... |
251 252 253 254 255 256 |
* List running through all cgroup groups in the same hash * slot. Protected by css_set_lock */ struct hlist_node hlist; /* |
817929ec2 Task Control Grou... |
257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 |
* List running through all tasks using this cgroup * group. Protected by css_set_lock */ struct list_head tasks; /* * List of cg_cgroup_link objects on link chains from * cgroups referenced from this css_set. Protected by * css_set_lock */ struct list_head cg_links; /* * Set of subsystem states, one for each subsystem. This array * is immutable after creation apart from the init_css_set |
cf5d5941f cgroups: subsyste... |
272 273 |
* during subsystem registration (at boot time) and modular subsystem * loading/unloading. |
817929ec2 Task Control Grou... |
274 275 |
*/ struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT]; |
c378369d8 cgroups: change c... |
276 277 278 |
/* For RCU-protected deletion */ struct rcu_head rcu_head; |
ddbcc7e8e Task Control Grou... |
279 |
}; |
917965696 CGroup API files:... |
280 281 282 283 284 285 286 287 288 |
/* * cgroup_map_cb is an abstract callback API for reporting map-valued * control files */ struct cgroup_map_cb { int (*fill)(struct cgroup_map_cb *cb, const char *key, u64 value); void *state; }; |
d20a390a0 cgroups: fix cgro... |
289 290 |
/* * struct cftype: handler definitions for cgroup control files |
ddbcc7e8e Task Control Grou... |
291 292 |
* * When reading/writing to a file: |
a043e3b2c cgroup: fix comments |
293 |
* - the cgroup to use is file->f_dentry->d_parent->d_fsdata |
ddbcc7e8e Task Control Grou... |
294 295 296 297 298 |
* - the 'cftype' of the file is file->f_dentry->d_fsdata */ #define MAX_CFTYPE_NAME 64 struct cftype { |
d20a390a0 cgroups: fix cgro... |
299 300 301 302 |
/* * By convention, the name should begin with the name of the * subsystem, followed by a period */ |
ddbcc7e8e Task Control Grou... |
303 304 |
char name[MAX_CFTYPE_NAME]; int private; |
099fca322 cgroups: show cor... |
305 306 307 308 309 |
/* * If not 0, file mode is set to this value, otherwise it will * be figured out automatically */ mode_t mode; |
db3b14978 cgroup files: add... |
310 311 312 313 314 315 |
/* * If non-zero, defines the maximum length of string that can * be passed to write_string; defaults to 64 */ size_t max_write_len; |
ce16b49d3 cgroup files: cle... |
316 317 318 319 |
int (*open)(struct inode *inode, struct file *file); ssize_t (*read)(struct cgroup *cgrp, struct cftype *cft, struct file *file, char __user *buf, size_t nbytes, loff_t *ppos); |
ddbcc7e8e Task Control Grou... |
320 |
/* |
f4c753b7e CGroup API files:... |
321 |
* read_u64() is a shortcut for the common case of returning a |
ddbcc7e8e Task Control Grou... |
322 323 |
* single integer. Use it in place of read() */ |
ce16b49d3 cgroup files: cle... |
324 |
u64 (*read_u64)(struct cgroup *cgrp, struct cftype *cft); |
917965696 CGroup API files:... |
325 |
/* |
e73d2c61d CGroups _s64 file... |
326 327 |
* read_s64() is a signed version of read_u64() */ |
ce16b49d3 cgroup files: cle... |
328 |
s64 (*read_s64)(struct cgroup *cgrp, struct cftype *cft); |
e73d2c61d CGroups _s64 file... |
329 |
/* |
917965696 CGroup API files:... |
330 331 332 333 334 |
* read_map() is used for defining a map of key/value * pairs. It should call cb->fill(cb, key, value) for each * entry. The key/value pairs (and their ordering) should not * change between reboots. */ |
ce16b49d3 cgroup files: cle... |
335 336 |
int (*read_map)(struct cgroup *cont, struct cftype *cft, struct cgroup_map_cb *cb); |
29486df32 cgroups: introduc... |
337 338 339 340 |
/* * read_seq_string() is used for outputting a simple sequence * using seqfile. */ |
ce16b49d3 cgroup files: cle... |
341 342 |
int (*read_seq_string)(struct cgroup *cont, struct cftype *cft, struct seq_file *m); |
917965696 CGroup API files:... |
343 |
|
ce16b49d3 cgroup files: cle... |
344 345 346 |
ssize_t (*write)(struct cgroup *cgrp, struct cftype *cft, struct file *file, const char __user *buf, size_t nbytes, loff_t *ppos); |
355e0c48b Add cgroup write_... |
347 348 |
/* |
f4c753b7e CGroup API files:... |
349 |
* write_u64() is a shortcut for the common case of accepting |
355e0c48b Add cgroup write_... |
350 351 352 |
* a single integer (as parsed by simple_strtoull) from * userspace. Use in place of write(); return 0 or error. */ |
ce16b49d3 cgroup files: cle... |
353 |
int (*write_u64)(struct cgroup *cgrp, struct cftype *cft, u64 val); |
e73d2c61d CGroups _s64 file... |
354 355 356 |
/* * write_s64() is a signed version of write_u64() */ |
ce16b49d3 cgroup files: cle... |
357 |
int (*write_s64)(struct cgroup *cgrp, struct cftype *cft, s64 val); |
355e0c48b Add cgroup write_... |
358 |
|
d447ea2f3 cgroups: add the ... |
359 |
/* |
db3b14978 cgroup files: add... |
360 361 362 363 364 365 366 |
* write_string() is passed a nul-terminated kernelspace * buffer of maximum length determined by max_write_len. * Returns 0 or -ve error code. */ int (*write_string)(struct cgroup *cgrp, struct cftype *cft, const char *buffer); /* |
d447ea2f3 cgroups: add the ... |
367 368 369 370 371 372 |
* trigger() callback can be used to get some kick from the * userspace, when the actual string written is not important * at all. The private field can be used to determine the * kick type for multiplexing. */ int (*trigger)(struct cgroup *cgrp, unsigned int event); |
ce16b49d3 cgroup files: cle... |
373 |
int (*release)(struct inode *inode, struct file *file); |
0dea11687 cgroup: implement... |
374 375 376 377 378 379 380 381 382 383 384 385 386 387 |
/* * register_event() callback will be used to add new userspace * waiter for changes related to the cftype. Implement it if * you want to provide this functionality. Use eventfd_signal() * on eventfd to send notification to userspace. */ int (*register_event)(struct cgroup *cgrp, struct cftype *cft, struct eventfd_ctx *eventfd, const char *args); /* * unregister_event() callback will be called when userspace * closes the eventfd or on cgroup removing. * This callback must be implemented, if you want provide * notification functionality. |
0dea11687 cgroup: implement... |
388 |
*/ |
907860ed3 cgroups: make cft... |
389 |
void (*unregister_event)(struct cgroup *cgrp, struct cftype *cft, |
0dea11687 cgroup: implement... |
390 |
struct eventfd_ctx *eventfd); |
ddbcc7e8e Task Control Grou... |
391 |
}; |
31a7df01f cgroups: mechanis... |
392 393 394 395 396 397 |
struct cgroup_scanner { struct cgroup *cg; int (*test_task)(struct task_struct *p, struct cgroup_scanner *scan); void (*process_task)(struct task_struct *p, struct cgroup_scanner *scan); struct ptr_heap *heap; |
bd1a8ab73 cgroups: add 'dat... |
398 |
void *data; |
31a7df01f cgroups: mechanis... |
399 |
}; |
d20a390a0 cgroups: fix cgro... |
400 401 402 403 |
/* * Add a new file to the given cgroup directory. Should only be * called by subsystems from within a populate() method */ |
ffd2d8833 cgroup: clean up ... |
404 |
int cgroup_add_file(struct cgroup *cgrp, struct cgroup_subsys *subsys, |
ddbcc7e8e Task Control Grou... |
405 |
const struct cftype *cft); |
d20a390a0 cgroups: fix cgro... |
406 407 408 409 |
/* * Add a set of new files to the given cgroup directory. Should * only be called by subsystems from within a populate() method */ |
ffd2d8833 cgroup: clean up ... |
410 |
int cgroup_add_files(struct cgroup *cgrp, |
ddbcc7e8e Task Control Grou... |
411 412 413 |
struct cgroup_subsys *subsys, const struct cftype cft[], int count); |
ffd2d8833 cgroup: clean up ... |
414 |
int cgroup_is_removed(const struct cgroup *cgrp); |
ddbcc7e8e Task Control Grou... |
415 |
|
ffd2d8833 cgroup: clean up ... |
416 |
int cgroup_path(const struct cgroup *cgrp, char *buf, int buflen); |
ddbcc7e8e Task Control Grou... |
417 |
|
ffd2d8833 cgroup: clean up ... |
418 |
int cgroup_task_count(const struct cgroup *cgrp); |
bbcb81d09 Task Control Grou... |
419 |
|
313e924c0 cgroups: relax ns... |
420 421 |
/* Return true if cgrp is a descendant of the task's cgroup */ int cgroup_is_descendant(const struct cgroup *cgrp, struct task_struct *task); |
ddbcc7e8e Task Control Grou... |
422 |
|
21acb9caa trivial: fix wher... |
423 |
/* |
887032670 cgroup avoid perm... |
424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 |
* When the subsys has to access css and may add permanent refcnt to css, * it should take care of racy conditions with rmdir(). Following set of * functions, is for stop/restart rmdir if necessary. * Because these will call css_get/put, "css" should be alive css. * * cgroup_exclude_rmdir(); * ...do some jobs which may access arbitrary empty cgroup * cgroup_release_and_wakeup_rmdir(); * * When someone removes a cgroup while cgroup_exclude_rmdir() holds it, * it sleeps and cgroup_release_and_wakeup_rmdir() will wake him up. */ void cgroup_exclude_rmdir(struct cgroup_subsys_state *css); void cgroup_release_and_wakeup_rmdir(struct cgroup_subsys_state *css); /* |
21acb9caa trivial: fix wher... |
441 442 443 |
* Control Group subsystem type. * See Documentation/cgroups/cgroups.txt for details */ |
ddbcc7e8e Task Control Grou... |
444 445 446 |
struct cgroup_subsys { struct cgroup_subsys_state *(*create)(struct cgroup_subsys *ss, |
ffd2d8833 cgroup: clean up ... |
447 |
struct cgroup *cgrp); |
ec64f5154 cgroup: fix frequ... |
448 |
int (*pre_destroy)(struct cgroup_subsys *ss, struct cgroup *cgrp); |
ffd2d8833 cgroup: clean up ... |
449 |
void (*destroy)(struct cgroup_subsys *ss, struct cgroup *cgrp); |
be367d099 cgroups: let ss->... |
450 451 |
int (*can_attach)(struct cgroup_subsys *ss, struct cgroup *cgrp, struct task_struct *tsk, bool threadgroup); |
2468c7234 cgroup: introduce... |
452 453 |
void (*cancel_attach)(struct cgroup_subsys *ss, struct cgroup *cgrp, struct task_struct *tsk, bool threadgroup); |
ffd2d8833 cgroup: clean up ... |
454 |
void (*attach)(struct cgroup_subsys *ss, struct cgroup *cgrp, |
be367d099 cgroups: let ss->... |
455 456 |
struct cgroup *old_cgrp, struct task_struct *tsk, bool threadgroup); |
ddbcc7e8e Task Control Grou... |
457 |
void (*fork)(struct cgroup_subsys *ss, struct task_struct *task); |
d41d5a016 cgroup: Fix cgrou... |
458 459 |
void (*exit)(struct cgroup_subsys *ss, struct cgroup *cgrp, struct cgroup *old_cgrp, struct task_struct *task); |
ddbcc7e8e Task Control Grou... |
460 |
int (*populate)(struct cgroup_subsys *ss, |
ffd2d8833 cgroup: clean up ... |
461 462 |
struct cgroup *cgrp); void (*post_clone)(struct cgroup_subsys *ss, struct cgroup *cgrp); |
ddbcc7e8e Task Control Grou... |
463 |
void (*bind)(struct cgroup_subsys *ss, struct cgroup *root); |
e5991371e mm: remove cgroup... |
464 |
|
ddbcc7e8e Task Control Grou... |
465 466 |
int subsys_id; int active; |
8bab8dded cgroups: add cgro... |
467 |
int disabled; |
ddbcc7e8e Task Control Grou... |
468 |
int early_init; |
38460b48d cgroup: CSS ID su... |
469 470 471 472 473 |
/* * True if this subsys uses ID. ID is not available before cgroup_init() * (not available in early_init time.) */ bool use_id; |
ddbcc7e8e Task Control Grou... |
474 475 |
#define MAX_CGROUP_TYPE_NAMELEN 32 const char *name; |
999cd8a45 cgroups: add a pe... |
476 477 478 479 480 481 482 483 484 485 486 |
/* * Protects sibling/children links of cgroups in this * hierarchy, plus protects which hierarchy (or none) the * subsystem is a part of (i.e. root/sibling). To avoid * potential deadlocks, the following operations should not be * undertaken while holding any hierarchy_mutex: * * - allocating memory * - initiating hotplug events */ struct mutex hierarchy_mutex; |
cfebe563b cgroups: fix lock... |
487 |
struct lock_class_key subsys_key; |
ddbcc7e8e Task Control Grou... |
488 |
|
999cd8a45 cgroups: add a pe... |
489 490 491 492 493 |
/* * Link to parent, and list entry in parent's children. * Protected by this->hierarchy_mutex and cgroup_lock() */ struct cgroupfs_root *root; |
ddbcc7e8e Task Control Grou... |
494 |
struct list_head sibling; |
38460b48d cgroup: CSS ID su... |
495 496 497 |
/* used when use_id == true */ struct idr idr; spinlock_t id_lock; |
e6a1105ba cgroups: subsyste... |
498 499 500 |
/* should be defined only by modular subsystems */ struct module *module; |
ddbcc7e8e Task Control Grou... |
501 502 503 504 505 506 507 |
}; #define SUBSYS(_x) extern struct cgroup_subsys _x ## _subsys; #include <linux/cgroup_subsys.h> #undef SUBSYS static inline struct cgroup_subsys_state *cgroup_subsys_state( |
ffd2d8833 cgroup: clean up ... |
508 |
struct cgroup *cgrp, int subsys_id) |
ddbcc7e8e Task Control Grou... |
509 |
{ |
ffd2d8833 cgroup: clean up ... |
510 |
return cgrp->subsys[subsys_id]; |
ddbcc7e8e Task Control Grou... |
511 |
} |
dc61b1d65 sched: Fix PROVE_... |
512 513 514 515 516 517 518 519 520 521 522 523 524 |
/* * function to get the cgroup_subsys_state which allows for extra * rcu_dereference_check() conditions, such as locks used during the * cgroup_subsys::attach() methods. */ #define task_subsys_state_check(task, subsys_id, __c) \ rcu_dereference_check(task->cgroups->subsys[subsys_id], \ rcu_read_lock_held() || \ lockdep_is_held(&task->alloc_lock) || \ cgroup_lock_is_held() || (__c)) static inline struct cgroup_subsys_state * task_subsys_state(struct task_struct *task, int subsys_id) |
ddbcc7e8e Task Control Grou... |
525 |
{ |
dc61b1d65 sched: Fix PROVE_... |
526 |
return task_subsys_state_check(task, subsys_id, false); |
ddbcc7e8e Task Control Grou... |
527 528 529 530 531 532 533 |
} static inline struct cgroup* task_cgroup(struct task_struct *task, int subsys_id) { return task_subsys_state(task, subsys_id)->cgroup; } |
e885dcde7 cgroup_clone: use... |
534 535 |
int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *ss, char *nodename); |
697f41610 Task Control Grou... |
536 |
|
817929ec2 Task Control Grou... |
537 538 539 540 541 |
/* A cgroup_iter should be treated as an opaque object */ struct cgroup_iter { struct list_head *cg_link; struct list_head *task; }; |
d20a390a0 cgroups: fix cgro... |
542 543 |
/* * To iterate across the tasks in a cgroup: |
817929ec2 Task Control Grou... |
544 |
* |
b595076a1 tree-wide: fix co... |
545 |
* 1) call cgroup_iter_start to initialize an iterator |
817929ec2 Task Control Grou... |
546 547 548 549 550 |
* * 2) call cgroup_iter_next() to retrieve member tasks until it * returns NULL or until you want to end the iteration * * 3) call cgroup_iter_end() to destroy the iterator. |
31a7df01f cgroups: mechanis... |
551 |
* |
d20a390a0 cgroups: fix cgro... |
552 553 554 555 |
* Or, call cgroup_scan_tasks() to iterate through every task in a * cgroup - cgroup_scan_tasks() holds the css_set_lock when calling * the test_task() callback, but not while calling the process_task() * callback. |
817929ec2 Task Control Grou... |
556 |
*/ |
ffd2d8833 cgroup: clean up ... |
557 558 |
void cgroup_iter_start(struct cgroup *cgrp, struct cgroup_iter *it); struct task_struct *cgroup_iter_next(struct cgroup *cgrp, |
817929ec2 Task Control Grou... |
559 |
struct cgroup_iter *it); |
ffd2d8833 cgroup: clean up ... |
560 |
void cgroup_iter_end(struct cgroup *cgrp, struct cgroup_iter *it); |
31a7df01f cgroups: mechanis... |
561 |
int cgroup_scan_tasks(struct cgroup_scanner *scan); |
956db3ca0 hotplug cpu: move... |
562 |
int cgroup_attach_task(struct cgroup *, struct task_struct *); |
31583bb0c cgroups: fix API ... |
563 564 565 566 567 568 |
int cgroup_attach_task_all(struct task_struct *from, struct task_struct *); static inline int cgroup_attach_task_current_cg(struct task_struct *tsk) { return cgroup_attach_task_all(current, tsk); } |
817929ec2 Task Control Grou... |
569 |
|
38460b48d cgroup: CSS ID su... |
570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 |
/* * CSS ID is ID for cgroup_subsys_state structs under subsys. This only works * if cgroup_subsys.use_id == true. It can be used for looking up and scanning. * CSS ID is assigned at cgroup allocation (create) automatically * and removed when subsys calls free_css_id() function. This is because * the lifetime of cgroup_subsys_state is subsys's matter. * * Looking up and scanning function should be called under rcu_read_lock(). * Taking cgroup_mutex()/hierarchy_mutex() is not necessary for following calls. * But the css returned by this routine can be "not populated yet" or "being * destroyed". The caller should check css and cgroup's status. */ /* * Typically Called at ->destroy(), or somewhere the subsys frees * cgroup_subsys_state. */ void free_css_id(struct cgroup_subsys *ss, struct cgroup_subsys_state *css); /* Find a cgroup_subsys_state which has given ID */ struct cgroup_subsys_state *css_lookup(struct cgroup_subsys *ss, int id); /* * Get a cgroup whose id is greater than or equal to id under tree of root. * Returning a cgroup_subsys_state or NULL. */ struct cgroup_subsys_state *css_get_next(struct cgroup_subsys *ss, int id, struct cgroup_subsys_state *root, int *foundid); /* Returns true if root is ancestor of cg */ bool css_is_ancestor(struct cgroup_subsys_state *cg, |
0b7f569e4 memcg: fix OOM ki... |
602 |
const struct cgroup_subsys_state *root); |
38460b48d cgroup: CSS ID su... |
603 604 605 606 |
/* Get id and depth of css */ unsigned short css_id(struct cgroup_subsys_state *css); unsigned short css_depth(struct cgroup_subsys_state *css); |
e5d1367f1 perf: Add cgroup ... |
607 |
struct cgroup_subsys_state *cgroup_css_from_dir(struct file *f, int id); |
38460b48d cgroup: CSS ID su... |
608 |
|
ddbcc7e8e Task Control Grou... |
609 610 611 612 |
#else /* !CONFIG_CGROUPS */ static inline int cgroup_init_early(void) { return 0; } static inline int cgroup_init(void) { return 0; } |
b4f48b636 Task Control Grou... |
613 614 |
static inline void cgroup_fork(struct task_struct *p) {} static inline void cgroup_fork_callbacks(struct task_struct *p) {} |
817929ec2 Task Control Grou... |
615 |
static inline void cgroup_post_fork(struct task_struct *p) {} |
b4f48b636 Task Control Grou... |
616 |
static inline void cgroup_exit(struct task_struct *p, int callbacks) {} |
ddbcc7e8e Task Control Grou... |
617 618 619 |
static inline void cgroup_lock(void) {} static inline void cgroup_unlock(void) {} |
846c7bb05 Add cgroupstats |
620 621 622 623 624 |
static inline int cgroupstats_build(struct cgroupstats *stats, struct dentry *dentry) { return -EINVAL; } |
ddbcc7e8e Task Control Grou... |
625 |
|
d7926ee38 cgroups: Add an A... |
626 |
/* No cgroups - nothing to do */ |
31583bb0c cgroups: fix API ... |
627 628 629 630 631 |
static inline int cgroup_attach_task_all(struct task_struct *from, struct task_struct *t) { return 0; } |
d7926ee38 cgroups: Add an A... |
632 633 634 635 |
static inline int cgroup_attach_task_current_cg(struct task_struct *t) { return 0; } |
ddbcc7e8e Task Control Grou... |
636 637 638 |
#endif /* !CONFIG_CGROUPS */ #endif /* _LINUX_CGROUP_H */ |